Code Monkey home page Code Monkey logo

google-cloud-node's Introduction

Google Cloud Node.js Client

Node.js idiomatic client for Google Cloud Platform services.

NPM Version Travis Build Status Appveyor Build Status Dependency Status Coverage Status

This client supports the following Google Cloud Platform services:

If you need support for other Google APIs, check out the Google Node.js API Client library.

Where did gcloud-node go?

gcloud-node lives on under a new name, google-cloud. Your code will behave the same, simply change your dependency:

$ npm uninstall --save gcloud
$ npm install --save google-cloud
- var gcloud = require('gcloud');
+ var gcloud = require('google-cloud');

Quick Start

$ npm install --save google-cloud

Example Applications

  • nodejs-getting-started - A sample and tutorial that demonstrates how to build a complete web application using Cloud Datastore, Cloud Storage, and Cloud Pub/Sub and deploy it to Google App Engine or Google Compute Engine.
  • gcloud-node-todos - A TodoMVC backend using google-cloud-node and Datastore.
  • gitnpm - Easily lookup an npm package's GitHub repo using google-cloud-node and Google App Engine.
  • gcloud-kvstore - Use Datastore as a simple key-value store.
  • hya-wave - Cloud-based web sample editor. Part of the hya-io family of products.
  • gstore-node - Google Datastore Entities Modeling library.
  • gstore-api - REST API builder for Google Datastore Entities.

Authentication

With google-cloud it's incredibly easy to get authenticated and start using Google's APIs. You can set your credentials on a global basis as well as on a per-API basis. See each individual API section below to see how you can auth on a per-API-basis. This is useful if you want to use different accounts for different Google Cloud services.

On Google Compute Engine

If you are running this client on Google Compute Engine, we handle authentication for you with no configuration. You just need to make sure that when you set up the GCE instance, you add the correct scopes for the APIs you want to access.

// Authenticating on a global basis.
var projectId = process.env.GCLOUD_PROJECT; // E.g. 'grape-spaceship-123'
var gcloud = require('google-cloud')({
  projectId: projectId
});

// ...you're good to go! See the next section to get started using the APIs.

Elsewhere

If you are not running this client on Google Compute Engine, you need a Google Developers service account. To create a service account:

  1. Visit the Google Developers Console.
  2. Create a new project or click on an existing project.
  3. Navigate to APIs & auth > APIs section and turn on the following APIs (you may need to enable billing in order to use these services):
  • BigQuery API
  • Cloud Bigtable API
  • Cloud Bigtable Admin API
  • Cloud Bigtable Table Admin API
  • Google Cloud Datastore API
  • Google Cloud DNS API
  • Google Cloud Natural Language API
  • Google Cloud Pub/Sub API
  • Google Cloud Resource Manager API
  • Google Cloud Speech API
  • Google Cloud Storage
  • Google Cloud Storage JSON API
  • Google Cloud Vision API
  • Google Compute Engine API
  • Google Translate API
  • Prediction API
  • Stackdriver Logging API
  1. Navigate to APIs & auth > Credentials and then:
  • If you want to use a new service account, click on Create new Client ID and select Service account. After the account is created, you will be prompted to download the JSON key file that the library uses to authenticate your requests.
  • If you want to generate a new key for an existing service account, click on Generate new JSON key and download the JSON key file.
// Authenticating on a global basis.
var projectId = process.env.GCLOUD_PROJECT; // E.g. 'grape-spaceship-123'

var gcloud = require('google-cloud')({
  projectId: projectId,

  // The path to your key file:
  keyFilename: '/path/to/keyfile.json'

  // Or the contents of the key file:
  credentials: require('./path/to/keyfile.json')
});

// ...you're good to go! See the next section to get started using the APIs.

You can also set auth on a per-API-instance basis. The examples below show you how.

Google BigQuery

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var bigquery = gcloud.bigquery;

Using the BigQuery API module

