Giter VIP home page Giter VIP logo

adventurelookup's Introduction

AdventureLookup

Repository of AdventureLookup, a search engine for tabletop adventures. AdventureLookup was originally proposed by Matt Colville in this video.

Branch CI Code Analysis Link
master Build Status codecov https://adventurelookup.com
dev Build Status codecov https://dev.adventurelookup.com

Contributing to Adventure Lookup

AdventureLookup is an Open Source project. You do not need programming experience to contribute to the project! Please read the CONTRIBUTING.md file for more information on how to contribute.

Setting up a development environment

We are trying to make contributing as easy as possible by providing the Gitpod and Vagrant setups described in this section. If you run into any issues while setting up your development environment, please let us know by opening an issue.

To get you up and running quickly, you have three options to set up your development environment:

  1. Gitpod online IDE
  2. Vagrant with VirtualBox
  3. Vagrant with Docker

Using Gitpod is by far the simplest approach: All you have to do is click the following button and sign in with GitHub. A VSCode-based online IDE will spin up with all dependencies preinstalled. The rest of this section is only relevant when using Vagrant.

Gitpod Open-Online-IDE

If you don't want to use an online IDE, but instead use your own editor, you should use Vagrant and either VirtualBox or Docker to start up a VM/container with all the dependencies preinstalled.

Using VirtualBox is recommended if you have are using Windows without Hyper-V available/enabled. In all other cases, Docker is recommended and faster.

After downloading and installing Vagrant and either VirtualBox or Docker:

# Clone the repo to your local machine (this is readonly; you need to fork if you want write)
git clone [email protected]:AdventureLookup/AdventureLookup.git

cd AdventureLookup

# Create and provision the VM
# This takes quite some time on the very first start

# If you installed Docker:
vagrant up --provider=docker

# If you installed VirtualBox
vagrant up --provider=virtualbox

Execute the following commands to finish the installation:

# Log into the VM
vagrant ssh
# You should be inside the /vagrant folder.

# Install PHP dependencies
composer install -n --no-suggest

# Install Frontend dependencies, can be run outside the virtual machine
npm install

# Setup database (confirm with 'y')
php bin/console doctrine:migrations:migrate

# Create Elasticsearch index
# This command will log a warning when run for the very first time.
# You can safely ignore it.
# WARNING   [elasticsearch] Request Failure: ...
php bin/console app:elasticsearch:reindex

# You can either generate random adventures or load real adventures from adventurelookup.com.
# Please note that loading real adventures might not always work, since the development version
# might expect a different API response than the version on adventurelookup.com provides.
# In addition, adventures fetched from adventurelookup.com don't include change requests or reviews.

# Either load random adventures (confirm with 'y')
php bin/console doctrine:fixtures:load --fixtures src/AppBundle/DataFixtures/ORM/RandomAdventureData.php

# Or load real adventures (confirm with 'y')
php bin/console doctrine:fixtures:load --fixtures src/AppBundle/DataFixtures/ORM/RealAdventureData.php

# Re-create the search index after loading adventures.
php bin/console app:elasticsearch:reindex

You can execute the following command to create dummy users:

# Creates 'user', 'curator' and 'admin' users, all with password 'asdf'
php bin/console doctrine:fixtures:load --append --fixtures src/AppBundle/DataFixtures/ORM/TestUserData.php

If you didn't use Vagrant but an existing MySQL database, adjust the app/config/parameters.yml file to match your database credentials.

Running the application

# Start Symfony development server on port 8000 to run the application
# Must be run inside the virtual machine you used `vagrant ssh` to get into earlier
php bin/console server:start 0.0.0.0:8000

# Start webpack to watch changes to assets and recompile them
# Can be run inside the virtual machine or outside of the virtual machine
# If run inside the virtual machine:
npm run dev-server-guest
# If run outside the virtual machine:
npm run dev-server-host

# Wait until you see 'DONE Compiled successfully in XXXXms' (may take a few seconds)

The application is now running at http://localhost:8000. ElasticSearch can be accessed at http://localhost:9200.

Running tests

Tests use PHPUnit to run. There are three testsuites, one with unit tests, one with functional tests and one with browser tests. Unit tests can be executed like this:

php vendor/symfony/phpunit-bridge/bin/simple-phpunit --testsuite unittests

Functional tests can be executed like so:

php vendor/symfony/phpunit-bridge/bin/simple-phpunit --testsuite functional

