GithubHelp home page GithubHelp logo

mercator's Introduction

Mercator
WordPress multisite domain mapping for the modern era.
Build status Coverage via codecov.io
A Human Made project. Maintained by @rmccue.

Mercator is a domain mapping plugin for the New World. Using new features included with WordPress 3.9 and later, Mercator builds on the new multisite features and abilities to improve your world.

Stop using outdated practices, and start making sense.

Requirements

Mercator requires WordPress 3.9 or newer for the new sunrise processes. Mercator also requires PHP 5.3+ due to the use of namespaced code.

What is Domain Mapping?

When setting up a Multisite install, the network is configured to create sites either as subdomains of the root site (e.g. subsite.network.com) or subfolders (e.g. network.com/subsite).

Domain Mapping is the process of mapping any arbitrary domain (called an alias) to load a site. If an alias of arbitrarydomain.com is set for the site network.com/subsite, the site and wp-admin interface can be accessed over either the alias or the original URL.

Internally, Mercator looks at a request's domain and informs WordPress what set of tables to use. User authentication cookies are set for all domains in the network, so a user logs in on one site and is authenticated across all.

Installation

Mercator must be loaded during sunrise.

We recommend dropping Mercator's directory into your mu-plugins directory. You may need to rename the folder from Mercator-master to mercator.

Then create a wp-content/sunrise.php file with the following:

<?php
// Default mu-plugins directory if you haven't set it
defined( 'WPMU_PLUGIN_DIR' ) or define( 'WPMU_PLUGIN_DIR', WP_CONTENT_DIR . '/mu-plugins' );

require WPMU_PLUGIN_DIR . '/mercator/mercator.php';

Additionally, in order for sunrise.php to be loaded, you must add the following to your wp-config.php:

define('SUNRISE', true);

Aliases are created in the Network Admin > Sites > Edit Site screen.

DNS for mapped domains must be configured for the domain to point to the WordPress installation, as well as configuring the web server to route requests for the domain to the WordPress application.

Upgrading from WPMU Domain Mapping

This plugin is a complete replacement for WPMU Domain Mapping. The database structure is fully compatible.

Note that if you have Domain Mapping code in your sunrise, you should remove this and replace it with the recommended sunrise code above. Mercator hooks in to WordPress' internal site mapping code rather than replacing it, unlike Domain Mapping.

License

Mercator is licensed under the GPLv2 or later.

Credits

Created by Human Made for high volume and large-scale sites, such as Happytables. We run Mercator on sites with millions of monthly page views, and thousands of sites.

Written and maintained by Ryan McCue. Thanks to all our contributors.

Mercator builds on concepts from WPMU Domain Mapping, written by Donncha O'Caoimh, Ron Rennick, and contributors.

Mercator relies on WordPress core, building on core functionality added in WP27003. Thanks to all involved in the overhaul, including Andrew Nacin and Jeremy Felt.

Interested in joining in on the fun? Join us, and become human!

mercator's People

Contributors

carstingaxion avatar cfoellmann avatar chrisvanpatten avatar ericandrewlewis avatar ipstenu avatar joehoyle avatar mattheu avatar r-a-y avatar rmccue avatar roborourke avatar spacedmonkey avatar steelwagstaff avatar tcrsavage avatar tomjn avatar zamoose 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  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

mercator's Issues

database error

local MAMP installation:

  • mac os x: 10.9.4
  • apache: 2.2.26
  • php: 5.5.16
  • mysqld: 5.6.20
  • WordPress 4.0 multisite running locally with address mu.local

Trying to add an alias (sub1.local) I get the following error:

[14-Sep-2014 11:12:29 UTC] WordPress database error Table 'multisite.wp_domain_mapping' doesn't exist for query INSERT INTO `wp_domain_mapping` (`blog_id`,`domain`,`active`) VALUES (2,'sub1.local',0) call by require_once('wp-admin/admin.php'), do_action('admin_action_mercator-add'), call_user_func_array, Mercator\Admin\output_edit_page, Mercator\Admin\handle_edit_page_submit, Mercator\Mapping::create
[14-Sep-2014 11:12:29 UTC] WordPress database error You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'KEY domain (domain)
        )' at line 8 for query CREATE TABLE wp_domain_mapping (
                id bigint(20) NOT NULL auto_increment,
                blog_id bigint(20) NOT NULL,
                domain varchar(255) NOT NULL,
                active tinyint(4) default 1,
                PRIMARY KEY  (id),
                KEY blog_id (blog_id,domain,active)
                KEY domain (domain)
        ) call by require_once('wp-admin/admin.php'), do_action('admin_action_mercator-add'), call_user_func_array, Mercator\Admin\output_edit_page, Mercator\Admin\handle_edit_page_submit, Mercator\Mapping::create, Mercator\check_table, dbDelta
