Giter Site home page Giter Site logo

internetarchive / bookreader Goto Github PK

View Code? Open in Web Editor NEW
952.0 48.0 409.0 46.7 MB

The Internet Archive BookReader

Home Page: https://openlibrary.org/dev/docs/bookreader

License: GNU Affero General Public License v3.0

CSS 3.43% JavaScript 75.77% HTML 17.50% SCSS 3.31%
bookreader internetarchive ebooks hacktoberfest

bookreader's Introduction

Internet Archive BookReader

Build Status codecov

Disclaimer: BookReader v5 is currently in beta. It's stable enough for production use (and is what is being used on archive.org), but there will be some breaking changes in the next ~month or so to public BookReader APIs.

Internet Archive BookReader full logo

BookReader v5 interface screenshot

The Internet Archive BookReader is used to view books from the Internet Archive online and can also be used to view other books.

See live examples:

Demos

See BookReaderDemo directory. These can be tested by building the source files (make sure Node.js is installed):

npm run build

and starting a simple web server in the root directory:

npm run serve

And then open http://localhost:8000/BookReaderDemo/demo-simple.html.

Usage

Here is a short example.

// Create the BookReader object
var options = {
  data: [
    [
      { width: 800, height: 1200,
        uri: '//archive.org/download/BookReader/img/page001.jpg' },
    ],
    [
      { width: 800, height: 1200,
        uri: '//archive.org/download/BookReader/img/page002.jpg' },
      { width: 800, height: 1200,
        uri: '//archive.org/download/BookReader/img/page003.jpg' },
    ],
    [
      { width: 800, height: 1200,
        uri: '//archive.org/download/BookReader/img/page004.jpg' },
      { width: 800, height: 1200,
        uri: '//archive.org/download/BookReader/img/page005.jpg' },
    ]
  ],

  bookTitle: 'Simple BookReader Presentation',

  // thumbnail is optional, but it is used in the info dialog
  thumbnail: '//archive.org/download/BookReader/img/page014.jpg',

  // Metadata is optional, but it is used in the info dialog
  metadata: [
    {label: 'Title', value: 'Open Library BookReader Presentation'},
    {label: 'Author', value: 'Internet Archive'},
    {label: 'Demo Info', value: 'This demo shows how one could use BookReader with their own content.'},
  ],

  ui: 'full', // embed, full (responsive)

};
var br = new BookReader(options);

// Let's go!
br.init();

Architecture Overview

Starting at v5, BookReader introduces hybrid architecture that merges the core code written in jQuery closer to its evolution as a web component. As we march toward the future of BookReader as a web component, we are taking an Event Driven approach to connect the two together.

Approach:

  • Event driven
  • Control BR from the outside by using public methods
    • When BookNavigator reacts to BR's events, BookNavigator can directly control BR core using public functions.
      • As we continue to decouple the UI from drawing/calculating logic, these logical methods will become easier to spot, raise as a public method, and create unit tests for them.

Menu panels: Web Components via LitElement

BookReader's side navigation is powered by LitElement flavored web components.

Core: jQuery

BookReader's core functionality is in jQuery. This includes:

  • drawing & resizing the book and the various modes (1up, 2 page spread, gallery view)
  • the horizontal navigation
  • search API service
  • plugins

A peek in how to use/extend core functionality:

  • Properties
  • Plugins
    • A basic plugin system is used. See the examples in the plugins directory. The general idea is that they are mixins that augment the BookReader prototype. See the plugins directory for all the included plugins, but here are some examples:
      • plugin.autoplay.js - autoplay mode. Flips pages at set intervals.
      • plugin.chapters.js - render chapter markers
      • plugin.search.js - add search ui, and callbacks
      • plugin.tts.js - add tts (read aloud) ui, sound library, and callbacks
      • plugin.url.js - automatically updates the browser url
      • plugin.resume.js - uses cookies to remember the current page
      • plugin.vendor-fullscreen.js - replaces fullscreen mode with vendor native fullscreen
      • see plugin directory for current plugin files