Browser tests require Google Chrome with remote debugging enabled as well as the application running in the test environment. To do that, execute bash scripts/prepare-browser-tests.sh once before executing the tests. There is no need to call the script again until you reboot. Then execute the following to run the browser tests:

npm run build
php bin/console cache:clear --env test
php vendor/symfony/phpunit-bridge/bin/simple-phpunit --testsuite browser

Debugging

If you want to dump the contents of a variable, the simplest way is to call dump($var). dump() is a function provided by Symfony. The result is displayed in the web debug toolbar.

You can also debug your code using XDebug by setting breakpoints.

  • For Gitpod, select "Debug" in the left toolbar and then run the [gitpod] Debug PHP Server task.
  • For Vagrant+VSCode, install the PHP Debug extension and run the [vagrant] Debug PHP Server launch configuration.

Then set a breakpoint and refresh your browser. The code should halt at the breakpoint. You do not need to install a browser extension to enable XDebug.

Ports used in development

Port Forwarded to host machine Purpose
3306 no MySQL
5900 yes VNC server (see scripts/prepare-browser-tests.sh)
8000 yes Application dev server
8001 yes Webpack dev server if run from within Vagrant
8002 no Webpack dev server if run from outside Vagrant
8003 no Application test server
9000 no * XDebug
9200 yes ElasticSearch
9222 no Chrome Remote Debugging

* debugging from your host works without forwarding the port, since XDebug connects to your host (in contrast to your host connecting to xdebug).

Tools used

  • Ubuntu 18.04 as the server
  • MySQL 5.7 to store the adventures
  • Elasticsearch 7.16.0 to search the adventures
  • PHP7.4 to run the application
  • Symfony 3 as the web framework
  • Composer as PHP package manager
  • Node.js 12 and npm 6 for frontend package management
  • Symfony Encore / Webpack for bundling frontend assets

Running the application in production

For information about server configuration, checkout the Symfony guide on server config. Make sure to read the Symfony guide on permissions if you run into permission problems.

You should configure your websever to set never-expiring cache headers for the /assets path (located in web/assets). Example Nginx configuration:

location /assets {
    expires max;
    add_header Pragma public;
    add_header Cache-Control "public";
}

adventurelookup's People

Contributors

agrif avatar burnhamrobertp avatar cmfcmf avatar coreycondardo avatar csams avatar damienbaudet avatar dependabot[bot] avatar j-frost avatar johnnyflash avatar jsaugustyn avatar mattfelten avatar sinh343 avatar wetterlicht avatar wigginns avatar zacharycauchi 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

adventurelookup's Issues

Failure setting up database

Hi, I'm getting the following error when I try setting up the database:

An exception occured in driver: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)

Change users table to user

Singular table names are the default behavior of Doctrine (when creating entities through tooling) and is desirable for a number of reasons well documented here.

All other database tables conform to this singular naming convention except users.

Created a new branch, dev, added branch protections

Created the dev branch that will be used for active development. Changes to the dev branch will go out to the staging server (presumably automatically, once I can get something configured for it). The dev branch is protected and requires PRs to be approved by a contributor with write permissions before it gets merged in.

The paradigm moving forward will be that master is only merged into from dev and the branch protections require a code owner to review those changes and approve them.

So for all future PRs, be sure you're targeting dev as the destination. If these turn out to be a pain or overly restrictive we can change the settings at any time in the future. As a side note, there are still 2 teams, Backend and Frontend from the python attempt. I'll probably clean up those teams (and users) sometime tonight or tomorrow and remove them from the organization.

Database migration failing

I am trying to set the latest version up on a different computer. Install is fine until the database setup step, which fails with the following error:

Migration 20180000000000 failed during Execution. Error Number of tag names changed!
[Doctrine\DBAL\Migrations\AbortMigrationException] Number of tag names changed!

Add ratings functionality

Ratings could be left by registered individuals on a per adventure basis. Ratings would be an binary field representing "thumbs up" (1) or "thumbs down" (0). A row for a user on a specific adventure would only exist if they've clicked either thumbs up or thumbs down. Maybe clicking the same option again removes your rating in case you change your mind?

Reviews will be implemented in a separate issue.

Updated visual design

I've been working on an updated visual design and user experience for the last few weeks.

A public Invision prototype is available here:
https://invis.io/D7CI37UFC

