orwell96 / advtrains Goto Github PK
View Code? Open in Web Editor NEWMinetest Mod: Advanced Trains
Home Page: https://forum.minetest.net/viewtopic.php?f=11&t=14726
License: GNU Lesser General Public License v2.1
Minetest Mod: Advanced Trains
Home Page: https://forum.minetest.net/viewtopic.php?f=11&t=14726
License: GNU Lesser General Public License v2.1
It is usual for trains, especially modern ones, to have displays above the windshields. These can be used to display the destination, line name, train number (e.g. on subway lines with multiple trains), a "out of service" message, or a combination of these. Since there are many possibilities, I think it would make sense to just accept a string for the message to display.
That display could be manually set by the conductor (a "wagon properties" formspec already exists), or with ATC commands (both Lua and non-Lua).
I'm not sure how it could be implemented: the most straightforward solution I see is having each wagon type have designated display locations (or none, for example in the case of steam trains...), and a texture with text would be attached to those locations (like signs and digilines LCDs do). These would then move with the wagon like the decoupling indicators on multi-wagon trains.
Even though a train could eventually have multiple displays, I think it will be simpler to implement if all displays show the same message. Trains without displays would just ignore the ATC commands for display setting.
Fixes a warning on undeclared global stuff
This is a wishlist item. I've seen on my server that the current system of people getting on trains by right-clicking is counter-intuitive, people just try to walk in, similarly, you should get out walking out when doors are open.
the trains could get an attached particlespawner to simulate smoke.
for turning i suggest attaching a new (invisible) entity, on which the particlespawner is attached, at the right position. (when the parent entity turns, attached entities turn around correctly, attached particlespawner not)
Hi, updated your mod and tested again.
here the debug log:
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:12: WARNING[Main]: Irrlicht: PNG warning: iCCP: known incorrect sRGB profile
2016-05-31 15:49:13: ACTION[Server]: singleplayer [127.0.0.1] joins game.
2016-05-31 15:49:13: ACTION[Server]: singleplayer joins game. List of players: singleplayer
2016-05-31 15:49:13: ACTION[Server]: [advtrains][wagon no-id] activated
2016-05-31 15:49:13: ACTION[Server]: [advtrains][wagon 1464702553152.13729] missing train_id, but not yet initialized, returning
2016-05-31 15:49:13: ACTION[Server]: [advtrains][wagon no-id] activated
2016-05-31 15:49:13: ACTION[Server]: [advtrains][wagon 1464702553152.141264] missing train_id, but not yet initialized, returning
2016-05-31 15:49:13: ACTION[Server]: [advtrains][wagon no-id] activated
2016-05-31 15:49:13: ACTION[Server]: [advtrains][wagon 1464702553152.141912] missing train_id, but not yet initialized, returning
2016-05-31 15:49:14: ERROR[Server]: LuaEntity name "advtrains:redwagon" not defined
2016-05-31 15:49:14: ERROR[Server]: LuaEntity name "advtrains:redwagon" not defined
2016-05-31 15:49:14: ACTION[Server]: [advtrains][wagon no-id] activated
2016-05-31 15:49:14: ACTION[Server]: [advtrains][wagon no-id] activated
2016-05-31 15:49:14: ACTION[Server]: [advtrains][wagon no-id] activated
2016-05-31 15:49:22: ACTION[Server]: [advtrains]in conway: next (35,22,1052) not a rail, trying one node below!
2016-05-31 15:49:22: ACTION[Server]: [advtrains]in conway: one below (35,21,1052) is not a rail either, returning!
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -5
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -6
2016-05-31 15:49:22: ACTION[Server]: [advtrains]in conway: next (29,23,1047) not a rail, trying one node below!
2016-05-31 15:49:22: ACTION[Server]: [advtrains]in conway: one below (29,22,1047) is not a rail either, returning!
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -5
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -6
2016-05-31 15:49:22: ACTION[Server]: [advtrains]in conway: next (35,22,1052) not a rail, trying one node below!
2016-05-31 15:49:22: ACTION[Server]: [advtrains]in conway: one below (35,21,1052) is not a rail either, returning!
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -3
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -4
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -5
2016-05-31 15:49:22: ACTION[Server]: over-generating path min to index -6
2016-05-31 15:49:23: ACTION[Server]: singleplayer uses advtrains:connect, pointing at [object 16]
2016-05-31 15:49:24: ACTION[Server]: singleplayer uses advtrains:connect, pointing at [object 14]
2016-05-31 15:49:24: ERROR[Main]: ServerError: Lua: Runtime error from mod 'advtrains' in callback item_OnUse(): ...oritz/.minetest-dev/bin/../mods/advtrains/debugitems.lua:81: attempt to call field 'connect_wagons' (a nil value)
2016-05-31 15:49:24: ERROR[Main]: stack traceback:
2016-05-31 15:49:24: ERROR[Main]: ...oritz/.minetest-dev/bin/../mods/advtrains/debugitems.lua:81: in function <...oritz/.minetest-dev/bin/../mods/advtrains/debugitems.lua:75>
2016-05-31 15:49:24: ACTION[Server]: singleplayer leaves game. List of players:
I think the train ran over the end of the track and the server crashed when reversing. It does not recover when restarting the server, the same traceback appears. Here is the traceback:
2017-01-22 09:45:58: ERROR[Main]: ServerError: Runtime error from mod 'advtrains' in callback environment_Step(): ...st-server/.minetest/mods/advtrains/advtrains/helpers.lua:70: attempt to index local 'prev' (a nil value)
2017-01-22 09:45:58: ERROR[Main]: stack traceback:
2017-01-22 09:45:58: ERROR[Main]: ...st-server/.minetest/mods/advtrains/advtrains/helpers.lua:70: in function 'conway'
2017-01-22 09:45:58: ERROR[Main]: ...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:412: in function 'pathpredict'
2017-01-22 09:45:58: ERROR[Main]: ...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:88: in function 'train_step'
2017-01-22 09:45:58: ERROR[Main]: ...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:55: in function <...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:43>
2017-01-22 09:45:58: ERROR[Main]: /usr/share/games/minetest/builtin/game/register.lua:412: in function </usr/share/games/minetest/builtin/game/register.lua:392>
So I just updated to the latest a very recent version of this mod (commit ee24a50), and after moving around for a bit in my world (which worked fine on a previous version of this mod, on the same Minetest install), Lua goes out of memory:
OOM error from mod 'advtrains' in callback environment_Step(): not enough memory Current Lua memory usage: 45 MB
This world contains a relatively big train network with probably over 2000 blocks of track, all reachable from each other. There are not many trains, however (at most, 10 subway trains). The first two times I loaded the world, it crashed within seconds. The third and latest time, I was able to ride a train for about a minute or so, then the server crashed with the above message. The error messages for the two previous times were the same, only the memory usage value changed a bit.
I can share a world map or even the whole world (needs lots of mods though) with the devs, if that would help.
I have a much smaller world with, like, 200 blocks of track, and this problem doesn't occur.
Encountered a show-stopping bug:
A player experimented with the atc stuff, now the server crashes on startup:
CODE: SELECT ALL
ERROR[Main]: ServerError: AsyncErr: environment_Step: Runtime error from mod 'advtrains' in callback environment_Step(): ...st/world/worldmods/advtrains/advtrains/advtrains/atc.lua:43: attempt to concatenate field 'command' (a nil value)
ERROR[Main]: stack traceback:
ERROR[Main]: ...st/world/worldmods/advtrains/advtrains/advtrains/atc.lua:43: in function 'send_command'
ERROR[Main]: ...st/world/worldmods/advtrains/advtrains/advtrains/atc.lua:141: in function 'on_train_enter'
ERROR[Main]: ...world/worldmods/advtrains/advtrains/advtrains/tracks.lua:437: in function 'call_enter_callback'
ERROR[Main]: ...world/worldmods/advtrains/advtrains/advtrains/tracks.lua:417: in function 'enter_node'
Hi, I'm having following problem. It is probably bug.
Steps to reproduce:
Behavior:
Expected behavior:
The lua ATC rails don't execute their code if they are in an unloaded chunk. They seem to be implemented differently from the other ones, that work in unloaded chunks.
a huge issue on automatic rail lines is trains crashing into each other and creating a stoppage. couldn't you make subways be able to go right through another subway? and have a different mode/method for connecting.
After update to b29b884
I'm posting this here just in case someone runs into this problem, it's probably not a bug in advtrains, but in the engine, see:
minetest/minetest#5169
ToDo for me. Basically the issue that detector and ATC rails and bumpers don't align to normal ones
The trackworker ignores protections and thus allows unauthorized users to rotate tracks without authorization.
a good idea would be to enable one to right click a train while inside >> wagon properties >> and create a check box "go through other trains" to be set after coupling them.
Currently rail placers do not check for solid nodes below it when placed
this is the error with your latest advtrains commit cd25d57
this is the error:
17-01-24 17:57:28: ERROR[Main]: ServerError: Runtime error from mod 'advtrains' in callback environment_Step(): ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:336: attempt to index field 'train' (a nil value)
2017-01-24 17:57:28: ERROR[Main]: stack traceback:
2017-01-24 17:57:28: ERROR[Main]: ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:336: in function 'pathpredict'
2017-01-24 17:57:28: ERROR[Main]: ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:88: in function 'train_step'
2017-01-24 17:57:28: ERROR[Main]: ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:55: in function <...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:43>
2017-01-24 17:57:28: ERROR[Main]: /usr/share/minetest/builtin/game/register.lua:412: in function </usr/share/minetest/builtin/game/register.lua:392>
The formspec that pops up when you rightclick the train when the doors are closed should display "Get Off" when they open instead of "Doors Closed".
After deleting all trains (to avoid issues like #34 ...), updating to 1.6.2, migrating all the tracks to the new database, creating a new subway train with two cars, hopping on it, after just a few blocks / seconds the following error occurred:
2017-02-04 22:04:21: ACTION[Server]: [advtrains]get_on: attaching singleplayer
2017-02-04 22:04:22: ACTION[Server]: [advtrains]Limiting dtime to 0.2!
2017-02-04 22:04:24: ERROR[Main]: ServerError: Runtime error from mod 'advtrains' in callback environment_Step(): ...e/gabriel/.minetest/mods/advtrains/advtrains/helpers.lua:143: attempt to index local 'vec' (a nil value)
2017-02-04 22:04:24: ERROR[Main]: stack traceback:
2017-02-04 22:04:24: ERROR[Main]: ...e/gabriel/.minetest/mods/advtrains/advtrains/helpers.lua:143: in function 'round_vector_floor_y'
2017-02-04 22:04:24: ERROR[Main]: ...e/gabriel/.minetest/mods/advtrains/advtrains/helpers.lua:58: in function 'conway'
2017-02-04 22:04:24: ERROR[Main]: ...abriel/.minetest/mods/advtrains/advtrains/trainlogic.lua:285: in function 'train_step_a'
2017-02-04 22:04:24: ERROR[Main]: ...abriel/.minetest/mods/advtrains/advtrains/trainlogic.lua:67: in function <...abriel/.minetest/mods/advtrains/advtrains/trainlogic.lua:43>
2017-02-04 22:04:24: ERROR[Main]: /usr/share/minetest/builtin/game/register.lua:412: in function </usr/share/minetest/builtin/game/register.lua:392>
2017-02-04 22:04:24: ACTION[Server]: singleplayer leaves game. List of players:
I reopened the world, the player was still attached to the train and moving forward just like before the crash, so I left the train and entered again, moved it forward like before, and the error didn't occur again (so far).
you really need to have a node that works with freight cars such as the box wagon to automatically load them. something that would cooperate with the pipeworks mod.
normally Minetest mods are much smaller. this one takes more than 50 Megabytes
one reason for this are the extra saved .blend1 files. blender makes them automatically on saving. they should be deleted
edit: also some textures got much too high resolution
should I be concerned?
2017-01-25 23:21:20: WARNING[Server]: Assignment to undeclared global "compare" inside a function at ...minetest_game/mods/advtrains/advtrains/advtrains/atc.lua:212.
Maybe you should add functions for stuff like stations, passing loops, switches (switch the trains according to destination)...
I'm going to implement this exact system soon.
ATC should be more simple, so any random player can use it. There are going to be a few kinds of blocks:
Switches should include a formspec, which lets you select the direction of the train depending on train line. You can set the train line on the train menu formspec. For example:
straight: Line 4, Line 5
left: Line 3
if you set a signal, a control rail will spawn next to it. you can set speed signals, that set the speed of the train and block signals that prevent trains from crashing into each other. In the block rails, you can set the blocks the train enters and the blocks the train exits after passing the signal. If the blocks the train is entering are blocked, the trains stop and wait until the block is free.
You can set the stop times, where the doors open and whether the train should reverse. Also, you can set the train to wait for other trains, for instance, if you have a cross-platform interchange, you can set the trains to wait for each other.
Is it just me, or ATC rails can't be rotated? In some cases, when placing them on an existing track, they'll have the wrong orientation. And I can't rotate them with the track worker tool (it just opens the formspec). Because they are rotated, the trains can't go through.
Am I doing something wrong?
It fails with this traceback:
2016-10-23 18:55:33: ERROR[Main]: ServerError: Lua: Runtime error from mod 'advtrains' in callback luaentity_Rightclick(): /home/gpcf/.minetest/mods/advtrains/wagons.lua:384: bad argument #1 to 'ipairs' (table expected, got nil)
2016-10-23 18:55:33: ERROR[Main]: stack traceback:
2016-10-23 18:55:33: ERROR[Main]: [C]: in function 'ipairs'
2016-10-23 18:55:33: ERROR[Main]: /home/gpcf/.minetest/mods/advtrains/wagons.lua:384: in function 'get_seatno'
2016-10-23 18:55:33: ERROR[Main]: /home/gpcf/.minetest/mods/advtrains/wagons.lua:35: in function </home/gpcf/.minetest/mods/advtrains/wagons.lua:19>
2016-10-23 18:55:33: ACTION[Server]: singleplayer leaves game. List of players:
2016-10-23 18:55:42: WARNING[Main]: NodeDefManager: Ignoring CONTENT_IGNORE redefinition
2016-10-23 18:55:42: WARNING[Main]: Undeclared global variable "increativeinv" accessed at /home/gpcf/.minetest/mods/advtrains/tracks.lua:200
2016-10-23 18:55:42: WARNING[Main]: Undeclared global variable "switchfunc" accessed at /home/gpcf/.minetest/mods/advtrains/tracks.lua:382
2016-10-23 18:55:42: WARNING[Main]: Undeclared global variable "switchfunc" accessed at /home/gpcf/.minetest/mods/advtrains/signals.lua:26
2016-10-23 18:55:42: WARNING[Main]: Undeclared global variable "switchfunc" accessed at /home/gpcf/.minetest/mods/advtrains/signals.lua:57
As we began discussing on #27, trains randomly get stuck after looping in a ATC-controlled line for some minutes/hours. (It's possible it also happens without ATC, but I don't think anyone tested yet).
Furthermore, when a train unexpectedly stops and a queue of trains forms before it, sometimes trains overlap another instead of colliding and stopping before the one in front of them.
When the player dies while riding the industrial train, the mod behaves very buggy.
should the subway be able to seat more people? would be a good idea..
2017-02-14 08:51:27: ERROR[Main]: ServerError: Runtime error from mod 'advtrains' in callback environment_Step(): ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:496: attempt to perform arithmetic on field 'end_index' (a nil value)
2017-02-14 08:51:27: ERROR[Main]: stack traceback:
2017-02-14 08:51:27: ERROR[Main]: ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:496: in function 'train_step_b'
2017-02-14 08:51:27: ERROR[Main]: ...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:78: in function <...t_game/mods/advtrains/advtrains/advtrains/trainlogic.lua:42>
2017-02-14 08:51:27: ERROR[Main]: /usr/share/minetest/builtin/game/register.lua:412: in function </usr/share/minetest/builtin/game/register.lua:392>
^C
[root@localhost ~]#
I get this error:
2017-02-03 22:54:11: ERROR[Main]: ServerError: Runtime error from mod 'advtrains' in callback environment_Step(): ...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:400: attempt to perform arithmetic on field 'end_index' (a nil value)
2017-02-03 22:54:11: ERROR[Main]: stack traceback:
2017-02-03 22:54:11: ERROR[Main]: ...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:400: in function 'train_step_b'
2017-02-03 22:54:11: ERROR[Main]: ...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:70: in function <...server/.minetest/mods/advtrains/advtrains/trainlogic.lua:43>
2017-02-03 22:54:11: ERROR[Main]: /usr/share/games/minetest/builtin/game/register.lua:412: in function </usr/share/games/minetest/builtin/game/register.lua:392>
It probably is a problem that comes from the fact that I already have trains running on my server.
Sometimes collisions do not work.
I now have a concrete idea how the cables will work:
saying shift instead of sneak can be confusing for both the force-on when doors are closed as well as the force-break the train. first of all sneak by default is left shift, also many people are on mobile and dont have shift but sneak button. also, on computer, many people change the default.
googol sent me a PM with some sounds for the steam engine. I need to integrate them.
I have added "detector rails" to other Minetest train mods, and I'd like to have train detection support in this mod too so I could switch my worlds to it, as it is vastly superior than other cart mods.
However, I gave the source code a look and I don't understand how the train-track connection works. It seems that trains predict their paths using pathpredict
, and that whenever the possible paths change (e.g. when a switch is right-clicked), these predictions are invalidated with invalidate_all_paths
. Ideally I'd like the track to "know" when a train passes over it, so it could send a digiline message. However, it doesn't seem like the track components can have any idea that a train is going over them.
The other way to do this would be to register a globalstep function which would work similarly to the damage function in damage.lua, which would regularly check whether a train is near a detector track using minetest.get_objects_inside_radius
, and have that piece of track send a digiline message if a train is inside the radius. But previous experience with using this approach on other mods told me that this is unreliable: a short train going at high speed may go through a detector track undetected, because on one step, the train is still too far "before" the detector, and the step after that, it has completely gone through the detector and is now too far ("after" the detector) to trigger a detection. The problem gets worse if there are many trains or the server is slow for some reason. This can be mitigated by increasing the radius of detection, but to me this feels too much like a hack and furthermore it may work incorrectly if two trains happen to be in vicinity of the detector.
As to why digilines and not just mesecons, the reason is simple: with digilines the detector could send information about the train passing through, including:
advtrains.trains
table)With mesecons the best it could do would be to turn on an emitter, losing all additional information. Of course, there's no reason not to support both, I'm just stating why digilines would work better for me because it can convey additional information.
In my experience it's also a bit easier to send a digiline message than to develop a Mesecon emitter, because the latter, as far as I know, requires using different nodes for the "on" and "off" states of the detector.
Here are a couple of suggestions, which I may implement in the next days (if I have time). These come from my experiences with running this mod on my server (I'm still running an old version, as the new ones need Minetest 0.4.15).
Add an owner to the rails, so they are protected automatically, since it is a pain to protect all tracks. It should also protect the surroundings automatically, to prevent blocking. Also, some portions of track should be made public for other players to connect.
Also, I would add simutrans-style depots to minetest, because people tend to place trains on the tracks and they can't be removed.
Noticed this effect once. All interrupts were forgotten.
Could also be caused by the time the save file is updated
I have noticed that when the player manually reverses the direction of the train, the side controlled by each door button also changes, so A always controls the doors on the right hand side of the train when it's facing the direction of movement. This makes sense.
In theory this would allow one to always use the same ATC code on all the ATC rails that correspond to a station, without needing to know whether the train is going "forwards" or "backwards". In my map (where trains ride on the left side, "British way"), that would mean that the OL command would always be used.
But apparently, when the train direction is reversed by a ATC rail (even if the player is riding the train), then the OL command will open the doors on the "wrong" side.
I believe this is a bug; if this is intended behavior, then I suggest changing it to work like I said, because otherwise one needs to use conditionals on the ATC rails to use either OL or OR depending on the direction of the train (and even that will not work right all the time, because the train may be in "reverse" but it may have been reversed by a player and in that case, the doors will be reversed - a big mess).
I'm not sure I explained the problem well enough, so if you're confused here's a relatively long video where I reproduce the problem: https://tny.im/dl/door_bug.mp4
I forgot to show but the ATC rail at the end of the track, which reverses the direction, has the command: I+ B0 W R D10 S8;
. The rails I didn't show just slow down the train.
2017-03-31 22:57:59: ERROR[Main]: ServerError: AsyncErr: ServerThread::run Lua: Runtime error from mod 'advtrains_train_subway' in callback luaentity_Step(): ...est-server/.minetest/mods/advtrains/advtrains/wagons.lua:467: bad argument #1 to 'floor' (number expected, got nil)
2017-03-31 22:57:59: ERROR[Main]: stack traceback:
2017-03-31 22:57:59: ERROR[Main]: [C]: in function 'floor'
2017-03-31 22:57:59: ERROR[Main]: ...est-server/.minetest/mods/advtrains/advtrains/wagons.lua:467: in function 'get_real_path_index'
2017-03-31 22:57:59: ERROR[Main]: ...est-server/.minetest/mods/advtrains/advtrains/wagons.lua:615: in function 'get_off'
2017-03-31 22:57:59: ERROR[Main]: ...est-server/.minetest/mods/advtrains/advtrains/wagons.lua:265: in function <...est-server/.minetest/mods/advtrains/advtrains/wagons.lua:208>
it says, mesecons would be optional, but without mesecons mod, this error occures:
debug.txt:
-------------
Separator
-------------
2016-11-17 15:12:03: WARNING[Main]: NodeDefManager: Ignoring CONTENT_IGNORE redefinition
2016-11-17 15:12:03: WARNING[Main]: Undeclared global variable "mesecon" accessed at /home/<me>/.minetest/mods/advtrains/init.lua:15
2016-11-17 15:12:03: ERROR[Main]: ModError: Failed to load and run script from /home/<me>/.minetest/mods/advtrains/init.lua:
2016-11-17 15:12:03: ERROR[Main]: /home/<me>/.minetest/mods/advtrains/init.lua:15: attempt to index global 'mesecon' (a nil value)
2016-11-17 15:12:03: ERROR[Main]: stack traceback:
2016-11-17 15:12:03: ERROR[Main]: /home/<me>/.minetest/mods/advtrains/init.lua:15: in main chunk
2016-11-17 15:12:03: ERROR[Main]: Siehe debug.txt für Details.
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.