Code Monkey home page Code Monkey logo

papyri's People

Contributors

jason-green-io avatar timomeijer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

papyri's Issues

Many saved .mca files are not rendered

Hi! Papyri looks amazing, thank you so much for making it and making it available! I don't know if you are interested in drive-by issue reports like this. Ignore it if you wish, I understand.

I've just run it against my world, and only a fraction of the explored area is rendered - about 30 square areas, gathered in a few discontinuous areas:

Screenshot from 2020-04-12 13-58-09

The blue "region" squares do correspond to the *.mca files I have saved in "region". I expected the landscape for all this area to be rendered on the map, since I've only walked/rode/sailed continuously around the map, not teleported from one distant location to another.

Adding --includeunlimitedtracking has added a few more areas (included in the above screenshot), but not many.

Presumably this is somehow my own fault or misunderstanding. If so, apologies for the noise.

I have a vague suspicion that my problem might be due to my creating the map in single player, playing for a while, then pointing a server at it and running it multi-player ever since then.

I'm going to have a look at the code, see if I can understand it. Any clues what I'm doing wrong would be appreciated.

ValueError: invalid literal for int() with base 10: String('minecraft:overworld')

Hi,

First off, thank you so much for making this project. It's pretty much exactly what I want in a server-side map viewer and I'm so glad this exists.

I recently created a small, private Minecraft server (1.16.3, but we plan to keep it updated to the latest release on each update) for me and my family, and we're trying to use Papyri to create a browseable map we can use. I'm on the latest commit as of right now (1ce7743) but when trying to create the map, we get an error:

(papyri-virtualenv) mineserver@matrix ~/papyri $ python papyri.py --world $HOME/minecraft-server/worlds/matrixcraft/world --output $HOME/www/map --copytemplate
map_*.dat nbt -> png:   0%|                                                              | 0/24 [00:00<?, ?it/s]
Traceback (most recent call last):
  File "papyri.py", line 715, in <module>
    main()
  File "papyri.py", line 685, in main
    makeMapPngJava(args.world, mapsOutput, unlimitedTracking=args.includeunlimitedtracking)
  File "papyri.py", line 335, in makeMapPngJava
    mapDim = int(mapNbt["data"]["dimension"])
ValueError: invalid literal for int() with base 10: String('minecraft:overworld')

Is there something I'm doing incorrectly?

Needs 1.14 update

The mapper seems to have stopped functioning since the 1.14 update. Perhaps something with the cartography updates broke it?

dzsave

MC 1.13