Sketch files are available here:
https://thisismess.box.com/s/k4omrg7dpyuzww3v56r46b9bqlnjr73q

I'll keep both of these links up to date as I continue refining the design and flow.

If you'd like to work on the Sketch files, you'll need to get a few typefaces. These are commercial typefaces, so I can't provide them as part of the source, or as a public download:

Adelle
DIN Pro

NPC Entity

Implement a static data format for NPC and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page.

Ensure the generated table is singular.

Entity properties:

  • Name

Author Entity

Implement a static data format for Author and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page.

Ensure the generated table is singular.

Entity properties:

  • Name

Server Upgrade Doc

As you guys are using tech I'm not very familiar with, I would appreciate a list of commands that you recommend I do whenever I pull from GitHub to the server.

Move simple fields into Adventure entity

 * min start level
 * max start level
 * start level range
 * soloable
 * num pages
 * pregenerated chars
 * link
 * thumb
 * tactical maps
 * handouts
 * description
 * found in

Can we set up Projects?

It would be helpful to know what people are working on so we don't duplicate effort. Can we use the kanban feature of Projects for that? If so, can I get access to the Projects functionality?

Publisher entity

Implement a static data format for Publishers and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page.

Ensure the generated table is singular.

Entity properties:

  • Name

Change readme's production server instructions

Current version of the production server advocates for non-production configuration, notably, using libapache2-mod-php7.0 instead of the significantly more performant libapache2-mod-fastcgi

When this is undertaken, it may be advisable to simply move to nginx for the ease of configuration and performance gains.

Need a Bulk Edit option

When editing an adventure, need a way to select many fields for Approve/Reject at once. Right now editing adventures is a pain in the butt.

Error running composer

When I run 'composer install -n' I get the following error:

Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the symfony-scripts event terminated with an exception


  [RuntimeException]
  An error occurred when executing the "'cache:clear --no-warmup'" command:
  PHP Fatal error:  Uncaught Symfony\Component\Debug\Exception\ClassNotFoundException: Attempted to load class "DOMDocument" from the global namespace.
  Did you forget a "use" statement? in /var/www/new.adventurelookup.com/html/vendor/symfony/symfony/src/Symfony/Component/Config/Util/XmlUtils.php:52
  Stack trace:
  #0 /var/www/new.adventurelookup.com/html/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php(263): Symfony\Component\Config\Util\XmlUtils::loadFile('/var/www/new.ad...', Array)
  #1 /var/www/new.adventurelookup.com/html/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php(41): Symfony\Component\DependencyInjection\Loader\XmlFileLoader->parseFileToDOM('/var/www/new.ad...')
  #2 /var/www/new.adventurelookup.com/html/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php(72): Symfony\Component\DependencyInjection\Loader\XmlFileLoader->load('web.xml')
  #3 /var/www/new.adventurelookup.com/html/vendor/symfony/symf in /var/www/new.adventurelookup.com/html/vendor/symfony/symfony/src/Symfony/Component/Config/Util/XmlUtils.php on line 52

.

Users should not be able to link to known bad sites

People are going to want to post links in the URL field to illegal PDFs. By and large these PDFs are all hosted in a handful of sites, which we should be able to blacklist.

And we should be able to add to that blacklist.

Users who submit links to these sites should get an error "Please do not link to torrent sites or illegal pdfs."

It would also be nice if the admins would get an alert when this happens so if there are repeat offenders among the curators, we can ban them.

Which means we may need the facility to ban people. :D

Is there a way to roll back an edit?

I guess this is part of the larger issue with tracking changes and being able to see them. And obviously that anyone can make changes now.

I spent a while entering the first adventure from the first issue of Dungeon Magazine, The Dark Tower of Cabilar, and now it's gone. And someone else has entered it, but under a different name (typo in the title).

I want to make sure, when I talk about AL.com, folks don't have to worry about their content being destroyed capriciously. And if something like that does happen, there's a recourse.

Doctrine charset should be utf8mb4

Presently it is only utf8, which mysql built to only support up to 3 bytes of character data, which excludes a whole lot of character that are in the "UTF-8" charset. It is unilaterally recommended to change from utf8 to utf8mb4.

This is easy to do for local development environments and the staging server; we wipe the data and rebuild the database with no fuss. Production will have to be manually migrated. Fortunately its not difficult.

https://mathiasbynens.be/notes/mysql-utf8mb4

