theupdateframework / pip Goto Github PK
View Code? Open in Web Editor NEWThis project forked from pypa/pip
A tool for installing and managing Python packages
Home Page: www.pip-installer.org
License: Other
This project forked from pypa/pip
A tool for installing and managing Python packages
Home Page: www.pip-installer.org
License: Other
Will TUF be merged into pip?
Or this project stalled?
What do you think?
Suppose you use our version of pip to install a package from PyPI. This package lists as its requirements the packages in the list ["twisted", "flask"]. Our pip would fail to install the required packages "twisted" and "flask" because it could not find them in our metadata. How did this happen?
Asking PyPI yields a clue:
$ curl -I https://pypi.python.org/simple/twisted/
HTTP/1.1 301 Moved Permanently
Date: Wed, 14 Aug 2013 19:03:20 GMT
Location: /simple/Twisted
Cache-Control: max-age=86400, public
Strict-Transport-Security: max-age=31536000
Accept-Ranges: bytes
Age: 82442
$ curl -I https://pypi.python.org/simple/flask/
HTTP/1.1 301 Moved Permanently
Date: Wed, 14 Aug 2013 19:03:41 GMT
Location: /simple/Flask
Cache-Control: max-age=86400, public
Strict-Transport-Security: max-age=31536000
Accept-Ranges: bytes
Age: 84616
pip without TUF is redirected by PyPI to the correct package, but pip with TUF interposition does not have this luxury.
I have a simple patch for this problem that works by simply issuing a (non-interposed) HEAD request to PyPI to resolve the "true" names of requirements. It makes the problem largely go away (except in cases where PyPI itself does not know about the package or there is some server-side error). I may commit it later to work around this problem, but we will certainly need a better long term solution.
pip should connect by SSL to the TUF-secured PyPI mirror.
Our version of pip needs to be able to handle Unicode characters. Presently, it may fail because we may try to find targets without being careful about comparing Unicode strings with non-Unicode strings.
@Vladdd noted that PyPI may change its requirements for package names[1, 2]. However, TUF itself would still need to generally handle Unicode characters.
Our version of pip does not interpose for PyPI URLs of the form "https://pypi.python.org/simple/PACKAGE/VERSION". A few examples:
[2013-08-14 15:15:12,913 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Flask/0.9
[2013-08-14 15:15:14,064 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Flask-WTF/0.8
[2013-08-14 15:15:14,879 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Flask-SQLAlchemy/0.16
[2013-08-14 15:15:15,726 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/tornado/2.4
[2013-08-14 15:59:47,337 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Parlance/1.4.1
[2013-08-14 16:00:04,922 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/caldav/0.1.4
[2013-08-14 16:06:41,226 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/html5lib/0.95
[2013-08-14 16:06:46,413 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/1.2.3
[2013-08-14 16:06:47,243 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests-oauthlib/0.3.2
[2013-08-14 16:10:30,147 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pytz/2012j
[2013-08-14 16:13:10,734 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/lxml/3.1.0
[2013-08-14 16:14:42,708 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/PyYAML/3.10
[2013-08-14 16:14:44,094 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Twisted/12.0.0
[2013-08-14 16:14:46,760 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/certifi/0.0.8
[2013-08-14 16:14:47,459 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/chardet/1.0.1
[2013-08-14 16:14:48,168 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/leftronic/1.4
[2013-08-14 16:14:48,932 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pyOpenSSL/0.13
[2013-08-14 16:14:49,703 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/0.11.1
[2013-08-14 16:14:50,597 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/zope.interface/3.8.0
[2013-08-14 16:16:06,485 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Pylons/0.9.7
[2013-08-14 16:16:12,413 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.what/1.0.8
[2013-08-14 16:16:13,216 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.who.plugins.sa/1.0rc2
[2013-08-14 16:16:14,009 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.what-pylons/1.0
[2013-08-14 16:16:14,832 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.what.plugins.sql/1.0rc4
[2013-08-14 16:16:15,683 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.who-friendlyform/1.0.4
[2013-08-14 16:16:16,475 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.who-testutil/1.0
[2013-08-14 16:16:23,112 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/solrpy/0.9.3
[2013-08-14 16:19:19,373 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/GitPython/0.3.2.RC1
[2013-08-14 16:22:53,279 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/repoze.who/1.0.18
[2013-08-14 16:23:02,949 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/WebOb/1.1.1
[2013-08-14 16:23:43,689 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/thrift/0.9.0
[2013-08-14 16:31:53,921 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/sleekxmpp/1.1.11beta
[2013-08-14 16:33:07,044 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/redis/2.4.12
[2013-08-14 16:34:40,389 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/suds/0.4
[2013-08-14 16:34:41,373 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/lxml/3.0
[2013-08-14 16:34:49,558 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Distutils2/1.0a3
[2013-08-14 16:36:42,384 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/1.2.0
[2013-08-14 16:42:00,897 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/mbutil/0.1.0
[2013-08-14 16:42:23,177 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pyparsing/1.5.7
[2013-08-14 16:44:36,412 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-openid/2.2.5
[2013-08-14 16:45:10,644 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Werkzeug/0.8.3
[2013-08-14 16:45:11,658 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Flask/0.9
[2013-08-14 16:45:12,609 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Jinja2/2.7
[2013-08-14 16:49:31,780 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/argh/0.23.2
[2013-08-14 16:49:32,470 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/docker-py/0.0.4
[2013-08-14 16:52:08,398 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-gcm/0.1.4
[2013-08-14 16:52:17,664 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Fabric/1.6.0
[2013-08-14 16:52:25,915 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/0.14.2
[2013-08-14 16:54:26,408 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/trytond_health/2.0.0
[2013-08-14 16:58:11,935 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/1.2.3
[2013-08-14 16:58:12,845 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/lxml/3.2.1
[2013-08-14 16:58:14,359 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/measurement/1.3
[2013-08-14 16:58:15,832 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/six/1.3.0
[2013-08-14 16:58:16,557 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/sympy/0.7.3
[2013-08-14 17:01:40,465 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/google-api-python-client/1.0
[2013-08-14 17:01:42,089 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/oauth2client/1.0
[2013-08-14 17:02:01,578 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/BeautifulSoup/3.2.0
[2013-08-14 17:03:47,797 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/xlwt/0.7.2
[2013-08-14 17:03:48,408 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/xlrd/0.7.1
[2013-08-14 17:13:42,867 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-commons/0.7
[2013-08-14 17:14:43,339 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Fabric/1.5.1
[2013-08-14 17:14:58,309 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/SQLAlchemy/0.7.8
[2013-08-14 17:17:01,010 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/redis/2.7.2
[2013-08-14 17:18:44,614 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/HNComments/0.1.1
[2013-08-14 17:18:45,518 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/1.0.4
[2013-08-14 17:22:37,731 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/cacheobj/0.8.2
[2013-08-14 17:25:48,699 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/BlazeUtils/dev
[2013-08-14 17:30:57,290 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/Markdown/2.2.1
[2013-08-14 17:30:58,061 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-wordpress-xmlrpc/2.2
[2013-08-14 17:31:23,988 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/sockjs-tornado/1.0.0
[2013-08-14 17:33:51,274 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-twitter/0.8.2
[2013-08-14 17:33:52,149 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/feedparser/5.1.2
[2013-08-14 17:38:31,897 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/beautifulsoup4/4.1.3
[2013-08-14 17:38:32,747 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/html2text/3.200.3
[2013-08-14 17:38:33,572 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/nltk/2.0.4
[2013-08-14 17:43:02,784 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-dateutil/1.5
[2013-08-14 17:44:09,425 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/0.14.2
[2013-08-14 17:44:29,928 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/eventlet/0.12.1
[2013-08-14 17:44:30,932 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/iso8601/0.1.4
[2013-08-14 17:44:31,725 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/kombu/2.5.7
[2013-08-14 17:44:39,174 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/httplib2/0.7.4
[2013-08-14 17:44:40,073 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/phpserialize/1.3
[2013-08-14 17:52:48,212 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/docopt/0.6.1
[2013-08-14 17:55:26,352 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-dateutil/1.5
[2013-08-14 17:55:59,699 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/MiniMock/1.2.7
[2013-08-14 17:56:31,459 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pika/0.9.9
[2013-08-14 17:56:32,154 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/APScheduler/2.1.0
[2013-08-14 17:56:32,913 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pytz/2012j
[2013-08-14 17:56:35,569 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/hashlib/20081119
[2013-08-14 17:56:36,606 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/1.1.0
[2013-08-14 17:56:37,449 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/configparser/3.3.0r2
[2013-08-14 17:59:35,087 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pymongo/2.5.0
[2013-08-14 18:03:22,333 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/django-model-utils/1.4.0
[2013-08-14 18:05:11,912 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pyparsing/1.5.7
[2013-08-14 18:06:55,900 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/hive-thrift-py/0.0.1
[2013-08-14 18:10:50,729 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/zope.interface/4.0.1
[2013-08-14 18:10:51,707 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/zope.component/4.0.0
[2013-08-14 18:10:52,735 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/zope.configuration/4.0.0
[2013-08-14 18:14:22,891 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/couleur/0.5.0
[2013-08-14 18:14:24,213 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/misaka/1.0.2
[2013-08-14 18:14:25,145 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-termstyle/0.1.10
[2013-08-14 18:14:26,613 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/PyYAML/3.10
[2013-08-14 18:35:14,471 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-magic/0.4.3
[2013-08-14 18:35:15,132 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/chardet/2.1.1
[2013-08-14 18:36:48,718 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-dateutil/1.5
[2013-08-14 18:41:58,775 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/docopt/0.5.0
[2013-08-14 18:41:59,577 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/watchdog/0.6.0
[2013-08-14 18:42:00,723 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/nose/1.2.1
[2013-08-14 18:43:54,136 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pyzmq/2.2.0
[2013-08-14 18:45:11,480 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/tornado/3.0.1
[2013-08-14 18:49:40,310 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/fudge/1.0.3
[2013-08-14 18:50:21,231 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/requests/1.2.0
[2013-08-14 18:50:53,295 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/ecohydrolib/1.1
[2013-08-14 18:50:56,182 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pyproj/1.9.2
[2013-08-14 18:51:11,256 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/PySimpleSOAP/1.05a
[2013-08-14 18:51:15,410 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/python-dateutil/2.1
[2013-08-14 18:51:17,096 UTC] [tuf.interposition] [WARNING][warn:[email protected]] No updater or interposition for url=https://pypi.python.org/simple/pytz/2012j
I do not yet know why pip is issuing requests of this form, but they do not seem to pose a security risk.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.