[minecraft@mc5 papyri]$ python3.5 papyri.py --mcdata /home/minecraft/server/world/ --output /home/minecraft/static
2018-07-30 15:04:07,101 Namespace(banners=False, mapstats=False, mcdata='/home/minecraft/server/world/', nostitch=True, output='/home/minecraft/static', overlay=False, poi=False, zoomlevel=6)
2018-07-30 15:04:07,101 Copying template web files
2018-07-30 15:04:07,155 Found 142 maps
2018-07-30 15:04:07,156 Parsing map .dat files
2018-07-30 15:04:07,250 Creating folder for overworld
2018-07-30 15:04:07,254 Creating folder for end
2018-07-30 15:04:07,255 Creating folder for nether
2018-07-30 15:04:07,256 Rendering 3 big maps for overworld
2018-07-30 15:04:07,759 Stitching map at -64, -64 zoom level 2 relative coords (0, 0), (512, 512) in 0_-64_-64
2018-07-30 15:04:07,767 Stitching map at -64, 448 zoom level 2 relative coords (0, 512), (512, 1024) in 0_-64_-64
2018-07-30 15:04:07,775 Stitching map at 448, 448 zoom level 2 relative coords (512, 512), (1024, 1024) in 0_-64_-64
2018-07-30 15:04:07,782 Stitching map at 448, -64 zoom level 2 relative coords (512, 0), (1024, 512) in 0_-64_-64
2018-07-30 15:04:07,788 Stitching map at 448, 704 zoom level 1 relative coords (512, 768), (768, 1024) in 0_-64_-64
2018-07-30 15:04:07,793 Stitching map at 192, 448 zoom level 1 relative coords (256, 512), (512, 768) in 0_-64_-64
2018-07-30 15:04:07,798 Stitching map at 192, 192 zoom level 1 relative coords (256, 256), (512, 512) in 0_-64_-64
2018-07-30 15:04:07,802 Stitching map at 576, 704 zoom level 0 relative coords (640, 768), (768, 896) in 0_-64_-64
2018-07-30 15:04:07,806 Stitching map at 320, 448 zoom level 0 relative coords (384, 512), (512, 640) in 0_-64_-64
2018-07-30 15:04:07,811 Stitching map at 320, 320 zoom level 0 relative coords (384, 384), (512, 512) in 0_-64_-64
2018-07-30 15:04:07,815 Stitching map at 448, 320 zoom level 0 relative coords (512, 384), (640, 512) in 0_-64_-64
2018-07-30 15:04:07,819 Stitching map at 448, -64 zoom level 0 relative coords (512, 0), (640, 128) in 0_-64_-64
2018-07-30 15:04:07,823 Stitching map at 448, 64 zoom level 0 relative coords (512, 128), (640, 256) in 0_-64_-64
2018-07-30 15:04:07,826 Stitching map at 576, 64 zoom level 0 relative coords (640, 128), (768, 256) in 0_-64_-64
2018-07-30 15:04:07,830 Stitching map at 576, -64 zoom level 0 relative coords (640, 0), (768, 128) in 0_-64_-64
2018-07-30 15:04:07,834 Saving PNG for 0_-64_-64
2018-07-30 15:04:17,602 Converting png to deepzoom
Traceback (most recent call last):
  File "papyri.py", line 526, in <module>
    pyvips.Image.new_from_file(outPngFile, access='sequential').dzsave(os.path.join(mapOutputPath, "temp"), suffix=".png")
  File "/usr/lib/python3.5/site-packages/pyvips/vimage.py", line 783, in call_function
    return pyvips.Operation.call(name, self, *args, **kwargs)
  File "/usr/lib/python3.5/site-packages/pyvips/voperation.py", line 132, in call
    op = Operation.new_from_name(operation_name)
  File "/usr/lib/python3.5/site-packages/pyvips/voperation.py", line 60, in new_from_name
    raise Error('no such operation {0}'.format(operation_name))
pyvips.error.Error: no such operation dzsave
  VipsOperation: class "dzsave" not found


papyri version 2.0.1 not working on Windows 10

Some basic information:
OS - Windows 10.
Server - Python (Just did as suggested in the Readme.md)

Issues

Papyri.py
Unable to find folders containing ":" - colon (":") is an illegal character in windows 10 when used in a pathname. Suggest using underscore or dash("-"). Actual error was along the lines of directory not found.
Related to above - The maps.jason continued to be created with colon in the file, and we just could not find out where it came from :S