$ npm install --save @google-cloud/bigquery
var bigquery = require('@google-cloud/bigquery');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var bigqueryClient = bigquery({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Access an existing dataset and table.
var schoolsDataset = bigqueryClient.dataset('schools');
var schoolsTable = schoolsDataset.table('schoolsData');

// Import data into a table.
schoolsTable.import('/local/file.json', function(err, job) {});

// Get results from a query job.
var job = bigqueryClient.job('job-id');

// Use a callback.
job.getQueryResults(function(err, rows) {});

// Or get the same results as a readable stream.
job.getQueryResults().on('data', function(row) {});

Google Cloud Bigtable

You may need to create a cluster to use the Google Cloud Bigtable API with your project.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var bigtable = gcloud.bigtable;

Using the Cloud Bigtable API module

$ npm install --save @google-cloud/bigtable
var bigtable = require('@google-cloud/bigtable');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var bigtableClient = bigtable({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

var instance = bigtableClient.instance('my-instance');
var table = instance.table('prezzy');

table.getRows(function(err, rows) {});

// Update a row in your table.
var row = table.row('alincoln');

row.save('follows:gwashington', 1, function(err) {
  if (err) {
    // Error handling omitted.
  }

  row.get('follows:gwashington', function(err, data) {
    if (err) {
      // Error handling omitted.
    }

    // data = {
    //   follows: {
    //     gwashington: [
    //       {
    //         value: 1
    //       }
    //     ]
    //   }
    // }
  });
});

Google Cloud Datastore

Follow the activation instructions to use the Google Cloud Datastore API with your project.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var datastore = gcloud.datastore;

Using the Cloud Datastore API module

$ npm install --save @google-cloud/datastore
var datastore = require('@google-cloud/datastore');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var datastoreClient = datastore({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

var key = datastoreClient.key(['Product', 'Computer']);

datastoreClient.get(key, function(err, entity) {
  console.log(err || entity);
});

// Save data to Datastore.
var blogPostData = {
  title: 'How to make the perfect homemade pasta',
  author: 'Andrew Chilton',
  isDraft: true
};

var blogPostKey = datastoreClient.key('BlogPost');

datastoreClient.save({
  key: blogPostKey,
  data: blogPostData
}, function(err) {
  // `blogPostKey` has been updated with an ID so you can do more operations
  // with it, such as an update.
  blogPostData.isDraft = false;

  datastoreClient.save({
    key: blogPostKey,
    data: blogPostData
  }, function(err) {
    if (!err) {
      // The blog post is now published!
    }
  });
});

Google Cloud DNS

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var dns = gcloud.dns;

Using the Cloud DNS API module

$ npm install --save @google-cloud/dns
var dns = require('@google-cloud/dns');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var dnsClient = dns({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Create a managed zone.
dnsClient.createZone('my-new-zone', {
  dnsName: 'my-domain.com.'
}, function(err, zone) {});

// Reference an existing zone.
var zone = dnsClient.zone('my-existing-zone');

// Create an NS record.
var nsRecord = zone.record('ns', {
  ttl: 86400,
  name: 'my-domain.com.',
  data: 'ns-cloud1.googledomains.com.'
});

zone.addRecord(nsRecord, function(err, change) {});

// Create a zonefile from the records in your zone.
zone.export('/zonefile.zone', function(err) {});

Google Cloud Pub/Sub

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var pubsub = gcloud.pubsub;

Using the Cloud Pub/Sub API module

$ npm install --save @google-cloud/pubsub
var pubsub = require('@google-cloud/pubsub');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you
// auth on a global basis (see Authentication section above).

var pubsubClient = pubsub({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Reference a topic that has been previously created.
var topic = pubsubClient.topic('my-topic');

// Publish a message to the topic.
topic.publish({
  data: 'New message!'
}, function(err) {});

// Subscribe to the topic.
var options = {
  reuseExisting: true
};

topic.subscribe('subscription-name', options, function(err, subscription) {
  // Register listeners to start pulling for messages.
  function onError(err) {}
  function onMessage(message) {}
  subscription.on('error', onError);
  subscription.on('message', onMessage);

  // Remove listeners to stop pulling for messages.
  subscription.removeListener('message', onMessage);
  subscription.removeListener('error', onError);
});

Google Cloud Storage

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var storage = gcloud.storage;

Using the Cloud Storage API module

$ npm install --save @google-cloud/storage
var storage = require('@google-cloud/storage');

Preview

var fs = require('fs');

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var gcs = storage({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Create a new bucket.
gcs.createBucket('my-new-bucket', function(err, bucket) {
  if (!err) {
    // "my-new-bucket" was successfully created.
  }
});

// Reference an existing bucket.
var bucket = gcs.bucket('my-existing-bucket');

// Upload a local file to a new file to be created in your bucket.
bucket.upload('/photos/zoo/zebra.jpg', function(err, file) {
  if (!err) {
    // "zebra.jpg" is now in your bucket.
  }
});

// Download a file from your bucket.
bucket.file('giraffe.jpg').download({
  destination: '/photos/zoo/giraffe.jpg'
}, function(err) {});

// Streams are also supported for reading and writing files.
var remoteReadStream = bucket.file('giraffe.jpg').createReadStream();
var localWriteStream = fs.createWriteStream('/photos/zoo/giraffe.jpg');
remoteReadStream.pipe(localWriteStream);

var localReadStream = fs.createReadStream('/photos/zoo/zebra.jpg');
var remoteWriteStream = bucket.file('zebra.jpg').createWriteStream();
localReadStream.pipe(remoteWriteStream);

Google Compute Engine

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var compute = gcloud.compute;

Using the Compute Engine API module

$ npm install --save @google-cloud/compute
var compute = require('@google-cloud/compute');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var gce = compute({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Create a new VM using the latest OS image of your choice.
var zone = gce.zone('us-central1-a');
var name = 'ubuntu-http';

zone.createVM(name, { os: 'ubuntu' }, function(err, vm, operation) {
  // `operation` lets you check the status of long-running tasks.

  operation
    .on('error', function(err) {})
    .on('running', function(metadata) {})
    .on('complete', function(metadata) {
      // Virtual machine created!
    });
});

Google Prediction API

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var prediction = gcloud.prediction;

Using the Prediction API module

$ npm install --save @google-cloud/prediction
var prediction = require('@google-cloud/prediction');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var predictionClient = prediction({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Get all of the trained models in your project.
predictionClient.getModels(function(err, models) {
  if (!err) {
    // `models` is an array of Model objects.
  }
});

// Reference an existing trained model.
var model = predictionClient.model('my-existing-model');

// Train a model.
model.train('english', 'Hello from your friends at Google!', function(err) {});

// Query a model.
model.query('Hello', function(err, results) {
  if (!err) {
    // results.winner == 'english'
    // results.scores == [
    //   {
    //     label: 'english',
    //     score: 1
    //   },
    //   {
    //     label: 'spanish',
    //     score: 0
    //   }
    // ]
  }
});

Google Translate API

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var translate = gcloud.translate;

Using the Translate API module

$ npm install --save @google-cloud/translate
var translate = require('@google-cloud/translate');

An API key is required for Translate. See Identifying your application to Google.

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var translateClient = translate({
  key: 'API Key'
});

// Translate a string of text.
translateClient.translate('Hello', 'es', function(err, translation) {
  if (!err) {
    // translation = 'Hola'
  }
});

// Detect a language from a string of text.
translateClient.detect('Hello', function(err, results) {
  if (!err) {
    // results = {
    //   language: 'en',
    //   confidence: 1,
    //   input: 'Hello'
    // }
  }
});

// Get a list of supported languages.
translateClient.getLanguages(function(err, languages) {
  if (!err) {
    // languages = [
    //   'af',
    //   'ar',
    //   'az',
    //   ...
    // ]
  }
});

Google Cloud Natural Language (Beta)

This is a Beta release of Google Cloud Natural Language. This feature is not covered by any SLA or deprecation policy and may be subject to backward-incompatible changes.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var language = gcloud.language;

Using the Natural Language API module

$ npm install --save @google-cloud/language
var language = require('@google-cloud/language');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authorization section above).

var languageClient = language({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Get the entities from a sentence.
languageClient.detectEntities('Stephen of Michigan!', function(err, entities) {
  // entities = {
  //   people: ['Stephen'],
  //   places: ['Michigan']
  // }
});

// Create a document if you plan to run multiple detections.
var document = languageClient.document('Contributions welcome!');

// Analyze the sentiment of the document.
document.detectSentiment(function(err, sentiment) {
  // sentiment = 100 // Large numbers represent more positive sentiments.
});

// Parse the syntax of the document.
document.annotate(function(err, annotations) {
  // annotations = {
  //   language: 'en',
  //   sentiment: 100,
  //   entities: {},
  //   sentences: ['Contributions welcome!'],
  //   tokens: [
  //     {
  //       text: 'Contributions',
  //       partOfSpeech: 'Noun (common and proper)',
  //       partOfSpeechTag: 'NOUN'
  //     },
  //     {
  //       text: 'welcome',
  //       partOfSpeech: 'Verb (all tenses and modes)',
  //       partOfSpeechTag: 'VERB'
  //     },
  //     {
  //       text: '!',
  //       partOfSpeech: 'Punctuation',
  //       partOfSpeechTag: 'PUNCT'
  //     }
  //   ]
  // }
});

Google Cloud Resource Manager (Beta)

This is a Beta release of Google Cloud Resource Manager. This feature is not covered by any SLA or deprecation policy and may be subject to backward-incompatible changes.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var resource = gcloud.resource;

Using the Cloud Resource Manager API module

$ npm install --save @google-cloud/resource
var resource = require('@google-cloud/resource');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var resourceClient = resource({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Get all of the projects you maintain.
resourceClient.getProjects(function(err, projects) {
  if (!err) {
    // `projects` contains all of your projects.
  }
});

// Get the metadata from your project. (defaults to `grape-spaceship-123`)
var project = resourceClient.project();

project.getMetadata(function(err, metadata) {
  // `metadata` describes your project.
});

Google Cloud Speech (Beta)

This is a Beta release of Google Cloud Speech. This feature is not covered by any SLA or deprecation policy and may be subject to backward-incompatible changes.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var speech = gcloud.speech;

Using the Cloud Speech API module

$ npm install --save @google-cloud/speech
var speech = require('@google-cloud/speech');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var speechClient = gcloud.speech({
  projectId: 'my-project',
  keyFilename: '/path/to/keyfile.json'
});

// Detect the speech in an audio file.
speechClient.recognize('./audio.raw', {
  encoding: 'LINEAR16',
  sampleRate: 16000
}, function(err, transcript) {
  // transcript = 'how old is the Brooklyn Bridge'
});

// Detect the speech in an audio file stream.
fs.createReadStream('./audio.raw')
  .on('error', console.error)
  .pipe(speech.createRecognizeStream({
    config: {
      encoding: 'LINEAR16',
      sampleRate: 16000
    },
    singleUtterance: false,
    interimResults: false
  }))
  .on('error', console.error)
  .on('data', function(data) {
    // The first "data" event emitted might look like:
    //   data = {
    //     endpointerType: Speech.endpointerTypes.START_OF_SPEECH,
    //     results: "",
    //     ...
    //   }
    //
    // A later "data" event emitted might look like:
    //   data = {
    //     endpointerType: Speech.endpointerTypes.END_OF_AUDIO,
    //     results: "",
    //     ...
    //   }
    //
    // A final "data" event emitted might look like:
    //   data = {
    //     endpointerType:
    //       Speech.endpointerTypes.ENDPOINTER_EVENT_UNSPECIFIED,
    //     results: "how old is the Brooklyn Bridge",
    //     ...
    //   }
  });

Google Cloud Vision (Beta)

This is a Beta release of Google Cloud Vision. This feature is not covered by any SLA or deprecation policy and may be subject to backward-incompatible changes.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var vision = gcloud.vision;

Using the Cloud Vision API module

$ npm install --save @google-cloud/vision
var vision = require('@google-cloud/vision');

Preview

// Authenticating on a per-API-basis. You don't need to do this if you auth on a
// global basis (see Authentication section above).

var visionClient = vision({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Read the text from an image.
visionClient.detectText('./image.jpg', function(err, text) {
  // text = [
  //   'This was text found in the image',
  //   'This was more text found in the image'
  // ]
});

// Detect faces and the locations of their features in an image.
visionClient.detectFaces('./image.jpg', function(err, faces) {
  // faces = [
  //   {
  //     angles: {pan,tilt,roll},
  //     bounds: {
  //       head: [{x,y},{x,y},{x,y},{x,y}],
  //       face: [{x,y},{x,y},{x,y},{x,y}]
  //     },
  //     features: {
  //       confidence: 34.489909,
  //       chin: {
  //         center: {x,y,z},
  //         left: {x,y,z},
  //         right: {x,y,z}
  //       },
  //       ears: {
  //         left: {x,y,z},
  //         right: {x,y,z}
  //       },
  //       eyebrows: {
  //         left: {
  //           left: {x,y,z},
  //           right: {x,y,z},
  //           top: {x,y,z}
  //         },
  //         right: {
  //           left: {x,y,z},
  //           right: {x,y,z},
  //           top: {x,y,z}
  //         }
  //       },
  //       eyes: {
  //         left: {
  //           bottom: {x,y,z},
  //           center: {x,y,z},
  //           left: {x,y,z},
  //           pupil: {x,y,z},
  //           right: {x,y,z},
  //           top: {x,y,z}
  //         },
  //         right: {
  //           bottom: {x,y,z},
  //           center: {x,y,z},
  //           left: {x,y,z},
  //           pupil: {x,y,z},
  //           right: {x,y,z},
  //           top: {x,y,z}
  //         }
  //       },
  //       forehead: {x,y,z},
  //       lips: {
  //         bottom: {x,y,z},
  //         top: {x,y,z}
  //       },
  //       mouth: {
  //         center: {x,y,z},
  //         left: {x,y,z},
  //         right: {x,y,z}
  //       },
  //       nose: {
  //         bottom: {
  //           center: {x,y,z},
  //           left: {x,y,z},
  //           right: {x,y,z}
  //         },
  //         tip: {x,y,z},
  //         top: {x,y,z}
  //       }
  //     },
  //     confidence: 56.748849,
  //     blurry: false,
  //     dark: false,
  //     happy: false,
  //     hat: false,
  //     mad: false,
  //     sad: false,
  //     surprised: false
  //   }
  // ]
});

Stackdriver Logging (Beta)

This is a Beta release of Stackdriver Logging. This API is not covered by any SLA or deprecation policy and may be subject to backward-incompatible changes.

Using the all-in-one module

$ npm install --save google-cloud
var gcloud = require('google-cloud');
var logging = gcloud.logging;

Using the Stackdriver Logging API module

$ npm install --save @google-cloud/logging
var logging = require('@google-cloud/logging');

Preview

// Authenticating on a global-basis. You can also authenticate on a per-API-
// basis (see Authentication section above).

var loggingClient = logging({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Create a sink using a Bucket as a destination.
var gcs = storage();

loggingClient.createSink('my-new-sink', {
  destination: gcs.bucket('my-sink')
}, function(err, sink) {});

// Write a critical entry to a log.
var syslog = loggingClient.log('syslog');

var resource = {
  type: 'gce_instance',
  labels: {
    zone: 'global',
    instance_id: '3'
  }
};

var entry = syslog.entry(resource, {
  delegate: process.env.user
});

syslog.critical(entry, function(err) {});

// Get all entries in your project.
loggingClient.getEntries(function(err, entries) {
  if (!err) {
    // `entries` contains all of the entries from the logs in your project.
  }
});

Contributing

Contributions to this library are always welcome and highly encouraged.

See CONTRIBUTING for more information on how to get started.

License

Apache 2.0 - See COPYING for more information.

google-cloud-node's People

Contributors

afanasy avatar aknuds1 avatar anandsuresh avatar ashleyschuett avatar authtestprod avatar beriberikix avatar blowmage avatar callmehiphop avatar chrishiestand avatar gormartsen avatar jgeewax avatar jmdobry avatar jmuk avatar kevinresol avatar marcgel avatar mziccard avatar neilcronin avatar ofrobots avatar pcostell avatar phw avatar pilwon avatar proppy avatar quartzmo avatar rakyll avatar robertdimarco avatar ryanseys avatar savethefails avatar silvolu avatar stephenplusplus avatar swcloud avatar

Watchers

 avatar  avatar

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.