Embedding BookReader in an iFrame

BookReader can be embedded within an <iframe>. If you use the IFrame Plugin inside the <iframe>, the reader will send notifications about changes in the state of the reader via window.postMessage(). The parent window can send messages of its own (also via window.postMessage()) and the IFrame Plugin will handle updating the reader to match.

Message Events

Fragment Change

The Fragment Change message is sent to the parent window when the embedded BookReader moves between pages/modes. When the <iframe> receives this message, it moves to the specified page/mode. The “fragment” is formatted in accordance with the BookReader URL spec.

{
  "type": "bookReaderFragmentChange",
  "fragment": "page/n1/mode/2up"
}

Development

(updates?)

The source JavaScript is written in ES6 (located in the src/js directory) and in ES5 (located in BookReader). npm run serve-dev starts an auto-reloading dev server, that builds js/css that has been edited at localhost:8000.

Until the next major version bump, we have to store the build files inside the repo to maintain backwards compatibility. Please DO NOT include these files in your PR. Anything in the BookReader/ directory should not be committed.

Developing icons

To see local icon package changes in bookreader, you'll need to install core-js into the icon package and link into bookreader.

Let's use icon-share as an example.

  1. Confirm your icon package is working properly in the iaux-icons demo
  2. Navigate to your icon package (iaux-icons/packages/icon-share) and run command: npm install core-js
    • You shouldn't need to commit any of these core-js changes
  3. From within your icon package directory run command: npm link
    • You can use the command npm ls -g to confirm your local package now appears in the registry
  4. Navigate to /bookreader and run command: npm link @internetarchive/icon-share
    • You can use the command npm ls |grep icon-share to confirm icon-share is now a link to your local directory
  5. You may now start a local server to see your changes by running command: npm run serve-dev

Releases

To version bump the repo and prepare a release, run npm version major|minor|patch (following semver), then (something like) git push origin HEAD --tags. It'll automatically update the version number where it appears, build the files, and ask you to update the CHANGELOG.

We release BookReader in-repo as tags & also as a node module @internetarchive/bookreader

Tests

We would like to get to 100% test coverage and are tracking our progress in this project: BookReader Fidelity

End to end tests

We also have end to end tests using Testcafe. We write tests for the repo itself and also for our use on archive.org. You can read about them in here. These are relatively easy to do, and a fantastic way of getting introduced to the wonders of BookReader. Check the project board for open tickets to work on. And if you don't see a test for something you spotted, feel free to make an issue.

To run all local end to end tests, run command: npm run test:e2e

To keep end to end test server on while developing, run command: npm run test:e2e:dev

Unit tests

We have unit tests and use Jest to run them. For mocks, we use Jest's internal mocking mechanism and Sinon to set spies.

To run all local unit tests, run command: npm run test

Ways to contribute

We can always use a hand building BookReader. Check out the issues and see what interests you. If you have an idea for an improvement, open an issue.

More info

Developer documentation: https://openlibrary.org/dev/docs/bookreader

Hosted source code: https://github.com/internetarchive/bookreader