This section of the index.html did not work due to an error saying "cannot read property of '_layerAdd'" (bear in mind that we replaced the : with _)
```
map = L.map('map', {
crs: L.CRS.pr,
layers: [tileLayers["minecraft_overworld"]],
//touchZoom: false
});

we found a working fix by replacing this with
  map = L.map('map', {
        crs: L.CRS.pr,
        minZoom: minZ,
        maxZoom: maxZ
    }).setView([0, 0], 14);

layer = L.tileLayer('./tiles/{id}/{z}/{x}/{y}.png', {
        id: "minecraft_overworld",
    minZoom: 7, maxZoom: 15,
       }).addTo(map);  
as you can see, we also had to add a min, max zoom, and using setView, this was due to the error "Set map center and zoom first"

Help with older MC (v1.5.2) maps

I've got maps from a MC server running 1.5.2 (needed for Better Than Wolves mod). Papryi can draw the maps but doesn't seem to construct the tiles correctly.

Screen Shot 2022-12-12 at 1 39 11 PM

Blank Index.html

Hi!
Love the idea behind Papyri. Probably just stupid:

Index.html just gives a blank page :(
Can see the Maps in "maps" and "merged-maps", would love to see the finished result :)

Have the feeling I'm missing something simple. Do I need to access the index.html with a certain program?

Attached my output below.

C:\Tools\Minecraft\papyri-master>cd C:\Tools\Minecraft\papyri-master

C:\Tools\Minecraft\papyri-master>papyri.py --world "C:\Tools\Minecraft\Testwelt\TTTMNL (Anaheim)" --type java --output "c:\mcmap\Anaheim"
C:\Tools\Minecraft\papyri-master\papyri.py:18: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
  import distutils.dir_util
2022-06-14 19:51:22,211 Found 88 maps in C:\Tools\Minecraft\Testwelt\TTTMNL (Anaheim)\data
map_*.dat -> nbt        : 100%|████████████████████████████████████████████████████████████████████████████████████████
nbt -> png              :   0%|                                                                                        C:\Tools\Minecraft\papyri-master\papyri.py:416: DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.NEAREST or Dither.NONE instead.
  mapImage = mapImage.resize((128 * 2 ** scale,) * 2, Image.NEAREST)
nbt -> png              : 100%|████████████████████████████████████████████████████████████████████████████████████████
2022-06-14 19:51:23,558 Processed 64 maps
level 4 of dim: minecraft@overworld: 100%|█████████████████████████████████████████████████████████████████████████████
level 4 -> zoom 17 tiles:   0%|                                                                                        C:\Tools\Minecraft\papyri-master\papyri.py:575: DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.NEAREST or Dither.NONE instead.
  tilePng = tilePng.resize((256, 256), Image.NEAREST)
level 4 -> zoom 17 tiles: 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 16 tiles           :   0%|                                                                                        C:\Tools\Minecraft\papyri-master\papyri.py:597: DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.NEAREST or Dither.NONE instead.
  tilePng = tilePng.resize((256,256), Image.NEAREST)
zoom 16 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 15 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 14 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 13 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 12 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 11 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 10 tiles           : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 9 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 8 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 7 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 6 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 5 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 4 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 3 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 2 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 1 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
zoom 0 tiles            : 100%|████████████████████████████████████████████████████████████████████████████████████████
2022-06-14 19:51:29,761 Copying template to c:\mcmap\Anaheim
2022-06-14 19:51:29,799 Done

C:\Tools\Minecraft\papyri-master>Pause

add support for modded

Hello,
I have tried to render the map of my server using papyri and had this error:

map_*.dat nbt -> png: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 18861/18861 [04:10<00:00, 75.42it/s]
level 4 of dim: 0: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 62/62 [00:10<00:00,  6.08it/s]
level 4 of dim: 14: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:00<00:00,  8.27it/s]
level 4 of dim: 15: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:01<00:00,  6.33it/s]
level 4 -> zoom 17 tiles: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 71/71 [00:38<00:00,  1.82it/s]
zoom 16 tiles: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4544/4544 [00:29<00:00, 153.11it/s]
zoom 15 tiles: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1136/1136 [00:07<00:00, 149.10it/s]
zoom 14 tiles: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 284/284 [00:01<00:00, 142.97it/s]
zoom 13 tiles: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 71/71 [00:00<00:00, 134.14it/s]
zoom 12 tiles: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 54/54 [00:00<00:00, 230.33it/s]
zoom 11 tiles: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 43/43 [00:00<00:00, 249.09it/s]
zoom 10 tiles: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 35/35 [00:00<00:00, 262.95it/s]
zoom 9 tiles: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 29/29 [00:00<00:00, 270.05it/s]
zoom 8 tiles: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 22/22 [00:00<00:00, 264.25it/s]
zoom 7 tiles: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 18/18 [00:00<00:00, 271.93it/s]
zoom 6 tiles: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 13/13 [00:00<00:00, 263.55it/s]
zoom 5 tiles: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 11/11 [00:00<00:00, 280.18it/s]
zoom 4 tiles: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 258.12it/s]
zoom 3 tiles: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 286.98it/s]
zoom 2 tiles: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 294.23it/s]
zoom 1 tiles: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 289.78it/s]
zoom 0 tiles: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 290.44it/s]
Traceback (most recent call last):
  File "./papyri.py", line 715, in <module>
    main()
  File "./papyri.py", line 706, in main
    genMapIdMarkers(maps, args.output)
  File "./papyri.py", line 636, in genMapIdMarkers
    "dimension": dimDict[dimension],
KeyError: 14

Do you please have an idea how to make it work ?

Many thanks.

Error when renaming map

Note we are using the windows fixes provided by Sabotender

Line: 395         oldFilename = mapPngFilenameFormat.format(**currentIds.get(mapId)._asdict()).replace(":", "@"      

Gives the following error:

D:\Documents\Minecraft\PapyrusServerMap>Python papyri.py --world D:\Documents\Minecraft\BukkitServer\Westerdale_one --type java --output D:\Documents\Minecraft\PapyrusServerMap\Output --copytemplate --debug
2020-12-14 23:08:04,259 Found 158 maps in D:\Documents\Minecraft\BukkitServer\Westerdale_one\data
map_*.dat -> nbt        : 100%|████████████████████████████████████████████████
nbt -> png              :   0%|                                                2020-12-14 23:08:04,413 0 is a new map
nbt -> png              :   0%|
Traceback (most recent call last):
  File "papyri.py", line 698, in <module>
    main()
  File "papyri.py", line 674, in main
    latestMaps = makeMaps(args.world, mapsOutput, serverType=args.type, unlimitedTracking=args.includeunlimitedtracking)
  File "papyri.py", line 395, in makeMaps
    oldFilename = mapPngFilenameFormat.format(**currentIds.get(mapId)._asdict()).replace(":", "@")
AttributeError: 'NoneType' object has no attribute '_asdict'

Looks like currentIds.get is failing to find the map, resulting in a "NoneType"

No module named 'bedrock'

I can't seem to run this, I get a package not found error, and the provided documentation is minimal. I assume I'm missing something really obvious?

Python Version 3.8.2. Trying to build a Java 1.16 world, but if it's failing on an import/includes I assume that's not the problem?

Thanks,

C:\Users\Kriss\Downloads\papyri-master\papyri-master>python papyri.py --world "C:\MC1.16\world\"
Traceback (most recent call last):
  File "papyri.py", line 7, in <module>
    import bedrock.leveldb as leveldb
ModuleNotFoundError: No module named 'bedrock'

Change default coordinates

Hey there!

Thanks for this tool, it's awesome to be able to have such a map of our world! :)

The small pain point I have is because, in my server, we've moved to something like -8000, -2000, which means you have to dezoom quite a bit before seeing the map.

It's solvable by sharing the URL with the coordinates inside them, or having a redirect, but it would be great to be able to set the default coordinates via a flag at build time (or use the world spawn coordinates instead of (0,0), we've moved it with /setworldspawn).

prioritization of overlapping maps

The readme says:

"Papyri will prioritize rendering so that maps with higher detail are rendered on top of maps of lower detail and maps at the same detail are rendered in order from oldest updated to newest updated"

As I can see, that's exactly how it works. But in my opinion that's not the best way to handle it.

I'm exploring wide areas with maps scaled 1:8 (zoom level 3). To do so I have to create a map with zoom level 0 first, then zooming out, which creates additional maps. You don't have to use the intermediate zoom level maps (e.g. leaving them empty) but the first map has to be used in order to be created in the first place.

This ends up with 4 maps, a 1:1 map which is partialy filled, two empty 1:2 / 1:4 maps and the desired 1:8 map which is the only one I'm using to explore. The first 3 got used up while zooming out at the cartography table. With this result I'm unable to reflect terrain changes by using the 1:8 map in the area the 1:1 map has allready covered. I could make a copy of the 1:1 map but then I had to keep two sets of maps up to date.

I think it would be better to prioritize up-to-date maps over higher detailed maps or at least implement an option to choose which way map data should be chosen.

edit: typo

plugin API or file format for overlay plugins

region files overlay should be a separate plugin or something
map ids will use the plugin API

  • convert index.html to use the plugin json and iterate over plugins to load geoJSON
  • remove specific fomatting code from index.html and include in geoJSON
  • remove region code

Breaks with index out of range error

Running a headless 1.17.1 java edition server on Ubunto 20.04 and when pointing to the world file I get this error:

root@willowhawk-server:/var/papyri# python3 papyri.py --world /srv/minecraft/world --type java --output /var/www/html --debug
2021-08-29 14:13:15,319 Found 37 maps in /srv/minecraft/world/data
map_*.dat -> nbt        : 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████
nbt -> png              :   3%|███
Traceback (most recent call last):
  File "papyri.py", line 702, in <module>
    main()
  File "papyri.py", line 678, in main
    latestMaps = makeMaps(args.world, mapsOutput, serverType=args.type, unlimitedTracking=args.includeunlimitedtracking)
  File "papyri.py", line 351, in makeMaps
    colorTuples = [allColors[x % 256] for x in mapColors]
  File "papyri.py", line 351, in <listcomp>
    colorTuples = [allColors[x % 256] for x in mapColors]
IndexError: list index out of range

Maps aren't updating

For some reason, maps aren't updating for a few regions even after terrain changes are done. I have those same regions updated pretty well inside the game-maps but Papyri isn't reflecting it. It's the same issue on both stable and dev builds. I have attached a ss showing the areas where I have made changes that aren't reflecting.
Screenshot 2022-03-19 211609

How secure is it to host Papyri on the Python Server?

Loving the Papyri app - our server has been using it a ton ^^

This isn't really a Papyri issue but I hope you can help because I am having a hard time finding the information I need.

I was running Papyri on the Python server when I saw some weird activity trying to connect - I think it was malicious actors trying to insert commands to the server and definitely not legitimate activity of somebody using papyri. I got concerned and took my server down.

After this I moved the Papyri hosting to a provider - but the upload time there is horrendous! With the provider, the map can update once every 12 hours, vs once every hour when I had it locally.

So I guess my question (or issue) is: What do I need to do - if anything - to run the python server securely on my own machine? I know enough about internet security to get concerned, but not enough to know what precautions to take.

`.dzi` files are named with two extentions & Resources missing to load webpage

0.-16448.-64.dzi.dzi
0.-16448.-64.dzi_files
0.-64.-16448.dzi.dzi
0.-64.-16448.dzi_files
0.-64.-64.dzi.dzi
0.-64.-64.dzi_files

These files seem to be named wrong. When you launch a web server, it fails to find the content because it looks for the file 0.-16448.-64.dzi.

This happens after generating for the first time.

The directory also is also missing images and openseadragon.

Newer maps of same dimension, region and zoom level, overwrite older maps with white "unexplored" information

Noticed that a friend on the server had made a new map and was exploring the same region that I had spent most of my time in. When I went and check out my house I saw that much of my region was unexplored, despite me having an explored map for it.

The issue is probably that the code just takes the newest map and ignores older ones - on the presumtion that newer maps are the most up to date, but then you run into issues like this
Oldest - most explored map
15 48c0594ef953d292919a4609c79e8ded 1607390244 minecraft@overworld 960 -1088 4
Newest, barely explored map.
71 b546038459917bb45d62358b395039f2 1607439867 minecraft@overworld 960 -1088 4

I don't know how you would do it specifically, but I suggest that before sticking the tiles together, if there are several maps of the same dimensions and region, you merge them pixel by pixel by pixel, replacing pixels from the oldest map with pixels from the newest map only if the pixel on the newer map isn't transparent.

Setting zoomlevel crashes out

When I call the below:
python3 papyri.py --mcdata ~/minecraft_servers/mc/minecraft/world --output template --zoomlevel 8

I receive the following error message:


2018-02-28 23:01:18,538 Namespace(mapstats=False, mcdata='/home/tomas/minecraft_servers/mc/minecraft/world', nostitch=True, output='template', overlay=False, poi=False, zoomlevel='8')
Traceback (most recent call last):
  File "papyri.py", line 77, in <module>
    canvasSize = 2 ** (8 + args.zoomlevel)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.