[14-Sep-2014 11:12:29 UTC] WordPress database error Table 'multisite.wp_domain_mapping' doesn't exist for query INSERT INTO `wp_domain_mapping` (`blog_id`,`domain`,`active`) VALUES (2,'sub1.local',0) call by require_once('wp-admin/admin.php'), do_action('admin_action_mercator-add'), call_user_func_array, Mercator\Admin\output_edit_page, Mercator\Admin\handle_edit_page_submit, Mercator\Mapping::create, Mercator\Mapping::create
[14-Sep-2014 11:12:29 UTC] WordPress database error You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'KEY domain (domain)
        )' at line 8 for query CREATE TABLE wp_domain_mapping (
                id bigint(20) NOT NULL auto_increment,
                blog_id bigint(20) NOT NULL,
                domain varchar(255) NOT NULL,
                active tinyint(4) default 1,
                PRIMARY KEY  (id),
                KEY blog_id (blog_id,domain,active)
                KEY domain (domain)
        ) call by require_once('wp-admin/admin.php'), do_action('admin_action_mercator-add'), call_user_func_array, Mercator\Admin\output_edit_page, Mercator\Admin\handle_edit_page_submit, Mercator\Mapping::create, Mercator\Mapping::create, Mercator\check_table, dbDelta
[14-Sep-2014 11:12:29 UTC] WordPress database error Table 'multisite.wp_domain_mapping' doesn't exist for query INSERT INTO `wp_domain_mapping` (`blog_id`,`domain`,`active`) VALUES (2,'sub1.local',0) call by require_once('wp-admin/admin.php'), do_action('admin_action_mercator-add'), call_user_func_array, Mercator\Admin\output_edit_page, Mercator\Admin\handle_edit_page_submit, Mercator\Mapping::create, Mercator\Mapping::create, Mercator\Mapping::create

.. and this continues, until php times out, with more attempts to Mercator\Mapping::create

Mappings are not deleted when sites are

Right now, it's possible to delete a site but have the mappings for the site remain around. If you go to use the same domain(s) again later, this will cause the new mappings to fail, but without any way to remove the old ones.

'login_url' filter issue with 'home_url()'

Hi

I have function making use of the 'login_url' filter, to use a custom user login page for sites on my network. In it I return a new login URL that I generate using the 'home_url()' function, since I determined that to be the best function to use to return the correctly mapped domain for a given site.

It doesn't work, however. My 'login_url' filter function works, since if I set it manually to another page on the site, or to google.com or something it works fine. It seems that I cannot properly use 'home_url()' (or 'site_url()' for that matter) on mapped domains when using Mercator. The function works fine for subdomains on my main network domain, just not for mapped domains.

Any ideas? Thanks.

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

After WP changes from utf8 to utf8mb4, when trying to create Aliases in Network Admin > Sites > Edit Site screen:

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

Caused by mercator.php:

  $schema = "CREATE TABLE {$wpdb->dmtable} (
    id bigint(20) NOT NULL auto_increment,
    blog_id bigint(20) NOT NULL,
    domain varchar(255) NOT NULL,
    active tinyint(4) default 1,
    PRIMARY KEY  (id),
    KEY blog_id (blog_id,domain,active),
    KEY domain (domain)
  );";  

Patched it by changing from:

domain varchar(255) NOT NULL,

change to:

domain varchar(191) NOT NULL,

If domain varchar(192), ERROR 1709 (HY000): Index column size too large, but domain varchar(191) is ok. So max domain varchar is 191.

Reason see: Mechanics of Flite - Prepping your MySQL indexes for a character set change Prepping Your MySQL Indexes for a Character Set Change

When changing a MySQL table or column to a new character set that uses more bytes than the old character set, you need to first check if any schema changes are needed to accomodate the change. For example, changing character sets from latin1 to utf8 is an increase from 1 to 3 bytes, and changing from utf8 to utf8mb4 is an increase from 3 to 4 bytes. .....

Tag new releases

It's rather risky for us to be tied to using a master branch on a production site. Anyway that you guys could start tagging your releases, so that we can use version numbers in our composer.json? 👍

Multiple aliases on site

If you have multiple aliases active on a single site, the site will redirect to the last added alias. It then gets itself into a redirect loop.

Worth I replace the standard domain mapping plugin with this. But this happened, when I deleted aliases and recreated them.

Domain setting per site