IIIF (http://iiif.io) See BookReaderDemo/demo-iiif.html to see an example of how to load an IIIF manifest in BookReader.

Target Devices

Note that BookReader is a core part of Archive.org's mission of Universal Access to All Knowledge. Therefore, care must be taken to support legacy browsers. It should still work and be useable on old devices.

Areas for improvement

  • Change libraries to be NPM dependencies rather than included in the source code

See CHANGELOG.md for history of the project.

License

The source code license is AGPL v3, as described in the LICENSE file.

Other credits

The ability to test on multiple devices is provided courtesy of Browser Stack.

bookreader's People

Contributors

anandology avatar bfalling avatar cclauss avatar cdrini avatar dependabot-preview[bot] avatar dependabot[bot] avatar dualcnhq avatar giacomo-cgn avatar iisa avatar imskr avatar ishank-dev avatar janvimahajan14 avatar jbuckner avatar kkaushal-ongraph avatar latonv avatar mangtronix avatar mc2 avatar mekarpeles avatar nayamamarshe avatar nikolas avatar nsharma123 avatar pezvi avatar rajbot avatar rchrd2 avatar renovate-bot avatar renovate[bot] avatar sancodes avatar sbwhitt avatar shaneriley avatar yashs911 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bookreader's Issues

i18n

It would be great if the text that is output (e.g., tooltips for the buttons, zoom levels) could be changed without having to go into the BookReader.js file.

Also, there could be support for the reader to be in a right-to-left language. This would involve just a few changes in the css file and BookReader.js to adjust the order of the buttons and text at the top. Also, the graphic for the play button could be switched.

Text display

Hello,
Is there a way to display plain text rather than images with BookReader ? For instance to display transcriptions like does the BnF reader ?
Thanks,

New View: In 1 page mode, let the page fill the screen

Currently, we align the page either by a page's width or height.
This is optimized for 2 page view.

In 1 page view, there is no way for the page to dynamically fill its container according to its aspect ratio. We should have that ability

Display options in original aspect ratio

Dear who may concern.

I am a librarian in Seoul National University in South Korea.

Actually our library started to use IA Book Reader on 1 September, 2015 for viewing Old Book Digital Collection.

Sample collection is http://snu-primo.hosted.exlibrisgroup.com/82SNU:ALL:82SNU_ROSETTA3954084.

But we encountered one problem to view.

The most of images are displayed portrait basically. But in such case as some images are scanned in landscape, the viewer shows still portrait so that users hardly recognize the image.
We want all images to be displayed in original aspect ratio.

See the below link and fine from 28 to 31 pages)
http://rosetta-app.snu.ac.kr:1801/delivery/DeliveryManagerServlet?change_lng=en&dps_custom_att_1=staff&dps_pid=IE702491
(from 28 to 31 page)
You can view the original pages in new tab.

I know it is not a bug thing, but we need to configure or set up the Viewer.

Please give some idea.

Best Regards
Hye Young

Links back into IA & OL in top left corner

Brewster and George,

I am writing about a change in site navigation that happened a couple of months ago, where the user who comes to a book via Archive.org is sent to Open Library if they click on the book title link in the upper left corner. Previously, the link took the user back to the metadata page that they started on at the Archive. This has caused a lot of confusion I think. I am hearing from Xephyr our scanner at Brown that many of the users there are confused by the change – when they hit the link mentioned, they go to Open Library, which is fine, but then there is no obvious way (except for a very small link not well labeled) to get back to the Archive page for the book. When one is doing a search or working through a collection of books, this is lost if you have started at the Archive, as well as access to the generally deeper metadata on the Archive page. While I understand that there is a desire to get users into the Open Library, I don’t think we should do that at the expense of good and clear navigation. Perhaps we could have the link go back to Archive.org if the user came from there, or back to Open Library if they came from Open Library. Also, clearer and more obvious links to both places from the pages at the Archive and Open Library would help.

Best, David

David Rumsey


Mang - wondering if you can make the top line the link to archive.org record, and the "On openlibrary.org" a link back to OL?

<newui> BookReaderDemo bug

Error: jToolbar.find(".share").colorbox is not a function
Source File: file:///tmp/bookreader/BookReader/BookReader.js
Line: 3632

Add slider bar in "More" menu to increase brightness/contrast

From an email received by a user:
"It would be great If you could provide a Button or Slider that the users (we) would be able to adjust the brightness of the Book during reading."

We currently do have some settings to improve contrast, but I don't think they offer very granular control.

Desktop version?

@rchrd2 Do I understand it correctly that bookreader has either to be deployed on a server or used via your website and that there is no standalone desktop version?

Read Aloud & Magnify options buried on mobile