Forgot password functionality

There currently is no way to recover a lost password.
Implementing such a functionality would require emailing to be setup.

Remove And/Or box

I think this is a distraction and I don't clearly see the benefit.

Item Entity

Implement a static data format for Item and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page.

Ensure the generated table is singular.

Entity properties:

  • Name

Filter by Length (# of Pages) bug

Can't get this to work. No matter what range of pages I apply, no filter actually goes into effect. All adventures remain listed, regardless of their page count.

Handling updates to the server

I'm not sure it will scale well for @JohnnyFlash to be running out updates manually forever and ever. Its also probably not worth it to do a fully automated CI/CD approach, where the server gets update everytime there is a merge into the master branch.

Thoughts about something a little more pragmatic, like Deployer?

Re-add search filters for static fields

The index page needs search filters for the fields again.
When these are in again, the show page should link all info to the index page with the info's value preselected as filter.

Environment entity

Implement a static data format for Environment and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page.

Ensure the generated table is singular.

Entity properties:

  • Name

Implement correct permission scheme

The current permission model lacks in a few important aspects, i.e. everyone can create an account and simply delete all adventures. This needs to be fixed until Matt makes a video and opens ADL to a larger audience. Here is my proposed, simple model (keep in mind, we want this to happen as fast as possible). All access levels can do everything listed above in addition to their level. Note that there is no approval process in this design.

Guests

Can view and search adventures.

Users (everyone can create such an account) ROLE_USER

Can create new adventures, can edit and delete adventures they created.
Can comment on all adventures to suggest changes (really just a text input they can dump suggested changes into. This could of course be improved by allowing them to directly say which field to change to which value, but for now a simple comment box should be sufficient).

Curators (selected people only) ROLE_CURATOR

Can create and edit all adventures.
Can access the EasyAdmin backend except for user table.

Admins (Matt, Jerod, ...) ROLE_ADMIN

Can view user list and recent activity
Can access the full EasyAdmin backend

Can't merge upstream

Hey, I'm having a problem merging the current master into my local respository to stay synced. Specifically, I am getting the following error:

CONFLICT (modify/delete): ubuntu-xenial-16.04-cloudimg-console.log deleted in upstream/master and modified in HEAD. Version HEAD of ubuntu-xenial-16.04-cloudimg-console.log left in tree. Automatic merge failed; fix conflicts and then commit the result.

I suspect this has to do with moving vagrant to gitignore, but I'm not sure how to fix it. Can anyone with more git experience help me out?

Made a change to a record, now the record doesn't appear in search.

I edited the Deep Horizon record because it was linking to a copyright-violating site, and now the record doesn't show up when I search for it.

To be clear, it did show up originally, that's how I found it.

This is not the first time this has happened to me. Last time Jerry rebuilt the index and that fixed it. This definitely needs to be fixed before I go on YouTube and promote this thing. :D

Test thumbnail links for an https version

Since our site is hosted on https, we get an error if the thumbnail isn't also hosted on an https link.

It would be nice if people submit an http thumbnail that we test it for an https version and update the link accordingly.

It would also be nice to get a report in the admin of any thumbnails that are linked via http so we could possibly fix them.

Monster & MonsterType entities

Similar to the setting, implement a static data format for Monsters and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page. Relationship would be ManyToMany between Adventure and Monster.
Entity properties:

  • Name (string)
  • Type (foreign key)
  • Unique (boolean)

Example dataset:
Orc, Humanoid
Kobold, Humanoid
Goblin, Humanoid
Gnoll, Humanoid
Hobgoblin, Humanoid
Beholder, Aberration
Black Pudding, Ooze
Mind Flayer, Aberration
Drow, Humanoid
Wyrmling, Dragon
Bulette, Monstrosity
Hill Giant, Giant
Stone Giant, Giant
Frost Giant, Giant
Storm Giant, Giant
Kuo-Toa, Humanoid
Lich, Undead
Slaad, Aberration
Umber Hulk, Monstrosity
Arcanamite, Monstrosity
Warhorse, Beast
Gazer, Aberration
Skin Bat, Undead
Deva, Celestial
Unicorn, Celestial
Pegasus, Celestial
Eye Golem, Construct
Homunculus, Construct
Flesh Golem, Construct
Myr, Construct
Stone Golem, Construct
Azer, Elemental
Djinni, Elemental
Gargoyl, Elemental
Salamander, Elemental
Spark, Elemental
Water Elemental, Elemental
Annis Hag, Fey
Boggle, Fey
Cactid, Plant
Dragonleaf Tree, Plant
Myconid, Plant
Vegepygmy, Plant
Baneling, Fiend
Night Hag, Fiend
Hell Hound, Fiend
Ink Devil, Fiend
Rakshasa, Fiend
Rakshasa, Fiend
Coral Drake, Dragon
Ash Drake, Dragon
Dragon Turtle, Dragon
Luck Dragon, Dragon
Pseudodragon, Dragon
Star Drake, Dragon
Uniques
River King, Fey
Sarastra, Fey
Kalarel, Humanoid
Balor, Fiend
Akyishigal, Fiend
Alquam, Fiend
Zmey, Dragon

Monster Type example dataset
3e 3.5e
Aberration
Animal
Beast
Construct
Deathless
Dragon
Elemental
Fey
Giant
Humanoid
Magical Beast
Monstrous humanoid
Ooze
Outsider
Planetouched
Plant
Shapechanger
Undead
Vermin
4e
Animate
5e
Celestial
Monstrosity
Fiend

Need An "D&D Only" alert when adding an adventure

Someone busted their ass and added a ton of Star Wars data to the site, and I had to delete it because AL.com is D&D specific.

I want to make sure that doesn't happen again, so when someone clicks "Add an adventure" we need some text somewhere saying "AdventureLookup is for D&D and it's clones. Not other systems/genres."

Damn! error

I apparently disapproved and/or deleted an adventure that I had previously added while editing it. Now, if I try and add it again, I receive a page with only "Damn!" written in it and the adventure is not added and does not appear in search.

Edition entity

Implement a static data format for Editions and store it in an entity, generate its migration(s) and repository, and create a fixture to populate a subset of data for development purposes. Also, add it to the adventure/show and adventure/edit views and ensure the data is searchable via the free-text search box at the top of the adventures/index page.

Ensure the generated table is singular.

Entity properties:

  • Name (string)
  • Order (int)

Example data:

  • OD&D, 10
  • AD&D, 20
  • 3e, 30
  • Pathfinder, 40
  • 3.5e, 50
  • 4e, 60
  • 5e, 70

I've never played in it, but from some research it sounds as if B/X and BECMI didn't really change enough compared to the OD&D basic rules to warrant separate categorization? In any case, this is just an example, the admin interface would need to support adding more editions.

No user-defined fields

I think letting any registered user add fields is a bad idea. It has the potential to create a mess for moderators and a bunch of gaps in the database. For example, user A thinks to herself, "gee, I think there ought to be a filter for Cost...I'm gonna add it." At the same time, user B has the same thought and adds a field called "Price". Same data, two different field names. Even worse, user C thinks there ought to be a field for "contains elves", or something similarly arcane/weird. Nobody is able to ensure that data is being consistently entered for any of these user-defined fields, so we end up with bloated records that are missing tons of data.

I strongly recommend that we remove this feature in lieu of a fixed set of fields (basically the ones we already have). If users really want another field they can ask for it via a comment form or reddit. If we get enough requests it's easy enough to add a field deliberately.

Can't log in

When I try to log in, I get "Invalid credentials."

I'd like to be able to edit the list of entities

I assume I'm using this terminology correctly. The things that can populate a field within a record.

Right now people can add Orc and Orcs and while that isn't the end of the world, it bugs me. :D The search should return Orc result for Orcs and vice versa.

But more to the point, people can stick things in there, like Waterdeep for Setting, and then other people will think "Oh this Forgotten Realms adventure should be a Waterdeep adventure" and that is no bueno.

This functionality may already exist in an admin panel I do not wot of.

Exception

I got through install, but am now getting an exception when I try to run the site.

php bin/console server:start 0.0.0.0 and nodejs node_modules/webpack/bin/webpack --watch --progress both seem to work, but when I navigate to http://localhost:8000/app_dev.php I get the following:

Warning: SessionHandler::read(): Session data file is not created by your uid

The stack trace located the problem in var/cache/dev/classes.php at line 367

Add a play length filter

DMs often are looking for an adventure that they can run in X number of sessions, esp. one shots. An filter for how long an adventure takes to run (in hours, sessions, or a category indication) would be very useful to me. Next time multiple players cancel, I hope to find a one shot very quickly. :-)

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.