kimchi-project / kimchi Goto Github PK
View Code? Open in Web Editor NEWAn HTML5 management interface for KVM guests
Home Page: https://github.com/kimchi-project/kimchi/releases/latest
License: Other
An HTML5 management interface for KVM guests
Home Page: https://github.com/kimchi-project/kimchi/releases/latest
License: Other
Test kimchi on SUSE11 SP2, just one VM on the host:
Start the VM using virsh and start the kimchi:
PYTHONPATH=./src/burnet python bin/bunetd
If the VM is running, on UI the VM list is empty.
Using REST request, the GET request for /vms and /storagepools will wait for a long while and return 0.
If shut-off the VM before kimchi start, the UI will show it and vms and storagepools request will return expected result.
Environment
IBM RH6 Open Client
Recreate steps
PYTHONPATH=./src python bin/burnetd --test
Expected Result:
Actual result
cmd = "qemu-system-%s" % platform.machine()
does not find qemu which is at
sudo virsh capabilities | grep emulator
<emulator>/usr/libexec/qemu-kvm</emulator>
<emulator>/usr/libexec/qemu-kvm</emulator>
.....
sudo PYTHONPATH=./src python bin/burnetd --test
Traceback (most recent call last):
File "bin/burnetd", line 57, in <module>
sys.exit(main(sys.argv[1:]))
File "bin/burnetd", line 54, in main
burnet.server.main(options)
File "/home/rak/development/burnet/src/burnet/server.py", line 97, in main
srv = Server(options)
File "/home/rak/development/burnet/src/burnet/server.py", line 84, in __init__
model_instance = mockmodel.get_mock_environment()
File "/home/rak/development/burnet/src/burnet/mockmodel.py", line 288, in get_mock_environment
model = MockModel()
File "/home/rak/development/burnet/src/burnet/mockmodel.py", line 37, in __init__
p = subprocess.Popen(args, close_fds=True)
File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
errread, errwrite)
File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
On RHEL6.3, can not show the display of guest VM by noVNC.
The noVNC viewer(firefox) stopped on "starting VNC handshake".
The burnet log:
WebSocket server settings:
- Listen on :38982
- Flash security policy server
- No SSL/TLS support (no cert file)
- proxying from :38982 to localhost:5900
::1 - - [17/Jun/2013:13:18:32] "GET /vms/vm-ubuntu HTTP/1.1" 200 215 "http://localhost:8000/dev-ui.html" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.5) Gecko/20120601 Firefox/10.0.5"
::1 - - [17/Jun/2013:13:18:32] "GET /vnc_auto.html?port=38982&logging=debug HTTP/1.1" 200 1638 "http://localhost:8000/dev-ui.html" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.5) Gecko/20120601 Firefox/10.0.5"
1: 127.0.0.1: Plain non-SSL (ws://) WebSocket connection
1: 127.0.0.1: Version hybi-08, base64: 'False'
1: 127.0.0.1: Path: '/websockify'
1: connecting to: localhost:5900
Kimchi users will want to the capability to open an SSL encrypted port in addition to or instead of the unencrypted port we have today.
I do the the following step as README says:
$ sudo yum install python-cherrypy python-cheetah \
python-imaging python-polib
$ sudo python setup.py install
$ sudo burnetd --host=0.0.0.0
When I connect my browser to localhost:8000, it does not display the screen as README shows.
It displays a warning:
"
Oops! It looks like I am running from a source tree and you forgot to build! Please run the following command and reload this page:
python setup.py build
"
Then
$ sudo python setup.py build
it still show this warning.
That's too bad, the warning misleads me.
When a user clicks a button on a VM tile, the button does not provide any feedback that it has been clicked. In order to reassure the user that the click happened and the UI is working to satisfy the request, we should animate the button to show it has been pressed and released.
1 add template page
2 "select the ISO you'd like to use to create a template" textfield ,put the iso path and then click in the outside of the textfield.
3 the "Create" button shows.
I think this is not a good User-Centered design.
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Message: Object doesn't support this property or method
Line: 263
Char: 13
Code: 0
URI: http://9.181.129.157:8000/js/burnet.min.js
Currently the UI source code has poorly indented code with mixed tabs and spaces. The kimchi project policy is to have each indent level use 4 spaces. Tabs are not allowed at all. We need to go through all files and fix the whitespace issues. Unfortunately this is a disruptive activity since it will cause merge conflicts for other patches so we can defer it until the time is right.
When I swith between the 2 tabs 'Guests' and 'Templates' on design UI.
The whole page will float from left to right,vice verse.
Tested on Chrome and Firefox.
I think there is a problem about padding control in CSS.
Steps to reproduce:
Expected result:
A popup window will be shown to enter the template values
Actual result:
Any window is open
In the console I can see the following traceback:
Request Headers:
REFERER: http://192.168.122.74:8000/
HOST: 192.168.122.74:8000
CONNECTION: keep-alive
Remote-Addr: 192.168.122.1
ACCEPT: text/html, /; q=0.01
USER-AGENT: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0
X-REQUESTED-WITH: XMLHttpRequest
ACCEPT-LANGUAGE: en-us,en;q=0.5
ACCEPT-ENCODING: gzip, deflate
[03/Jul/2013:14:04:48] HTTP Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/cherrypy/_cprequest.py", line 656, in respond
response.body = self.handler()
File "/usr/lib/python2.6/site-packages/cherrypy/lib/encoding.py", line 188, in call
self.body = self.oldhandler(_args, *_kwargs)
File "/usr/lib/python2.6/site-packages/cherrypy/_cpdispatch.py", line 34, in call
return self.callable(_self.args, *_self.kwargs)
File "/root/kimchi/src/burnet/root.py", line 42, in default
return template.render(page, {'hostname': 'localhost'})
File "/root/kimchi/src/burnet/template.py", line 88, in render
return Template(file=filename, searchList=params).respond()
File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 1257, in init
self._compile(source, file, compilerSettings=compilerSettings)
File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 1551, in _compile
keepRefToGeneratedCode=True)
File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 737, in compile
settings=(compilerSettings or {}))
File "/usr/lib64/python2.6/site-packages/Cheetah/Compiler.py", line 1575, in init
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 2261: ordinal not in range(128)
usecase:
in mock backend
expected:
actual:
blank slot in the column
noVNC is supported in Kimchi by launching an external program (websockify.py) to wrap an existing qemu vnc connection with web sockets (needed by noVNC). This works but has a number of disadvantages:
Anthony proposed an idea to support websocket proxying directly from the cherrypy server on its given port. The noVNC code would be directed to a URL such as: ws://:8000/vms/vm-1/vnc. Cherrypy would switch to a websockets handler to service connections at this URL.
When the unit tests were launched by ./run_test.sh, the following error happened randomly. while in most times, the test case result was good.
FAIL: test_object_store_threaded (ModelTests.ModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/tmp/burnet-debugreports/tests/ModelTests.py", line 232, in test_object_store_threaded
self.assertEquals(10, len(store._connections.keys()))
AssertionError: 10 != 7
1 start a virtual client
2 Click the VNC button when the windows screen shows
3 browser :http://localhost:8000/vms/Virtual_Client_for_Linux_Windows_7-KVM/connect 500 Internal Server Error
File "/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py", line 188, in call
self.body = self.oldhandler(_args, *_kwargs)
File "/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py", line 34, in call
return self.callable(_self.args, *_self.kwargs)
File "/home/zhonghg/git/2122/src/burnet/controller.py", line 94, in wrapper
raise cherrypy.HTTPError(500, "Operation Failed: '%s'" % msg)
HTTPError: (500, "Operation Failed: 'Unable to find VNC port in Virtual_Client_for_Linux_Windows_7-KVM'"
When IE8 was used to access my Kimchi server, the following errors were displayed. However, Firefox 17 can access the same server properly.
406 Not Acceptable
URI not available in preferred format.
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py", line 188, in call
self.body = self.oldhandler(_args, *_kwargs)
File "/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py", line 34, in call
return self.callable(_self.args, *_self.kwargs)
File "/home/tmp/kimchi-origin/src/burnet/controller.py", line 140, in index
return self.get()
File "/home/tmp/kimchi-origin/src/burnet/root.py", line 37, in get
return self.default('burnet-ui.html')
File "/home/tmp/kimchi-origin/src/burnet/root.py", line 42, in default
return template.render(page, {'hostname': 'localhost'})
File "/home/tmp/kimchi-origin/src/burnet/template.py", line 95, in render
raise cherrypy.HTTPError(406)
HTTPError: (406, None)
Powered by CherryPy 3.2.2
We currently have an internationalized web application but no way for users to change the language :) In the Development UI we just use a select box populated with the available languages. We should consider adding such a box to the Main UI as well.
Need to restrict user's input by validating forms before submitting it.
I think the template name is important when create a template and so as the description , but our design can not input the name of template.
1 when the template name chars more than 14, the chars will crossed nomal boundaries.
./run_tests_RHEL6.sh: line 24: unit2: command not found
Tried to install unit2 module with easy_install and yum repositories.
tmp@rhels64-burnet tests]$ sudo easy_install install unittest2
Reading http://pypi.python.org/simple/install/
Download error: [Errno -3] Temporary failure in name resolution -- Some packages may not be found!
tmp@rhels64-burnet tests]$ sudo yum install python-unittest2
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Setting up Install Process
No package python-unittest2 available.
Error: Nothing to do
[tmp@rhels64-burnet tests]$
When we read the src/burnet/mockmodel.py code.
We find a bug in the commit:
$ git show 19be36fc40daa09641a948f077d64979067494bf
"Open vnc port in MockModel"
it can reproduce 100% by the follow step on Fedora:
$ qemu-system-x86_64 -vnc : 0
$ sudo PYTHONPATH=src ./bin/burnetd --host "0.0.0.0" --port 8000 --test
usage percentage of storage is constant.
Adam suggests to look at the capacity and allocated fields of the primary storage volume.
When 'make redhat' or 'make suse' rpm package, error report:
Building for target noarch
error: Failed build dependencies:
python-polib is needed by burnet-0.0.1-1.el6.noarch
make: *** [redhat_rpm] Error 1
but no python-polib package for RHEL6.3 and SLES11can be found, but I have installed the polib package by python setup tool.
The dependencies should be moved into setup.py instead of the spec file ?
Expected:
A new VM named "虚拟机-CentOS" created.
Executed:
Error occurred: Failed to create vm.
Request Payload:
name: "虚拟机-CentOS"
template: "/templates/CentOS-6.4-x86_64"
Response:
Status Code:500 Internal Server Error:
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cprequest.py", line 656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/lib/encoding.py", line 188, in call
self.body = self.oldhandler(_args, *_kwargs)
File "/usr/lib/python2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cpdispatch.py", line 34, in call
return self.callable(_self.args, *_self.kwargs)
File "/usr/lib/python2.7/site-packages/burnet/controller.py", line 232, in index
return self.create(_args)
File "/usr/lib/python2.7/site-packages/burnet/controller.py", line 192, in create
name = create(_args)
File "/usr/lib/python2.7/site-packages/burnet/model.py", line 218, in vms_create
pool.createXML(v['xml'], 0)
File "/usr/lib64/python2.7/site-packages/libvirt.py", line 2261, in createXML
ret = libvirtmod.virStorageVolCreateXML(self._o, xmldesc, flags)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 42-44: ordinal not in range(128)
Load Kimchi
Open firebug or equivalent debugger to the network tab
Click the Kimchi Templates tab
Note the 404 error in the debugger loading
There is a extra import statement in objectstore.py outside the try/expect block.
from collections import OrderedDict
try:
from collections import OrderedDict
except ImportError:
from ordereddict import OrderedDict
The code still contains many references to the incubator project name 'burnet'. This work includes:
The designed UI display that VM is shutdown.
I double click the button to start VM, it reports an error "Failed to create VM"
but not report the reason of failed. I check the burnet.log, it tells me "domain is already running"
I check the /var/log/burnet/burnet.log
[14/Jun/2013:18:30:59] HTTP
Request Headers:
REFERER: http://fsh-kimchi-ubuntu12.10:8000/
Remote-Addr: 10.8.0.2
Content-Length: 0
USER-AGENT: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101
Firefox/13.0
CONNECTION: keep-alive
PRAGMA: no-cache
X-REQUESTED-WITH: XMLHttpRequest
DNT: 1
HOST: fsh-kimchi-ubuntu12.10:8000
CACHE-CONTROL: no-cache
ACCEPT: application/json, text/javascript, */*; q=0.01
ACCEPT-LANGUAGE: zh-cn,en-us;q=0.7,en;q=0.3
Content-Type: application/json
ACCEPT-ENCODING: gzip, deflate
[14/Jun/2013:18:30:59] HTTP
Request Headers:
REFERER: http://fsh-kimchi-ubuntu12.10:8000/
Remote-Addr: 10.8.0.2
Content-Length: 0
USER-AGENT: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101
Firefox/13.0
CONNECTION: keep-alive
PRAGMA: no-cache
X-REQUESTED-WITH: XMLHttpRequest
DNT: 1
HOST: fsh-kimchi-ubuntu12.10:8000
CACHE-CONTROL: no-cache
ACCEPT: application/json, text/javascript, */*; q=0.01
ACCEPT-LANGUAGE: zh-cn,en-us;q=0.7,en;q=0.3
Content-Type: application/json
ACCEPT-ENCODING: gzip, deflate
[14/Jun/2013:18:30:59] HTTP Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/cherrypy/_cprequest.py", line
656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py", line
188, in __call__
self.body = self.oldhandler(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py", line
34, in __call__
return self.callable(*self.args, **self.kwargs)
File "/usr/lib/python2.7/dist-packages/burnet/controller.py", line 75,
in wrapper
f(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/burnet/controller.py", line 241,
in start
getattr(self.model, model_fn(self, 'start'))(self.ident)
File "/usr/lib/python2.7/dist-packages/burnet/model.py", line 221, in
vm_start
dom.create()
File "/usr/lib/python2.7/dist-packages/libvirt.py", line 620, in create
if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirtError: Requested operation is not valid: domain is already running
[14/Jun/2013:18:30:59] HTTP Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/cherrypy/_cprequest.py", line
656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/dist-packages/cherrypy/lib/encoding.py", line
188, in __call__
self.body = self.oldhandler(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/cherrypy/_cpdispatch.py", line
34, in __call__
return self.callable(*self.args, **self.kwargs)
File "/usr/lib/python2.7/dist-packages/burnet/controller.py", line 75,
in wrapper
f(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/burnet/controller.py", line 241,
in start
getattr(self.model, model_fn(self, 'start'))(self.ident)
File "/usr/lib/python2.7/dist-packages/burnet/model.py", line 221, in
vm_start
dom.create()
File "/usr/lib/python2.7/dist-packages/libvirt.py", line 620, in create
if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirtError: Requested operation is not valid: domain is already running
Scenario:
Expected result:
Actual result:
Variation:
Because it may take some time for a web browser to download the screenshot images sometimes a VM tile is rendered with a partial screenshot. Additionally, when the image is refreshed, it does not appear smooth. To fix this we must load the screenshot images in the background and display them via a callback after they have been fully downloaded. Fixing this properly will require us to change the way VM tiles are refreshed. Instead of deleting all tiles and rebuilding them on each refresh, we will need to update the existing tiles (deleting any that should no longer appear and adding any new VMs since the last refresh).
First time to make the burnet package. Setup.py just generates i18n files,
burnet.min.js and theme-default.min.css. But Setup.py does not not copy
them to the build directory.
when create a VM failed, Design UI just report "Failed to create VM".
No other more information.
So we need to check the burnet log. It tell us the detail
it is better that messageField show the detail failure.
So the design UI users can easily find the reason of failure.
Adam suggested as follow:
We need to do a better job with error reporting.
When a REST operation fails, we will return a 4xx-5xx status code. The
body of the response is an error message and stack trace. You could
write a wrapper function in the REST API that wraps all API calls and
checks for errors. When one is found, display the first line of the
response body in the error bar of the browser.
How to reproduce:
the log of browser:
Unexpected query string parameters: name, template
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py", line 188, in call
self.body = self.oldhandler(_args, *_kwargs)
File "/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py", line 40, in call
raise sys.exc_info()[1]
HTTPError: (404, 'Unexpected query string parameters: name, template')
the log of server:
10.8.0.2 - - [10/Jul/2013:08:16:01] "GET /?name=ubuntu13.10&template=%2Ftemplates%2Fmyubuntu HTTP/1.1" 404 1220 "http://192.168.123.56:8000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
10.8.0.2 - - [10/Jul/2013:08:16:03] "GET /favicon.ico HTTP/1.1" 200 1406 "" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
1 From the Template page
2 click the "Add Template " button
3 Select "Select a specific ISO to create a template"
4 Open the "fire bug "panel
5 "ReferenceError:init_iso_directory_box is not defined"
Scenario
Expected result:
Actual result
Memory may be more tricky.
Usually we need a guest agent for this but Burnet does not require one.
Adam suggested to see if libvirt provides a useful API.
Scenario:
Expected result:
Actual result:
Due to libvirt limitations, attempting to delete a VM that is running will fail. To resolve this we should take one of two actions:
Update the backend so that the vm_delete operation calls libvirt's destroy and undefine operations together.
Grey out the delete button in the UI when the VM is powered on AND add a useful error to the REST API if delete is attempted on a running VM.
Burnet assumes that the host has an active 'default' Storage Pool and an active 'default' network. Without these, virtual machines cannot be created. We need to check for these resources and if they are absent, handle the problem automatically.
1 Create template page
2 give a exsit iso path
3 click Create
4 ERROR:cherrypy.error.27310224:[05/Jul/2013:16:35:45] HTTP Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/cherrypy/_cprequest.py", line 656, in respond
response.body = self.handler()
File "/usr/lib/python2.7/site-packages/cherrypy/lib/encoding.py", line 188, in call
self.body = self.oldhandler(_args, *_kwargs)
File "/usr/lib/python2.7/site-packages/cherrypy/_cpdispatch.py", line 34, in call
return self.callable(_self.args, *_self.kwargs)
File "/home/zhonghg/git/2122/src/burnet/controller.py", line 232, in index
return self.create(_args)
File "/home/zhonghg/git/2122/src/burnet/controller.py", line 192, in create
name = create(_args)
File "/home/zhonghg/git/2122/src/burnet/model.py", line 269, in templates_create
t = vmtemplate.VMTemplate(params, scan=True)
File "/home/zhonghg/git/2122/src/burnet/vmtemplate.py", line 49, in init
iso_distro, iso_version = isoinfo.probe_one(iso)
TypeError: 'NoneType' object is not iterable
in the console
Sometimes the noVNC can not start.
The browser report it can not get the des.js
kimchi can create a vm its name starts with '?'
But kimchi can not do any operation on this VM.
Kimchi not not start, stop or display this VM.
For the Cherrypy parsers the "?" as parameter
always a grey mini-line with 2px height display on the top left of the UI.
.mini-line {
background: none repeat scroll 0 0 #EEEEEE;
height: 2px;
left: 29px;
position: absolute;
top: 8px;
width: 19px;
z-index: 2147483647;
}
It looks uncomforting.
In guest tab ,open firebug and click ->net->all,
There is an error:
GET nav-bg.png
404 Not Found
localhost:8000
Direct all requests for Kimchi resources to an authentication screen
Authenticate the user id with PAM confirming the user is authorized to log into the server
Establish a server session with a user object (future authorization enhancement)
This should allow Kimchi to authenticate to any user repository than the Linux distribution supports such as LDAP
To get kimchi to run on Fedora 19 I had to change the imports for the Image
and ImageDraw
classes to specify the PIL package like so:
from PIL import Image
from PIL import ImageDraw
Such a modification was required in these two files:
/usr/lib/python2.7/site-packages/burnet/screenshot.py
/usr/lib/python2.7/site-packages/burnet/mockmodel.py
Python's distutils build and installation system is very limited. While great for pure python modules, it breaks down when doing complex tasks such as building and distributing data files and handling differences between Linux distributions. Autotools has some nice macros for building and distributing python programs and can also handle gettext i18n, distro package building and other tasks.
For an example of another python program that uses autotools, see: https://github.com/oVirt/vdsm
start kimchi with test mode, when listing vms from design-ui,
it raises error and fail to list vms, error mesg list bellow
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.