On mobile devices, users are even more likely (because of limited real estate) to want to invoke the read aloud option and or magnification setting.

re: read aloud -- Suggesting that either (a) it appears on the main UI or (b) its behavior changes so when you click it on mobile, instead of nesting/opening a second menu which says "Read Aloud" that this should be a button which just starts/stops the reader.

I might suggest just shrinking the book title and putting the +/- and read aloud on the upper right of the top-bar

Gracefully handle jp2 images generated without -Clevels

Please pardon any mistakes I make in the reporting of this issue, but I clearly barely know what I am talking about.

We are getting errors in the syslog and nginx log like the following:

Jan  6 22:42:20 ___.us.a___.org php5-www-priv[4177]: Kakadu Core Error:
Jan  6 22:42:20 .org php5-www-priv[4177]: Attempting to access a non-existent resolution level within some
Jan  6 22:42:20 .org php5-www-priv[4177]: tile-component.  Problem almost certainly caused by trying to discard more
Jan  6 22:42:20 .org php5-www-priv[4177]: resolution levels than the number of DWT levels used to compress a
Jan  6 22:42:20 .org php5-www-priv[4177]: tile-component.
Jan  6 22:42:20 .org php5-www-priv[4177]: pnmtojpeg: EOF / read error reading magic number

and:

2015/12/29 16:29:22 [error] 30935#0: *23910069 FastCGI sent in stderr: "PHP Warning: BookReader Processing Error: unzip -p '/2/items/cu31924051987323/cu31924051987323_jp2.zip' 'cu31924051987323_jp2/cu31924051987323_0005.jp2' | /petabox/sw/bin/kdu_expand -no_seek -quiet -reduce 4 -rotate 0 -region {0.000000,0.000000},{1.000000,1.000000} -i /dev/stdin -o /tmp/stdout.bmp | (bmptopnm 2>/dev/null) | pnmtojpeg -quality 75 -- in /var/cache/petabox/petabox/www/datanode/BookReader/BookReaderImages.inc.php on line 453

notes from h___ at archive dot org:

"I.e., when making a jp2 from a bilevel source image (all pixels fully white or fully black), a certain option has to be specified while making the jp2 in order to be able to use the "-reduce" option when reading the jp2. That option has been specified for jp2s that we've made from bilevel sources since Feb 2011.

In the case of the error Tim reports, the jp2s were provided to us (created by K..., during a scanning project at C...). Those jp2s were evidently created without using that special option, so the images can't be extracted from them at a reduced resolution, as BookReader attempts to do ("kdu_expand ... -reduce 4 ... ").

I'm not sure what we can do, short of modifying BookReader (for which no one currently at the Archive knows the code) to check first whether an image file can be reduced, and if not, extract at full resolution and reduce as part of the pipeline of conversion commands (i.e., insert a call to "pnmscale" just before the call to "pnmtojpeg")."

Activating mobile fullscreen changes current page

Bug In mobile

How to reproduce:

It happens with non-preview books as well
https://archive.org/details/10_PRINT_121114/page/n130

Expected behavior:

  • It stays on the same page when you enter fullscreen from mobile.

Hints:

  • It seems like maybe there's a conflict with detection of what page you're on, that updates the URL, and then changes the page you are on.
  • One consideration is to update the mobile fullscreen handling code so that it also calls the function to go to the page, just as a precaution.

Summary of current forks

I would like to contribute to this project, I have some features I would like to add. I'm just wondering which fork to work on, as there seem to be significant amounts of code that have not been merged into the project. aMoniker has added Notes and Annotations support, jgsmith has added a pluggin system. What is the consensus on these modifications, and where is the project heading? Currently I'm working with rrotters fork, as I need to use a recent version of JQuery.

Regards

David

Accessibility errors

Do you plan on making the Bookreader pass the WAVE accessibility tool? There is missing alt text, empty buttons and 1 contrast error.

screen shot 2018-05-26 at 8 01 20 am