Do you have any plan to implement Domain Setting per site? or do you want contributor?

Natty

Disable multi login

I noticed the docs said

"Internally, Mercator looks at a request's domain and informs WordPress what set of tables to use. User authentication cookies are set for all domains in the network, so a user logs in on one site and is authenticated across all."

Is there any way to disable this? I don't want users being authenticated to any other site on the network unless explicitly set by the admin of that subsite.

Mapped domain with admin on subdomain

Sorry for the more "support request" than "issue" here but I want to make sure I haven't just set things up wrong before I open issues for all the problems I'm having.

My goal was:
To have the main domain: aarondcampbell.com
With WordPress actually in aarondcampbell.com/wp
And Content in aarondcampbell.com/content
Then to have domains like geekreprieve.aarondcampbell.com. I want wp-admin for those sites to be at geekreprieve.aarondcampbell.com/wp-admin or geekreprieve.aarondcampbell.com/wp/wp-admin (don't really care which), but I want the front end to be mapped and at something like geekreprieve.com (including things like the URLs used when inserting media into posts, etc).

Right now the subsites are set with:
Siteurl: http://geekreprieve.aarondcampbell.com/wp/
Home: http://geekreprieve.aarondcampbell.com/
Alias: geekreprieve.com

The admin for subsites seems functional at the expected location (http://geekreprieve.aarondcampbell.com/wp/wp-admin/) but also seems to work at the mapped location (not preferred). The front end works at the expected location (geekreprieve.com) but also works at geekreprieve.aarondcampbell.com (which I didn't expect). All media though is also inserted as geekreprieve.aarondcampbell.com/content

I wrote some code that filters upload_url to fix the media stuff, but I'm not sure if I should work it into a patch or, like I said, if I'm just doing something wrong.

First alias on a new multisite isn't activated

When you set the first alias on a new/clean multisite install and check the "activate" checkbox, the alias is created as inactive. You can manually activate the alias, and everything works fine from then on out.

I've confirmed this on a few separate multisite installs. Not a huge deal, but definitely a bug of some kind.

Unable to login if single sign-on is disabled

Whenever I disable the single sign on through the filter

add_filter( 'mercator.sso.enabled', '__return_false' );

I tracked down the cause of this to be the fact that the COOKIE_DOMAIN isn't defined as including something like

$dm_domain = $_SERVER[ 'HTTP_HOST' ];
define( 'COOKIE_DOMAIN', $dm_domain );

allows it to work again.

Can the Mercator be use to work with VVV on local?

Hi! I try to use the Mercator with VVV on Mac. I set my /etc/hosts file to 192.168.50.4 (vvv) but then i get kicked back to vvv.dev. I have sunrise.php and aliases are set properly.

192.168.50.4 vvv.dev
192.168.50.4 site1.dev (primary site works fine)
192.168.50.4 site2.dev

Enter "site2.dev" in browser => vvv.dev :(

Thanks for help

Setting primary domain

Have you thought about allowing a primary domain to be set? This is a major feature of the existing solution and seems like it'd be useful to incorporate into Mercator as well.

Documentation for aliases, primary domains and redirection

I have been testing Mercator on a new multisite setup and would like to see some more detailed documentation around aliases and the correct way to set a primary domain. At times I see sites enter into a redirect loop and think I am most likely doing_it_wrong.

Right now there are 4 places a domain name can be set within the network admin:

  • The info tab (which I am guessing has to remain as the sub-domain/sub-directory on a multisite e.g. mysite.multisite.com)
  • The site settings tab (which allows you to modify two site options for siteurl and home. I am guessing these should be set to the primary domain, e.g. mysite.com).
  • The aliases tab (which allows you to map other domains to your site. e.g. mysite.com and mysiterocks.com. If mysite.com is set as primary in siteurl and home I would have thought that mysiterocks.com would redirect but it does not. All aliases work standalone).

So my questions are:

  1. What is the correct way to set a new primary domain
  2. How do I get other domains to redirect to the primary domain to avoid duplicate content

Thanks

No Primary Domains?

With Wordpress MU Domain Mapping, I could set a domain alias as primary, and other aliases would point to it.

Now it just says 'active' or 'inactive'. There is no option for a primary alias.

Am I "doing it wrong"?
Thanks.

Menu links show site subdirectory in url

Site domain name: network.com
Site: network.com/site-1
Page: page-1

I create a new menu item for an existing page in the menu editor. The link shows up as
http://network.com/site-1/page-1
instead of
http://network.com/page-1

Navigating manually to http://network.com/page-1 works fine.

Domains that begin with a number are mangled

We have several subsites in our network with domains that begin with a number, each of them appears to be having the first number stripped out of the URL, I think issue may be happening in the regex here,

url = http://25dollarplumbing.sequoiaims.com regex = #^(\w+://)25dollarplumbing\.sequoiaims\.com#i current_mapping->get_domain = 25dollarplumbing.com preg_replace( $regex, '\1' . $current_mapping->get_domain(), $url );

output is 5dollarplumbing.com

Add domain mapping for networks

This is a tricky one.

If we have abc.base.example as the network, which is then mapped to abc.example, we need to make sure both sub.abc.base.example and sub.abc.example are mapped correctly, as well as any additional mappings.

SSO doesn't work when accessing wp-admin on subsite prior to the front-end

Steps to reproduce:

  1. Create a network with 2 subsites and (subsite1.example.dev and subsite2.example.dev) and map domain aliases (subsite1.dev and subsite2.dev).
  2. Login to the first subsite (subsite1.dev).
  3. Navigate to subsite2.dev/wp-admin/
  4. Get redirected back to (subsite1.dev) without getting logged into subsite2.dev.

If you hit (subsite2.dev) prior to trying to access wp-admin, you are then logged in.

Is this intended behavior? Shouldn't hitting wp-admin also trigger the SSO flow to get you logged into the second site?

Site admins are irritated that whenever they use the "My Sites" menu to try to go to a different site's dashboard, they are redirected, until they hit Visit Site first.

Login issues on new Mercator updates

I'm having trouble pinning down exactly what's happening here, but it seems like when I update Mercator, I have troubles logging into sites in my multisite instance.

The only way to fix it seems to be to clear my cookies for that particular site. Then everything works again until the next Mercator update.

Caveats: I'm not positive it happens every time Mercator updates, but it has definitely happened multiple times, and I know it's Mercator because it has happened when the only thing changing in the deploy is Mercator.

Potentially uninformed theory: is something causing the user's cookies to be invalidated somehow?

I've been having this issue for a while now but have declined to report it because (as you can probably tell) I don't have a full understanding of exactly what's happening under-the-hood, but after experiencing it today I figured better to raise the issue and see if it's something I'm doing wrong or a problem other people are noticing as well.

Thanks!

Endless redirect loop on some subsites

On the latest release 306176a - compared to what I had before I pulled (0f07fc6), I get the following behaviour.

Two of my subsites go into an endless redirect loop between their proper www.domain.com address, and something like rootsite.com/wp-admin/ajax.php?page=mercator-sso (could be that or page=mercator-sso-something) with a few other (long) arguments in the query string. The other sites are fine.

My setup: I have several sub-sites on a multisite network. Each sub-site is accessed by its own domain; I have the sub-site's domain www.domain.com as the sub-site URL set in network site settings (info tab), and an alias for non-www domain (active) and domain.rootsite.com (active). The two sub-sites that have a problem have domains that are hosted by hosting provider 'B' (whereas the rest of my sites are hosted by provider 'A'). I have confirmed with domain provider B that there are no problems with the DNS or anything their side.

I have tried removing all cookies. I have tried using private browsing mode in safari.

As these are production sites, I had to use git to hard reset.
+1 vote for tagging stable releases please :) My clients are counting on it.

Review / questions

Like it, so much cleaner than the “old” plugin that is typically used to do this. I have a few questions etc below. I did this while offline so sorry for no links, however having said that, you can’t comment on lines for committed stuff, unless maybe you do a new branch from the first hash, then create a pull-request to do a review of the whole project!

  • Rather than bootstrap() calling startup() seems it would make more sense to name bootstrap perform_checks() or something, then call startup() from the controlling caller code.
  • define( 'DOMAIN_MAPPING', 1 ); is this meant to be a boolean?
  • dbDelta wuuuuut… moving on…
  • DB schema, as most of core does, you have crossed terminology with “site” and “blog”, e.g. ' WHERE blog_id = %d', $site are you trying to use the same table schema as the old plugin?
  • class-mapping.php:364 check for WP_Error, however in seems get_by_domain() can only return an instance or null
  • in create() it seems you only try create the domain mapping table the fist time a domain mapping is attempted to be added. Given that this needs to be done in the a dmi (from that I can tell from create_table()) do you think that could be problematic? Thinking wp-cli commands, install scripts etc.
  • I couldn’t work out why you were rolling for own pages for the admin (header and footer), is it not possible to use the add menu page functions in network admin?
  • Is the use of $_REQUEST necessary though out the admin? I always wince a little when it is always $_GET / $_POST exclusively.
  • I didn’t see anything to do with redirecting the site path / subdomain to the mapped domain, that might be a handy feature.
  • The check for COOKIE_DOMAIN is potentially a bit full-on as without WP_DEBUG I think 99% of people wold miss the X-Mercator header, and you’ll just get a white screen 500 error. Would it be so bad to show this message if ! WP_DEBUG

Cookie loads

Hi, this plugin works very well and in my experience of working with the alternative mapping plugin this is by far superior.. The only issue I have with it is the load time of this code injected into the html. Although it contains 0Bytes it more than doubles the load time of the page when I test with pingdom. I just wonder if there is an issue with it or not.

<script src="http://site/wp-admin/admin-ajax.php?action=mercator-sso-js&#038;host=site&#038;back=http%3A%2F%2Fsite%2Fcontact%2F&#038;site=2&#038;nonce=932be8972d"></script> <script type="text/javascript"> /* <![CDATA[ */ if ( 'function' === typeof MercatorSSO ) { document.cookie = "wordpress_test_cookie=WP Cookie check; path=/"; if ( document.cookie.match( /(;|^)\s*wordpress_test_cookie\=/ ) ) { MercatorSSO(); } } /* ]]> */ </script>

Thanks for any pointers
Richard

How does this plugin work?

Hi,

I am taking a chance with this plugin since I am having major issues with WPMU Domain Mapping.

I followed the installation instructions, but now have now idea how to map my domains.

Any help would be greatly appreciated.

Alias does not redirect - no primary domain?

Is it possible to have the functionality available in "WPMU domain mapping" plugin, whereby a domain alias can redirect permanently to a main domain?

I am not able to get this to work.

Referencing ticket #3

Issue with primary domains

Hi again,

I am migrating from WPMU Domain Mapping plugin.

Upon reading ticket #3 and trying to adapt for my use, I can't get it to work;

I had site.network.com as the URL, and site.com (primary) and site.co.uk as the alias.
I changed it to site.com as the URL, and site.network.com (inactive) and site.co.uk (inactive) as aliases.

On purging the cache and reloading the primary domain with a new browser window (so as to be not logged in), I get "301 too many redirects", and the URL always redirects to site.co.uk.

Using nginx.

Mercator still supporting?

I like this plugin, but I don't understand @rmccue you're still support this cool extension or not?
Many issues and pull requests without responses.

Hint for a feature on core

create so much easier the settings page on network admin area.
Hi Ryan.
I will only leave a hint to a ticket on core to create so much easier a new tab, settings area on the sites of the network.
I have add a patch and wait also for release inside the core. Maybe you like the patch and can push the ticket.
https://core.trac.wordpress.org/ticket/15800

Best regards
Frank

Logging out on another domain doesn't log the user out

  • Log in to main domain
  • Go to alternative domain
  • Get logged in via SSO
  • Log out of the alternative domain
  • Next viewed page logs you back in via SSO

We should instead log out of the main domain, then sync that back across.

i18n

Hi, it is possible create sample translation *.po file?
I have czech translation. It works somewhere... For example dont work in listing class-alias-list-table.php

Wildcard Sub Domains Working - TLD not working with MultiSite

I have installed the plugin and sunrise to my multi site install, which I am hosting on a dedicated IP but it will not direct the TLDs to the configured site in the multisite configuration. I have check the .htaccess, location of the files mu-plugins and the sunrise files. It is unclear nor any notes on how to resolve this issue especially since there are no viable errors showing up.

Unable to access domain mapping settings

I got the following error when accessing the domain mapping settings.

screen shot 2014-12-08 at 20 23 40

I discovered I was getting this error the two reasons. Firstly your docs says to insert this

define('SUNRISE', true); instead of define('SUNRISE', 'on' );

Second in sunrise.php needs the following lines.

if ( !defined( 'SUNRISE_LOADED' ) )
    define( 'SUNRISE_LOADED', 1 );  

The docs need to changed to reflect this.

Hint for a feature on core

create so much easier the settings page on network admin area.
Hi Ryan.
I will only leave a hint to a ticket on core to create so much easier a new tab, settings area on the sites of the network.
I have add a patch and wait also for release inside the core. Maybe you like the patch and can push the ticket.
https://core.trac.wordpress.org/ticket/15800

Best regards
Frank

Undefined constant

I get the following error:

Use of undefined constant WPMU_PLUGIN_DIR - assumed 'WPMU_PLUGIN_DIR' in (...)/wp-content/sunrise.php on line 3

Googling gives me no help.
I'm on Wordpress MU 4.01. I have installed as per the instructions given. I previously had an install of WPMU Domain Mapping plugin.

Any idea what it could be?

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.