moloch-- / rootthebox Goto Github PK
View Code? Open in Web Editor NEWA Game of Hackers (CTF Scoreboard & Game Manager)
Home Page: http://root-the-box.com/
License: Apache License 2.0
A Game of Hackers (CTF Scoreboard & Game Manager)
Home Page: http://root-the-box.com/
License: Apache License 2.0
There was a bug when editing a flag.
The Box option automatically change to the first item in the combo box list. If you click in Edit button without change anything, the flag will be moved to the selected item in combo box which may be not the original one.
You may wish to consider changing the number of character allowable for the flags from 16 to 32 or even larger.
Sometimes, the flag can be in the form of some hash.
Good job btw.
Hi,
I am having a setup problem, please let me know the reason behind this.
Python Version : 2.7.3
If you have video tutorial for installation, please share.
root@KaliHome:/RootTheBox-master# ./rootthebox.py --setup=prod
[I 150113 10:17:14 ConfigHelpers:9] Saving current config to: files/rootthebox.cfg
[] 10:17:14 : Creating the database ...
[] 10:17:14 : Bootstrapping the database ...
[?] Admin username: admin
[?] New Admin Password:
[?] Confirm New Admin Password:
Traceback (most recent call last):
File "./rootthebox.py", line 447, in
setup()
File "./rootthebox.py", line 68, in setup
import setup.bootstrap
File "/root/RootTheBox-master/setup/bootstrap.py", line 133, in
dbsession.flush()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1919, in flush
self._flush(objects)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2037, in _flush
transaction.rollback(_capture_exception=True)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py", line 60, in exit
compat.reraise(exc_type, exc_value, exc_tb)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2001, in _flush
flush_context.execute()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 372, in execute
rec.execute(self)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 526, in execute
uow
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 65, in save_obj
mapper, table, insert)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 602, in _emit_insert_statements
execute(statement, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 729, in execute
return meth(self, multiparams, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 322, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 958, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1159, in _handle_dbapi_exception
exc_info
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 951, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 436, in do_execute
cursor.execute(statement, parameters)
File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 205, in execute
File "build/bdist.linux-x86_64/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
sqlalchemy.exc.IntegrityError: (IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (rootthebox
.user
, CONSTRAINT user_ibfk_2
FOREIGN KEY (theme_id
) REFERENCES theme
(id
))') 'INSERT INTO user (created, uuid, team_id, _avatar, _locked, last_login, logins, _handle, password, bank_password, theme_id, algorithm) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)' (datetime.datetime(2015, 1, 13, 10, 17, 38, 300696), 'ef632f77-8365-4f40-85a5-f8970f1b7f7d', None, None, 0, None, 0, 'admin', u'$p5k2$2bad$nrrD/1tX$VwtbalM60/KhhuQoyGFGzogs2espm9aM', None, 3, 'md5')
Thanks
When I am assigning an IP to a box, I am not sure how I can make that public for the players.
When the box name or description exceed the max number of character , it will return an error 404 page instead of error messages.
example: box with name "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
1) The description box doesnt accept "\r\n". Is it for some reason? My idea is put there like a short description of the scenario etc etc....
PS: if ou agree...I think the description text box should be able to visual resize for write purposes.
May be you can add a "box" like IPv4 and IPv6
2) What do you think about a team loose X percentage when tries to submit a flag that is not correct. It can be an option when you create the flag. Example:
Flag
Token: "Something"
Value: $100
If team try "xxx", then "yyy" and then "something", may be we can have a option to cut the value when they fail. Like the system already do when a second team submit a flag after the first team.
3) I have not been able to delete boxes and corporations. I already search in admin configuration..but nothing :(
If I wish to rank the player based on the amount of $$ rather than flags, may I know how can I do that?
I'm not sure if this is a misunderstanding of mine or if it is a bug, from my perspective the Registration Tokens should be single use which means that once used they should be revoked. But I've tried to use a token twice and it worked.
./rootthebox.py --start
[DEBUG] 2014-03-08 13:31:02,745 - Configured to use MySQL for a database
[WARNING] 2014-03-08 13:31:03,795 - Possible misconfiguration 'domain' is set to 'localhost'
Traceback (most recent call last):
File "./rootthebox.py", line 155, in
main(parser.parse_args())
File "./rootthebox.py", line 120, in main
serve()
File "./rootthebox.py", line 42, in serve
from handlers import start_server
File "/home/sl3dge/RootTheBox/handlers/init.py", line 52, in
from handlers.PastebinHandlers import *
File "/home/sl3dge/RootTheBox/handlers/PastebinHandlers.py", line 31, in
from libs.Form import Form
ImportError: No module named Form
Are the Missions built in or is that something that the user needs to do separately? If so, how? I'm assuming that's what the import XML function is for but I don't see a template for that.
http://127.0.0.1:8888/admin/create/corporation
Hit the create button:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1218, in _when_complete
callback()
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1239, in _execute_method
self._when_complete(method(_self.path_args, *_self.path_kwargs),
File "/root/RoottheBox/RootTheBox/libs/SecurityDecorators.py", line 63, in wrapper
return method(self, _args, *_kwargs)
File "/root/RoottheBox/RootTheBox/libs/SecurityDecorators.py", line 38, in wrapper
return method(self, _args, *_kwargs)
File "/root/RoottheBox/RootTheBox/libs/SecurityDecorators.py", line 93, in wrapper
return method(self, _args, *_kwargs)
File "/root/RoottheBox/RootTheBox/handlers/AdminHandlers.py", line 189, in post
game_objectsargs[0]
File "/root/RoottheBox/RootTheBox/handlers/AdminHandlers.py", line 197, in create_corporation
if Corporation.by_name(corp_name) is not None:
File "/root/RoottheBox/RootTheBox/models/Corporation.py", line 61, in by_name
return dbsession.query(cls).filter_by(name=unicode(name)).first()
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 1212, in filter_by
return self.filter(sql.and(_clauses))
File "", line 1, in
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 50, in generate
fn(self, *args[1:], *_kw)
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 1177, in filter
"filter() argument must be of type "
ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement or string
The purchase is successful, however the page crashes and displays this:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1218, in _when_complete
callback()
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1239, in _execute_method
self._when_complete(method(_self.path_args, *_self.path_kwargs),
File "/home/steve/RootTheBox/libs/SecurityDecorators.py", line 38, in wrapper
return method(self, _args, *_kwargs)
File "/home/steve/RootTheBox/libs/SecurityDecorators.py", line 166, in wrapper
return method(self, _args, *_kwargs)
File "/home/steve/RootTheBox/handlers/MarketHandlers.py", line 67, in post
event = self.event_manager.create_purchased_item_event(user, item)
File "/home/steve/RootTheBox/libs/EventManager.py", line 150, in create_purchased_item_event
self.push_broadcast_notification(evt_id)
File "/home/steve/RootTheBox/libs/EventManager.py", line 108, in push_broadcast_notification
Notification.delivered(user_id, event_uuid)
File "/home/steve/RootTheBox/models/Notification.py", line 80, in delivered
notify.viewed = True
AttributeError: 'NoneType' object has no attribute 'viewed'
Hi,
I am facing the issue that after we started the Python Script, we can nearly do anything on the Website, besides to start a Game. The Button shows no response. Checking in Debug mode, I can not even see the request, when I hit start the game.
Hope you can response soon, we wanted to run the Scorebot this afternoon. :/
bye
MT
As admin, if you click on create a flag without making a box first, you will receive this error.
_tmp = box.corporation_name # admin/create/flag.html:54 (via main.html:33)
AttributeError: 'Box' object has no attribute 'corporation_name'
Edit: even after you create a new box, still same error when selecting create flag from admin menu or Add Flag button in game_objects page.
this was the error,
http://sprunge.us/QBJW
In some browsers, players could not submit flags because the black overlay was over the flag input box.
Some reported the issue in chrome, some others in Firefox... i'm not sure yet.
Here is what one of the players sent me:
The problem is a modal-backdrop in css themes. z-index maybe.
https://github.com/moloch--/RootTheBox/search?q=modal-backdrop&ref=cmdform
They also gave me a (corrected) cyborg.css file which can be found here http://pastebin.com/raw.php?i=PPVxLHz9
All credits to: [email protected]
Again, thanks for this scoreboard
Currently, there is a bug in the level system. I am unable to delete any level. It will return in a blank page. On refresh, a 404 page appear
Port all terminals to https://github.com/xtermjs/xterm.js for all round better user experience and simplified code.
Some feature ideas:
./rootthebox.py --start
[DEBUG] 2014-03-07 22:35:36,516 - Configured to use MySQL for a database
[WARNING] 2014-03-07 22:35:36,794 - Possible misconfiguration 'domain' is set to 'localhost'
Traceback (most recent call last):
File "./rootthebox.py", line 155, in
main(parser.parse_args())
File "./rootthebox.py", line 120, in main
serve()
File "./rootthebox.py", line 42, in serve
from handlers import start_server
File "/home/sl3dge/RootTheBox/handlers/init.py", line 46, in
from handlers.AdminHandlers import *
File "/home/sl3dge/RootTheBox/handlers/AdminHandlers.py", line 41, in
from libs.Form import Form
ImportError: No module named Form
root@mainframe:accounts# help
accounts - Get a list of active bank accounts
users - Get information on users
report - Generate a report on an account
transfer - Transfer funds from one account to another
intro - Change console intro animation
root@mainframe:accounts# report
Command 'report' Not Found
Hi,
maybe I am missing something :(
I have a running box with scorebot. So when I start a game, everything works fine. Noe I want to reset everything and start a new game with the same scenario.
I am pretty sure, I need to reset something within the MySQL Database, but somehow I can not figure it out.
Could somebody provide some Help on this.
Maybe it would be not bad to have a button within the Admin Website, to reset the scores and to restart the game.
aTdHvAaNnKcSe
Bye
MT
So I'm going to be using Root The Box to host a CTF event at my college in the spring semester.
Just have a few questions, if you can answer them!
The newest version gives me an error:
./rootthebox.py --create-tables
File "./rootthebox.py", line 26, in
import nose
ImportError: No module named nose
May I know whether is it possible for admin to edit bank accounts value for the players?
Hey there, your scoreboard is awesome!
-- That said: Adding a team containing UTF-8 Chars breaks the teams display:
(data is inserted in the database)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1270, in _when_complete
callback()
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1291, in _execute_method
self._when_complete(method(*self.path_args, **self.path_kwargs),
File "/srv/RootTheBox/libs/SecurityDecorators.py", line 63, in wrapper
return method(self, *args, **kwargs)
File "/srv/RootTheBox/libs/SecurityDecorators.py", line 38, in wrapper
return method(self, *args, **kwargs)
File "/srv/RootTheBox/libs/SecurityDecorators.py", line 93, in wrapper
return method(self, *args, **kwargs)
File "/srv/RootTheBox/handlers/AdminHandlers.py", line 365, in get
uri[args[0]]()
File "/srv/RootTheBox/handlers/AdminHandlers.py", line 381, in view_user_objects
self.render('admin/view/user_objects.html', errors=None)
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 667, in render
html = self.render_string(template_name, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 774, in render_string
return t.generate(**namespace)
File "/usr/local/lib/python2.7/dist-packages/tornado/template.py", line 278, in generate
return execute()
File "admin/view/user_objects_html.generated.py", line 38, in _tt_execute
for team in Team.all(): # admin/view/user_objects.html:93 (via main.html:29)
File "/srv/RootTheBox/models/Team.py", line 85, in all
return dbsession.query(cls).all()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2292, in all
return list(self)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/loading.py", line 72, in instances
rows = [process[0](row, None) for row in fetch]
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/loading.py", line 452, in _instance
populate_state(state, dict_, row, isnew, only_load_props)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/loading.py", line 305, in populate_state
populator(state, dict_, row)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/strategies.py", line 155, in fetch_col
dict_[key] = row[col]
UnicodeDecodeError: 'utf8' codec can't decode byte 0xce in position 15: unexpected end of data
The team name is: η@μ&нτЧ ηε!&нβΩμЯ$
I'd like to help you fix this issue if possible, as I used your scoreboard for a local event, I shall pay you back with code. Most of the time there are prerequisites prior to pushing code, so let me know!
@+
./rootthebox.py --save
Traceback (most recent call last):
File "./rootthebox.py", line 432, in
options.parse_command_line()
File "/usr/lib/python2.7/site-packages/tornado/options.py", line 191, in getattr
raise AttributeError("Unrecognized option %r" % name)
AttributeError: Unrecognized option 'parse_command_line'
When trying to delete the user account, there is a 404 error page.
On registering a new player.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1077, in _execute
_self.path_args, *_self.path_kwargs)
File "./handlers/PublicHandlers.py", line 153, in post
self.create_user(account, handle, passwd, rtok)
File "./handlers/PublicHandlers.py", line 177, in create_user
self.new_event.append(event)
AttributeError: 'RegistrationHandler' object has no attribute 'new_event'
ps let me know what is up with this. I tried for an hour, i guess i just don't know how this passes things back and forth.
pps, tell me how to fix it and let me get the code up date :)
Previously notes but I figured I would open up an issue for it. As of right now there doesn't seem away to easily remove teams, boxes, or levels or to wipe everything away(apart from manually deleting the database). The import/export XML should also be extended to capture all aspects of the server with maybe even an option to save notifications that have been received and points awarded, essentially creating a snapshot of the board and all it's functions. As of right now the XML import function does not save assigned IPs for the boxes.
View & Edit > "Flags/Boxes/Corp." > Edit Box
If you try change the Game level nothing will happen.
To be able to change, I access to "View & Edit" > "Game levels" > [button Switch Level]
Hello :)
Question about roothebox.cfg: whats the difference between:
[Security]
max_password_length = 7
[Game]
max_password_length = 7
Thank you in advance,
Regards
Hello again, Im not sure if im doing something wrong but, with admin user:
Create > New Box [button Create Box] - OK
Create > New Flag > Static Flag > Select the box created before [button Create Flag] - OK
Then.... :
View & Edit > "Flags/Boxes/Corp." > (inside the box created before) [button Add Flags] > Create Text Flag
Answer:
404 - Four oh Four!?!
It looks like you typed a URL incorrectly, or were attempting to find something you ought not have access to.
The only other possibility is that I messed up some of the code, and that doesn't seem very likely.
Hello :)
In default configuration you have:
[Database]
# This is the database name we're connecting to
name = rootthebox
but in instalaltion procedure you wrote:
create database rtb;
I suggest:
[Database]
# This is the database name we're connecting to
name = rtb
Thank you for your time ;)
Regards
When I try to connect a botnet I get the following error:
[ERROR] 2014-08-18 15:54:36,719 - Uncaught exception in /botnet/connect
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/websocket.py", line 369, in _run_callback
callback(_args, *_kwargs)
File "/home/rtb/Desktop/RootTheBox/handlers/BotnetHandlers.py", line 87, in open
box = Box.by_ip_address(self.request.remote_ip)
AttributeError: 'module' object has no attribute 'by_ip_address'
[DEBUG] 2014-08-18 15:54:36,721 - Closing connection to bot at 10.0.2.6
Any idea what exactly could be causing this? I've tried to dig through the code and figure it out but have had no luck.
Hey,
thanks for all the hard work and putting this out for all to use.
My question is this: I can display the scoreboard on the box I'm running rtb on (on an older version of rtb),
though connecting to the rtb engine from any other box, Linux or Windows, will not display the scoreboard correctly.
Nor will it work on the local box with the latest code.
It will show the layout but never any of the graphs.
Is there a setting I'm overlooking?
I notice that in viewing the source of the pages coming in, all the data comes over.
The javascript libraries are there too; just nothing is rendered.
Thanks,
-Armano
P.S.
I'm using VMware workstation 10 running Kali (rtb-test) and CrunchBang (rtb-live) linux both as rtb servers.
Host box is Windows 7, issue is the same regardless of browser used: iceweasle, firefox, chrome, ie.
After ./rootthebox.py --create-tables
I get:
Traceback (most recent call last):
File "./rootthebox.py", line 166, in
main(parser.parse_args())
File "./rootthebox.py", line 116, in main
create()
File "./rootthebox.py", line 49, in create
from libs.ConfigManager import ConfigManager # Sets up logging
File "/home/hanger/RootTheBox/libs/ConfigManager.py", line 51, in
class ConfigManager(object):
File "/home/hanger/RootTheBox/libs/ConfigManager.py", line 432, in ConfigManager
@property.setter
TypeError: descriptor 'setter' requires a 'property' object but received a 'function'
Same error with default config file.
python -V
Python 2.7.6
Work in progress https://github.com/moloch--/RootTheBox/tree/py3
Is there a way that an administrator could provide multiple hints for each flag instead of tying the hints to each box? This would be a great feature for situations where you want each contestant (students in this case) to be able to obtain every flag and the only difference at the end of the game being the score for each contestant/team.
Thanks for your consideration.
Chris
Hi,
I was very interested in the Root The Box application and decided to try it out. During the installation, following the video tutorial provided, I ran into this problem:
Unfortunately, I am also new at the Python language and unsure of the issue here.
I am running Debian 7 OS with Python version of 2.7.3. Any help would be much appreciated!
Thank you :)
./rootthebox.py --create-tables
[*] 20:50:36 : Creating the database ...
Traceback (most recent call last):
File "./rootthebox.py", line 155, in
main(parser.parse_args())
File "./rootthebox.py", line 111, in main
create()
File "./rootthebox.py", line 51, in create
from setup.create_database import create_tables, engine, metadata
File "/home/steve/Documents/RootTheBox/setup/create_database.py", line 21, in
from models import engine
File "/home/steve/Documents/RootTheBox/models/init.py", line 30, in
_config = ConfigManager.instance()
File "/home/steve/Documents/RootTheBox/libs/Singleton.py", line 40, in instance
self._instance = self._decorated()
File "/home/steve/Documents/RootTheBox/libs/ConfigManager.py", line 80, in init
self.refresh()
File "/home/steve/Documents/RootTheBox/libs/ConfigManager.py", line 114, in refresh
self.config.readfp(fp)
File "/usr/lib/python2.7/ConfigParser.py", line 324, in readfp
self._read(fp, filename)
File "/usr/lib/python2.7/ConfigParser.py", line 512, in _read
raise MissingSectionHeaderError(fpname, lineno, line)
ConfigParser.MissingSectionHeaderError: File contains no section headers.
file: /home/steve/Documents/RootTheBox/rootthebox.cfg, line: 2
' Root the Box - Configuration File\n'
Hello, Thank you for this amazing tool. Congratz.
I added some dummy stuff with strings like 'isto é um teste' and when I tried export to a file, the tool gave me this output in browser:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1218, in _when_complete
callback()
File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1239, in _execute_method
self._when_complete(method(_self.path_args, *_self.path_kwargs),
File "/root/RootTheBox/libs/SecurityDecorators.py", line 58, in wrapper
return method(self, _args, *_kwargs)
File "/root/RootTheBox/libs/SecurityDecorators.py", line 37, in wrapper
return method(self, _args, *_kwargs)
File "/root/RootTheBox/libs/SecurityDecorators.py", line 77, in wrapper
return method(self, _args, *_kwargs)
File "/root/RootTheBox/handlers/AdminHandlers.py", line 1326, in get
uriargs[0]
File "/root/RootTheBox/handlers/AdminHandlers.py", line 1332, in export_xml
xml_doc = self.create_xml()
File "/root/RootTheBox/handlers/AdminHandlers.py", line 1355, in create_xml
corp.to_xml(corps_elem)
File "/root/RootTheBox/models/Corporation.py", line 83, in to_xml
box.to_xml(boxes_elem)
File "/root/RootTheBox/models/Box.py", line 186, in to_xml
flag.to_xml(flags_elem)
File "/root/RootTheBox/models/Flag.py", line 168, in to_xml
ET.SubElement(flag_elem, "description").text = str(self.description)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)
rootthebox.com still has the google code link, should be updated to github
When you do not have any flags there are no missions even though i have missions in the system. There are just no flags in the missions but they do exist.
Hello,
When I check the scoreboard I don't see any graphs. I've tried troubleshooting, with no luck. Is there something I'm missing?
Thanks
When made a change in roothebox.cfg it needs to be restarted, here's a little bash to restart.
$ cat restart.sh
for process in pgrep -f "python ./rootthebox.py -s"
;
do echo 'Killing process ID ';
echo $process;
kill -9 $process;
done &&
./rootthebox.py -s
For some reason, whenever I try to access admin features, I am given a 403 error. Any solutions?
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.