Nav bar hides horizontal scroll bar in 2up mode

Situation: viewing a document in 2-up (facing page) mode, zoomed in such that all outside edges of the pages are outside the document viewable area.

Behaviour: if the Nav bar at the bottom is visible, it covers the horizontal scroll bar at the bottom. This scroll bar is the only way to move the viewable area around to view the far left or right areas of the current pages in 2-up mode.

Potential solution: show a second scroll bar above the nav bar when necessary, and remove it when the nav bar is closed.

jQuery version incompatibility

Any plans to get the plugin working with recent versions of the dependencies (primarily jQuery itself)? I've been unable to get it working on 1.11.x and am currently on 1.4.2, which is undesirable.

N.B. For others, incompatible jQuery version (even with migrate) results in a 'partially-loaded' plugin, which does not perform core actions such as display the book content.

Improve AudioBook support

Features we definitely want:

  • A. Support for non-English (allowing our 600k non-English books to be read)
  • B. Reduce bandwidth (generating mp3's is not accessible to all and slow to load)
  • C. Pause button
  • D. Playback speed controls
  • E. Backwards compatibility with Festival (where possible)

Implementation

  • Use Web Speech API (which provides options for many of these) where possible. Investigate how many of these features are also compatible Festival so we don't have to support two separate UIs if we have to fallback to Festival.
  • Update the UI to provide access to these options.

Plan

(NOT CEMENTED YET)

  1. #129: Refactor plugin.tts.js to include an abstract class, SpeechSynthesisEngine, and a concrete class FestivalSpeechEngine (necessary for E)
  2. #130: Edit plugin.tts.js to include a class BrowserSpeechEngine which implements SpeechSyntehsisEngine, and which is used on supported browser (Completes B)
  3. #132: BrowserSpeechEngine should choose voice based on book language (Completes A)
  4. UX Planning - Determine what we want the audiobook experience to be like. This will dictate the next steps. Results of this planning will be posted on/used to close #118 .

Motivation

Each year millions of patrons use the Internet Archive’s BookReader to explore book-formatted content. Many readers are surprised to learn Bookdeader has a read-aloud button which enables any book to be read out loud by a friendly robot voice. While for many this feature is icing on the cake, others with sight and print-disabilities depend on this feature to access our books. Our current read-aloud offering gets the job done, but there are a handful of major problems and opportunities for improvement. By switching from our current system, which uses Festival text-to-speech and generating mp3 files on the fly, to using the browser’s native Web Speech API, we could fix 5 major issues:

  • Generating mp3's is high bandwidth (not accessible to all users) and slow to load.
  • Our current read-aloud has no way to pause and resume your position!
  • There’s no UI for changing the playback speed of our Festival voices.
  • In most browsers, the Web Speech API voices are superior to our Festival voices.
  • Today, all our books are read with an English accent -- Web Speech API offers multiple voices and the ability for books to be read in their native language.

We have a working prototype of our books being read using the Web Speech API. The next step is to integrate the Web Speech API into our native Internet Archive BookReader, and we already have a start on the feature/native-audioreader branch!

Related to #58

Automatic sizing?

I'm trying to do a basic Bookreader implementation for sets of images that may not be the same size across a given grouping. Is there currently an easy way to set the getPageWidth and getPageHeight functions so that they automatically conform to the size of an image?

Page numbering confusion

The docs mention using 1 based page numbers in URLs page/1 instead of 0 based page/n0, but it does not seem to work.
https://openlibrary.org/dev/docs/bookurls

The code tries to parse URLs that start with n then falls back to a custom page numbering.
BookReader/BookReader.js#L4502
BookReader/BookReader.js#L4515

Custom page numbers that are never actually implemented default to null, which later falls back to n0 numbering, which is redundant.
BookReaderIA/datanode/BookReaderJSIA.php#L277
BookReaderIA/datanode/BookReaderJSIA.php#L349
BookReaderIA/datanode/BookReaderJSIA.php#L549

The issue seems to be that the book meta data never contains custom page numbers.
The long term solution would be to actually provide this metadata (probably out of the scope of this repo).
A short term solution would be to fall back to page/1 or page/p1 style 1 based indexed page numbers when the custom page numbers are null.

Context:
This ambiguity recently caused some confusion when trying to coordinate a transcription effort. XioNYC/StarRaiders#18

Cover image fails for Magic-Mouse-2010-12

http://www.archive.org/download/Magic-Mouse-2010-12/page/cover_thumb.jpg redirects to http://ia600309.us.archive.org/BookReader/BookReaderPreview.php?id=Magic-Mouse-2010-12&itemPath=%2F31%2Fitems%2FMagic-Mouse-2010-12&server=ia600309.us.archive.org&page=cover_thumb.jpg and returns this:

Error serving request:
Image error: Problem processing image - command failed:
unzip -p '/31/items/Magic-Mouse-2010-12/Magic-Mouse-Teardown_jp2.zip' 'Magic-Mouse-Teardown_jp2/Magic-Mouse-Teardown_0000.jp2' | /petabox/sw/bin/kdu_expand -no_seek -quiet -reduce 5 -rotate 0 -region {0.000000,0.000000},{1.000000,1.000000} -i /dev/stdin -o /tmp/stdout.bmp | (bmptopnm 2>/dev/null) | pnmtojpeg -quality 75

Debugging information:
#0 /var/www/BookReader/BookReaderImages.inc.php(488): BookReaderImages->BRfatal('Problem process...')
#1 /var/www/BookReader/BookReaderImages.inc.php(208): BookReaderImages->serveRequest(Array)
#2 /var/www/BookReader/BookReaderPreview.php(46): BookReaderImages->serveLookupRequest(Array)
#3 {main}

Pages Appear Blank After Borrowing Book

A patron explains

I'm having trouble reading books that need to be "borrowed" from the Open Library site using the online reader. After choosing "Borrow It" none of the images will load on the screen. I just get a beige rectangle with a broken image icon in the upper left corner. I've been able to read these books in the past, but not lately. I have no problem using the reader with other texts on the archive.org site that don't need to be borrowed.

automatically go to page via javascript

I'm building a page containing a menu on the left and the book reader on the right.

The menu, which contains a list of chapters, must be the index of the works to be displayed.

The reader on the left simply has to view the selected work from the menu.

Is it possible to javascript jump directly to the page selected by the user from the menu on the left?

Error from search backend not shown

When the search backend returns an error, the bookreader does not show the returned error message to the user, and instead shows "No matches were found."

When submitting an empty string to the search backend, it returns {... error: 'You must enter a query.' ...}, but we don't show that to the user.

Upgrading jquery to 3.x

Hi,

The viewer is great but one of its plugins has a security vulnerability. Could you make the search plugin to work with JQuery 3.x? All prior versions of JQuery are no longer supported and all of them reportedly have XSS vulnerabilities. Conversion guidance can be found at http://blog.jquery.com/.

Thanks.

"Mark for TOC" (feature request)

Most books on the Internet Archive don't have a table of contents. On the OpenLibrary page for the specific book anyone can add one, but figuring out page numbers and remembering them together with titles can be a hassle (e.g. when page numbers are invisible or missing).

I imagine and hereby propose a button or link in the BookReader that marks a page as the start of a new chapter or section. When the button or link is clicked, a text field could ask for the title of the chapter and if applicable the nesting level of the section (chapter, section, subsection, subsubsection / h1, h2, h3).

need a better loading message

Before init() is called, the main bookreader div displays an 'x'. This should probably say something like 'loading' or 'you need javascript'. The loading message could also provide a link to a format that doesn't require javascript, such as the pdf.

IA: sync changes from IA repo to github

Changes have been made to the bookreader code in the internal IA svn repo, by many different people, mostly for https support. These changes should be copied to the git repo.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.