roman971 / oot-randomizer Goto Github PK
View Code? Open in Web Editor NEWThis project forked from ootrandomizer/oot-randomizer
A randomizer for Ocarina of Time.
License: Other
This project forked from ootrandomizer/oot-randomizer
A randomizer for Ocarina of Time.
License: Other
so i dowloaded the updtate today and got greeted by this
Error: Environment setup failed at C:\Users\9TYNINE\Desktop\OoT-Randomizer-Dev-R\GUI\run.js:246:107 at processTicksAndRejections (internal/process/task_queues.js:97:5) at async setupNodeEnvironment (C:\Users\9TYNINE\Desktop\OoT-Randomizer-Dev-R\GUI\run.js:246:5) at async main (C:\Users\9TYNINE\Desktop\OoT-Randomizer-Dev-R\GUI\run.js:346:9)
the normal randomizer works fine, ive tried restarting my pc and still no luck
T
Entrance placement attempt count exceeded for world 0
Traceback (most recent call last):
File "D:\Games\Emulators\Nintendo 64\Tools\Romans\OoT-Randomizer\OoTRandomizer.py", line 61, in start
main(settings)
File "D:\Games\Emulators\Nintendo 64\Tools\Romans\OoT-Randomizer\Main.py", line 95, in main
spoiler = generate(settings, window)
File "D:\Games\Emulators\Nintendo 64\Tools\Romans\OoT-Randomizer\Main.py", line 148, in generate
set_entrances(worlds)
File "D:\Games\Emulators\Nintendo 64\Tools\Romans\OoT-Randomizer\EntranceShuffle.py", line 324, in set_entrances
shuffle_random_entrances(worlds)
File "D:\Games\Emulators\Nintendo 64\Tools\Romans\OoT-Randomizer\EntranceShuffle.py", line 428, in shuffle_random_entrances
shuffle_entrance_pool(world, worlds, entrance_pool, one_way_target_entrance_pools[pool_type], locations_to_ensure_reachable, check_all=True)
File "D:\Games\Emulators\Nintendo 64\Tools\Romans\OoT-Randomizer\EntranceShuffle.py", line 503, in shuffle_entrance_pool
raise EntranceShuffleError('Entrance placement attempt count exceeded for world %d' % entrance_pool[0].world.id)
EntranceShuffle.EntranceShuffleError: Entrance placement attempt count exceeded for world 0
Would love an additional option to have Giant's Knife -> Biggoron Sword as a progressive upgrade when shuffled, assuming that the implementation of such a feature wouldn't be too difficult.
"DMC GS Crate": "Arrows (10)",
"GC (Maze)": {"text": "They say that a spider under a #crate in the crater# holds #a Piece of the Triforce#.", "colors": ["Green", "Red"]},
See attached seed. Very Strong hints, randomize settings, no logic
OoT_F43EA_9K5B0PITY4_Spoiler.txt
I had some randomized settings multiworld with the intention of having different settings for each world. In the past this mostly worked. But the plando I made completely ignored the forced vanilla entrances. It tried to randomize all the entrances even though I already set had those entrances set in the plando file. I copied rando entrances from different randos for each world. Then to ensure vanilla entrances in places that weren't rando'd I copied coupled vanilla entrances to keep them from being randomized and decoupled (since some randos had been decoupled). Anyways the last time I tried to plando it, I was told DMC Lower Nearby -> DMC Great Fairy Fountain was Temple of Time (it was supposed to be DMC Great Fairy Fountain)
With the shuffled medigoron and carpet salesman, there should be an option to make the Giant's Knife and Biggoron Sword progressive, much like the wallet upgrades. You'd always get Giant's Knife first and Biggoron Sword second, no matter which you actually find. This prevents Giant's Knife from being literally useless if you find Biggoron Sword first, as it prevents you from actually finding Biggoron's Sword first in the first place.
In entrance randomizer, when you complete a dungeon, it puts you outside the correct dungeon entrance. Shadow temple is in forest, beating shadow places you in sacred forest meadow. When mixed pools is enabled, this mostly works. If a dungeon is inside of a house, beating the dungeon puts you outside of that house. However, if a dungeon is in a grotto, beating it places you at the vanilla dungeon exit. This can be incredibly annoying if the dungeon entrance was far away and can also lead to out of logic areas suddenly being accessible (beating ice/jabu gives you fountain access without rutos letter, etc).
Since we are going to be using mixed pools in rando rando season 2, it would be fantastic if this was sorted out sooner rather than later.
I know it feels like beating a dead horse at this point but the more I look at this setting the more broken I recognize it to be.
I am going to work on this code on dev-R here rather than main dev because its a lot more complicated here than on dev and at the end of the day, my interest lies in closed forest's application in rando rando.
EDIT: Tested completely on Bizhawk, all textures and shuffles are there, it was 100% a modloader problem. Didn't know it could also cause those changes
The randomizer fails to generate when I randomize Background Music in the SFX settings before generating the ROM. This behavior seems to be specific to that setting, as nothing else triggers it or fixes it.
2023-09-07 09-35-08.log
This does not seem to happen on the latest dev/stable versions of the randomizer in the TestRunner repo.
When we do a rando setting run, It could be cool to have this being randomize, because If we had more Item at the begining, the run can be more open and offer more possibilities at the bigining, so, with the add of the starting inventory setting (who is recent), I think the randomization of this setting have to come.(sorry for my bad english, I'm from France)
https://discordapp.com/channels/274180765816848384/438698093354156032/743127407153643681
TrenterToday at 17:23
@roman You there? Somewhat serious issue. Mixed Entrances + Decoupled. Ice Cavern -> Desert Collossus (From HW) created a Huge Seizure-like Flickering.
It's pretty obvious why it happened but I still wanted to report this.
In short, there's most likely too much randomization as all the ER options are activated and i'm trying to generate a 4-world coop seed.
Removing one-way still lead to an error but not a python one at least, it's the "too much tries" one.
I don't know if main branch intend to include your changes or something close to it but either way they will probably come up with the same problem if it's indeed just a combinatorial problem. I don't know if a better logic can be used but if it does, I imagine it would be a pretty big refactor.
Setting string: HSARCSBSL62AEMTDDS7PF8KA4QMERGA9CAAKSBJ6399P55Z495STAAEACJD8SZAAAAADA5VASST87A2VECHV9
Update: Took me a while to notice the obvious but it happens when generating the spoiler. Short term solution would be to not generate it.
maximum recursion depth exceeded while calling a Python object
Traceback (most recent call last):
File "D:\N64\Randomizers\OoT-Randomizer-Fork\OoTRandomizer.py", line 58, in start
main(settings)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Main.py", line 46, in main
spoiler = generate(settings)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Main.py", line 120, in generate
return make_spoiler(settings, worlds)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Main.py", line 180, in make_spoiler
spoiler.create_playthrough()
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Spoiler.py", line 144, in create_playthrough
worlds = self.copy_worlds()
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Spoiler.py", line 122, in copy_worlds
worlds = [world.copy(copy_dict=copy_dict) for world in self.worlds]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Spoiler.py", line 122, in <listcomp>
worlds = [world.copy(copy_dict=copy_dict) for world in self.worlds]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\World.py", line 361, in copy
new_world.dungeons = [dungeon.copy(copy_dict=copy_dict) for dungeon in self.dungeons]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\World.py", line 361, in <listcomp>
new_world.dungeons = [dungeon.copy(copy_dict=copy_dict) for dungeon in self.dungeons]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Dungeon.py", line 38, in copy
new_dungeon.regions = [region.copy(copy_dict=copy_dict) for region in self.regions]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Dungeon.py", line 38, in <listcomp>
new_dungeon.regions = [region.copy(copy_dict=copy_dict) for region in self.regions]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Region.py", line 62, in copy
new_region.exits = [entrance.copy(copy_dict=copy_dict) for entrance in self.exits]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Region.py", line 62, in <listcomp>
new_region.exits = [entrance.copy(copy_dict=copy_dict) for entrance in self.exits]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Entrance.py", line 40, in copy
new_entrance.connected_region = self.connected_region.copy(copy_dict=copy_dict)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Region.py", line 63, in copy
new_region.locations = [location.copy(copy_dict=copy_dict) for location in self.locations]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Region.py", line 63, in <listcomp>
new_region.locations = [location.copy(copy_dict=copy_dict) for location in self.locations]
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Location.py", line 64, in copy
new_location.item = self.item.copy(copy_dict=copy_dict)
[...]
RecursionError: maximum recursion depth exceeded while calling a Python object
Traceback (most recent call last):
File "OoTRandomizer.py", line 72, in start
main(settings)
File "/host-rootfs/storage/emulated/0/Android/data/tech.ula/files/OoT-Randomizer/Main.py", line 96, in main
return patch_and_output(settings, window, spoiler, rom, start)
File "/host-rootfs/storage/emulated/0/Android/data/tech.ula/files/OoT-Randomizer/Main.py", line 232, in patch_and_output
cosmetics_log = patch_cosmetics(settings, rom)
File "/host-rootfs/storage/emulated/0/Android/data/tech.ula/files/OoT-Randomizer/Cosmetics.py", line 756, in patch_cosmetics
patch_func(rom, settings, log, cosmetic_context_symbols)
File "/host-rootfs/storage/emulated/0/Android/data/tech.ula/files/OoT-Randomizer/Cosmetics.py", line 550, in patch_button_colors
button_option = random.choice(button_colors.keys())
File "/usr/lib/python3.7/random.py", line 262, in choice
return seq[i]
TypeError: 'dict_keys' object is not subscriptable
Custom music doesn't work properly, a lot of crackling sounds going on. On testrunners builds (master and dev) it works just fine. However BizHawk must be involved somehow due to custom music with your builds work just fine when playing through the new Modloader from the OoT Online team.
Hi, got an error while generating a seed, logs attached ! Also tried 2 more seeds and had the same problem (with different locations though)
2021-09-28 17-43-00.log
2021-09-28 17-47-28.log
Settings are hellsanity, almost everything is checked and it's a Multiworld (2 worlds).
Here's the string: BJJAYCHYKAZB5CSA2555R7YQMX2TTL62D2RAAESB2ALAEGBAAUAAAFRYNKJ
If you must enter the GTG entrance, and something inside costs more that your current wallet size minus 10 rupees, you could be forever locked out of purchasing a required item. (This wouldn't be a problem if there were rupees available at fortress that don't require any items, but there aren't.)
I proposed to add the possibility to randomize Chu Salesman and Medigoron.
The saleman in the wasteland gives a random item and a 2nd pack with 20 chu is added on the pool_item. It's required ((epona and hover) or longshot) and first wallet.
Medigoron, who on vanilla give the Giant sword who can be broken, will be randomized.
It's required (strength or bomb or chu if chu is in logic or hammer) and wallet
I suggest two options :
It's just a new check, and a blue rupee will be added, for example.
The Giant Sword is randomized, and it's progressive item with the Biggoron Sword. Two swords will be in the item pool, the first give the Giant Sword and the second Biggoron Sword.
Pressing C down on VC with gamecube controller acts like pressing L on an n64 controller. Used the latest version from the Roman branch. I injected it into a GZ wad if that matters. Pressing Z on the game controller works as C down.
'Triforce Piece'
Traceback (most recent call last):
File "L:\N64\Tools\OoT-Random-11-4-19\OoTRandomizer.py", line 72, in start
main(settings)
File "L:\N64\Tools\OoT-Random-11-4-19\Main.py", line 88, in main
spoiler = generate(settings, window)
File "L:\N64\Tools\OoT-Random-11-4-19\Main.py", line 137, in generate
settings.distribution.configure_triforce_hunt(worlds)
File "L:\N64\Tools\OoT-Random-11-4-19\Plandomizer.py", line 661, in configure_triforce_hunt
world.triforce_count = world.distribution.item_pool['Triforce Piece'].count
KeyError: 'Triforce Piece'
line links back to
world.triforce_count = world.distribution.item_pool['Triforce Piece'].count
I don't know why it's happening but it doesn't work on a original rom.
(seed: 343PAM5YT0)
Settings string: HSS4BGBSL62AEMTDDSPMFQNA4Q79MADEBAATXR9N5MX89TSAAEAC2C8CAEAAANANHBATB8MA8ES2T6D
Entrance placement attempt count exceeded for world 0. Retry a few times or reach out to Support on Discord for help.
Traceback (most recent call last):
File "D:\N64\Randomizers\OoT-Randomizer-Fork\OoTRandomizer.py", line 64, in start
main(settings)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Main.py", line 62, in main
spoiler = generate(settings, window=window)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Main.py", line 129, in generate
worlds = build_world_graphs(settings, window=window)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\Main.py", line 184, in build_world_graphs
set_entrances(worlds)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\EntranceShuffle.py", line 435, in set_entrances
shuffle_random_entrances(worlds)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\EntranceShuffle.py", line 605, in shuffle_random_entrances
shuffle_entrance_pool(world, worlds, entrance_pool, target_entrance_pools[pool_type], locations_to_ensure_reachable, placed_one_way_entrances=placed_one_way_entrances)
File "D:\N64\Randomizers\OoT-Randomizer-Fork\EntranceShuffle.py", line 700, in shuffle_entrance_pool
raise EntranceShuffleError('Entrance placement attempt count exceeded for world %d. Retry a few times or reach out to Support on Discord for help.' % world.id)
EntranceShuffle.EntranceShuffleError: Entrance placement attempt count exceeded for world 0. Retry a few times or reach out to Support on Discord for help.
Tried generating with those settings but it always fail.
Removing the mixed entrance pool solve the issue as well as removing the multiworld. So i guess those two settings does not like each other.
AJJWKCDVKAB8PMAA243MR8TSAWCHGSKSTAUS6B7TDD8VGZPKASAJADABNAENBQ2EJTLAD9UC3JHLUVNFBSNCAASGSEFAB
Using the string above with no seed set, I get error the error below.
Entrance placement attempt count exceeded for world 0
Traceback (most recent call last):
File "F:\OOTR\OoT-Randomizer-Dev-R\OoTRandomizer.py", line 62, in start
main(settings)
File "F:\OOTR\OoT-Randomizer-Dev-R\Main.py", line 56, in main
spoiler = generate(settings, window=window)
File "F:\OOTR\OoT-Randomizer-Dev-R\Main.py", line 121, in generate
worlds = build_world_graphs(settings, window=window)
File "F:\OOTR\OoT-Randomizer-Dev-R\Main.py", line 168, in build_world_graphs
set_entrances(worlds)
File "F:\OOTR\OoT-Randomizer-Dev-R\EntranceShuffle.py", line 362, in set_entrances
shuffle_random_entrances(worlds)
File "F:\OOTR\OoT-Randomizer-Dev-R\EntranceShuffle.py", line 517, in shuffle_random_entrances
shuffle_entrance_pool(world, worlds, entrance_pool, target_entrance_pools[pool_type], locations_to_ensure_reachable)
File "F:\OOTR\OoT-Randomizer-Dev-R\EntranceShuffle.py", line 604, in shuffle_entrance_pool
raise EntranceShuffleError('Entrance placement attempt count exceeded for world %d' % entrance_pool[0].world.id)
EntranceShuffle.EntranceShuffleError: Entrance placement attempt count exceeded for world 0
However, I turned off cow shuffle, settings string AJJWKCDVKAB8PMAA2L3MR8TSAWCHGSKSTAUS6B7TDD8VGZPKASAJADABNAENBQ2EJTLAD9UC3JHLUVNFBSNCAASGSEFAB, and it worked just fine.
Assume beating Barinade gives the Forest Medallion. The objective is to replace the freestanding Zora Sapphire before the miniboss in Jabu Jabu's belly (and the Zora Sapphire model hold up by Ruto soon after) by a model of the Forest Medallion.
Assume you have not seen the altar yet (for example, you got rang+RL in child 1 domain WOTH and went straight to Jabu cause you don't have Farore to do it later). You do the entire Jabu until the miniboss, and see a:
Case 1 - Freestanding Stone: You leave Jabu now, saving some time.
Case 2 - Freestanding Med: You finish the dungeon.
Because it's fancy.
Might be hard to attack the hardcoded existing "Taa daa daa daa" models of the Meds. Might be easier for the stones that are already floating over the altar.
Might be hard to attack the Zora Sapphire model in Ruto's cinematic sequence.
After seeing the new Key Ring option, I thought it could be nice if you could remove or set keys for some dungeons, but have the key rings available for others. So perhaps including a similar toggle that shows only if you choose remove or vanilla.
Hey,
thanks for your amazing fork.
we just finished playing a seed on it and we got stuck at the very end of the game because the ocarina was locked behind the shadow temple entrance at the graveyard, which you cannot access without a warp song. The other side of the LW forest bridge went into the carpenter's tent room, which you also cannot access from the other side.
I thought I would make a report of this logic inconsistency because it might be useful to you. Here is the spoiler log:
"EntranceShuffle.EntranceShuffleError: Entrance placement attempt count exceeded for world 0" Not sure what causes this? (Settings string used: FJNCGYKSB8LXA6RG843RDAKNKALNUCASTGEBFX2UMUTG5SDULUKHKXX8LP2PZ88MSCQJCREUKL3F3WVRC4JFPX2G5Q77ZAHNTKQ3HD7W9RGFZAVAA )
When I pause sometimes it takes a long time and then freezes requiring to change in/out of full screen. I am using retro-arch version 1.8.6 ( i think thats the version) with ParraLLEI
In two seeds my Everdrive 2.5 has frozen killing Stingers in Jabu Jabu.
Currently I'm on Dev-R-test-settings.
Emu players I've raced with have not reported crashing.
":version": "5.2.65 R-9 Test-1", "file_hash": ["Big Magic", "Beans", "Hover Boots", "Lens of Truth", "Stone of Agony"], ":seed": "LJBH1TSEW5", ":settings_string": "AJTWFFCSKJA9WAAACAASAEPRPTACSJWJAKALERCAEACABNAEWBTSELTPER5M9CJBUSAJGBABASR2WBE",
Highlighted VOD: https://www.twitch.tv/videos/775004810
What happened here?
https://ootrandomizer.com/seed/get?id=884030
This person was not able to complete the seed due to the barrier being on but no trials being active.
Looks like talking to Medigoron will crash the game on console if he's shuffled and you have Biggoron Sword. I haven't tested it without Biggoron Sword, so I'm not sure if that's actually related. I haven't tried it on emulator either. Anyways, here's the spoiler log and nice little PNG with a yellow bar in the corner.
OoT_C1B7C_WhackySnacky_Spoiler.txt
A plando like the following should either produce a potion shop whose exits are tied together (so that it's only reachable via a one-way connector), or give an error about that being impossible (as with this example, both because it doesn't have mixed pools to connect the entrances together and because it doesn't have a setting like warp song shuffle to make the shop reachable):
{
"settings": {
"shuffle_interior_entrances": "all"
},
"entrances": {
"Kak Potion Shop Front -> Kakariko Village": "Kak Potion Shop Back"
}
}
On TestRunner's fork, this plando generates an error message as expected. However, on this fork, it generates a seed with this in the spoiler log:
"Kakariko Village -> Kak Potion Shop Front": "Kak Potion Shop Back",
"Kak Backyard -> Kak Potion Shop Back": "Kak Odd Medicine Building",
"Kokiri Forest -> KF Midos House": "Kak Potion Shop Front",
The randomizer seems to be misinterpreting the entrance as its opposite, thus making the potion shop reachable from Kakariko.
Ganon's Castle included for an ER option, if possible option to add barrier requirements instead of bridge or ganon immunity.
Possible addition of random coloured (rainbow? :D ) Fairy Spells and Magic arrows would be something.
Have had this now happen twice since using the Dev Build on Everdrive with N64 Hardware (compressed file). Once I complete the first 1000 pt Archery challenge at Gerudo Fortress my game crashes right before acquiring the item.
This seed crashes each time the Windmill is exited as child (entered from playing Requiem of Spirit). I assume this has to do with the sandstorm actor that's supposed to load when entering Gerudo Fortress from Wasteland, as that was a problem in the past with Beta Quest, but not for certain.
OoT_43A0A_3O9Y1ZA6WA_Spoiler.zip
Edit: Here are the error message screens from the Debugger in order:
Screen 1: "HungUp on Thread 4
RCP is HUNG UP!!"
Screen 2: "actor dlftbls 471
No. RamStart-RamEnd Offset
9 80240870-802416a0 006270b0
24 801dd530-801e1ef0 006a85d0
35 802416d0-802426a0 00654030
291 801e5df0-801e65a0 00897960
339 801e4da0-801e5af0 008dda10
465 801e2760-801e33a0 0099d100"
Screen 3: "CallBack (1) 800088a8 00000000 00000000"
I've downloaded several different versions of node & python, finally after talking to my friend who's familiar with coding he told me to get the node 12.13.0 because apparently that's the only one that actually works with this package. Everytime I open GUI.py it just hits me with "Node not installed please install node" and then instantly loads up the node website on my browser. Despite trying 6 different versions of node, even moving the randomizer files INTO my node installation folder would not get gui.py do detect it.
Running "run.js" inside of the GUI folder does give me some results, it fully downloads electron and successfully does everything up until an inevitable error telling me to "Run gui.py first"
Just wondering if maybe I have the wrong version of python installed? Sorry if this is the wrong place to ask I'm just truly, truly at my wits end trying to get this to work lol. Like there is no attempt to even detect node on my computer, it spits out that "No node detected" message and instantly closes to nodes installation page.
When we activate "Decouples entrance", add an option to add single entrance random like Gerudo Valley to Lake
Add fortress interior entrances
Add dungeon boss entrance
Sun song and death warp like BQ
Maybe add GC entrance (Suggestion #9 ) but add end trial entrance too (like BQ)
This tab would randomize the main tab and the other tab, with options to add or exclude settings you don't want to be random (you choose manually). Add an option to hide or show the settings, so the code behind this would be a "setting string generator", this tab idea would generate randomly a setting string that applies automatically.
Note that people use a python script to do something similar, it would be nice to have this directly in the rando GUI.
few buddies of mine came up with a really cool idea,
take all SMALL chests locations and all of gossip stone locations and mix them into a single pool and spawn them in world.
There are many ladder in the game (such as in forest temple) that I feel should be hookshotable as faster ways to climb. The ones in forest are made of wood so it makes sense they should be hookshotable like all other wooden ladders in the game (especially as you have just got the hookshot to reach forest temple). There's also instances that some metal ladders are hookshotable, such as the hidden skull in fountain, but others are not (wasteland structure).
This is more of something that grinds my gears personally, after beating over 200 seeds. such a small timesave would make some places a lot faster in routing
If needed I can compile a list of ones that can not be used with the hookshot to assist if you decide to add this feature.
Encountered in the 3-man seed 913318:
Dunno what build/commit the site's using, but I'm sure it could be inferred based on generation time.
The setting "Skip Child Zelda" is turned on and player 2 starts with a PotT in their pocket courtesy of the ZL check:
"Song from Impa [W2]": {"item": "Triforce Piece", "player": 2}
However, this PotT did not appear in worlds 1/3. We had to manually declare victory once world 2 finished the game.
The PotT spawns in everyone's pockets at the start of the game. I haven't peeked at the code, but I'm assuming propagation logic is already there and is simply choking on the fact that P2 "owns" this item.
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.