Giter VIP home page Giter VIP logo

cod-migration's People

Contributors

cjhendrix avatar

Watchers

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

cod-migration's Issues

Implement checks to see if download of google docs succeeds.

When someone changes the permissions of a config, intent or taxonomy google doc file, it is possible that downloading the csv version of it is impossible without login.

We need to detect this situation and display nicely to the user that is running the script.

Often unable to create resources

Trying to run gospawn for the first time since Friday. Getting this error on many resources (but not all):

Uploading resource resources/afg_ppl_settlements_pnt_cso.zip
FAILED.
{"help": "http://test-data.hdx.rwlabs.org/api/3/action/help_show?name=resource_create", "success": false, "error": {"url": ["Missing value"], "__type": "Validation Error"}}
Error occured when create : False

However even with the dataset registers as complete, there are no resources. For example: https://test-data.hdx.rwlabs.org/dataset/afghanistan-elevation-model

hrefs getting lost

The source field contains an href (both in interface and as delivered by api). We should be capturing these in HDX.

image

image

Could we pass authentication to HR to get unpublished datasets from the API

Unpublished datasets on CFR will fail (logged as failure). To be auto migrated, IMO would need to publish them at some point before the moment of migration and unpublish before HR.info scripts are run.

This could occur in the case of "publish only after a disaster" datasets or datasets that are previous versions than an office wants to keep around for archival purposes.

We will explore passing authentication to HR.info to give access to unpublished datasets that require migration (presumably to private status).

"Test Short" failing on node 4537 during dataset update step

Terminal output:

cj@ubuntu-vm:~/coding/hdx-gospawn$ python3.4 gospawn.py test short
Trying to get configs/intent.csv
SUCCESS.
Trying to get configs/intent.csv
SUCCESS.
Start processing dataset with Node ID = 22243
Dataset exists.
Identifying dataset: afghanistan-admin-level-1-boundaries
Updating identified existing dataset: afghanistan-admin-level-1-boundaries
Trying to get resources/afg_admbnd_reg_UNAMA.zip
Uploading resource resources/afg_admbnd_reg_UNAMA.zip
Success.
Dataset exists.
Dataset with Node ID = 22243 has been MIGRATED.
Start processing dataset with Node ID = 4246
Dataset exists.
Identifying dataset: yemen-admin-boundaries-settlements
Updating identified existing dataset: yemen-admin-boundaries-settlements
Trying to get resources/yemen_p-codes_27032013.xlsx
Uploading resource resources/yemen_p-codes_27032013.xlsx
Success.
Trying to get resources/yemen_pcode_final_010715.xlsx
Uploading resource resources/yemen_pcode_final_010715.xlsx
Success.
Dataset exists.
Dataset with Node ID = 4246 has been MIGRATED.
Start processing dataset with Node ID = 4537
Dataset exists.
Identifying dataset: afghanistan-population-statistics
Updating identified existing dataset: afghanistan-population-statistics

usage: gospawn.py test (short|full)

Full log output:

2015-08-03T11:40:21+0200 | dataset | START | True | 22243 | None | https://www.humanitarianresponse.info/en/api/v1.0/datasets/22243 | None | None | None | None | None
2015-08-03T11:40:22+0200 | dataset | get | True | 22243 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-admin-level-1-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/22243 | None | None | None | None | None
2015-08-03T11:40:22+0200 | dataset | format | True | 22243 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-admin-level-1-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/22243 | None | Afghanistan - Admin Level 1 Boundaries | None | None | None
2015-08-03T11:40:28+0200 | dataset | update | True | 22243 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-admin-level-1-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/22243 | 635f15d9-40f3-4d15-b8f2-4611253028bc | Afghanistan - Admin Level 1 Boundaries | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-admin-level-1-boundaries | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-admin-level-1-boundaries
2015-08-03T11:40:28+0200 | resource | format | True | 18900 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/afg_admbnd_reg_UNAMA.zip | None | afg_admbnd_reg_UNAMA.zip | None | afghanistan-admin-level-1-boundaries | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=afg_admbnd_reg_UNAMA.zip
2015-08-03T11:40:31+0200 | resource | get | True | 18900 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/afg_admbnd_reg_UNAMA.zip | None | afg_admbnd_reg_UNAMA.zip | None | afghanistan-admin-level-1-boundaries | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=afg_admbnd_reg_UNAMA.zip
2015-08-03T11:40:45+0200 | resource | create | True | 18900 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/afg_admbnd_reg_UNAMA.zip | None | afg_admbnd_reg_UNAMA.zip | None | afghanistan-admin-level-1-boundaries | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=afg_admbnd_reg_UNAMA.zip
2015-08-03T11:40:50+0200 | dataset | update | True | 22243 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-admin-level-1-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/22243 | 635f15d9-40f3-4d15-b8f2-4611253028bc | Afghanistan - Admin Level 1 Boundaries | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-admin-level-1-boundaries | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-admin-level-1-boundaries
2015-08-03T11:40:50+0200 | dataset | COMPLETE | True | 22243 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-admin-level-1-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/22243 | 635f15d9-40f3-4d15-b8f2-4611253028bc | Afghanistan - Admin Level 1 Boundaries | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-admin-level-1-boundaries | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-admin-level-1-boundaries
2015-08-03T11:40:50+0200 | dataset | START | True | 4246 | None | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4246 | None | None | None | None | None
2015-08-03T11:40:51+0200 | dataset | get | True | 4246 | https://www.humanitarianresponse.info/en/operations/yemen/dataset/yemen-admin-level-1-boundaries-admin-level-2-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4246 | None | None | None | None | None
2015-08-03T11:40:51+0200 | dataset | format | True | 4246 | https://www.humanitarianresponse.info/en/operations/yemen/dataset/yemen-admin-level-1-boundaries-admin-level-2-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4246 | None | Yemen - Admin Boundaries, Settlements | None | None | None
2015-08-03T11:40:54+0200 | dataset | update | True | 4246 | https://www.humanitarianresponse.info/en/operations/yemen/dataset/yemen-admin-level-1-boundaries-admin-level-2-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4246 | 24730302-590d-4539-9914-a6ae37c5f490 | Yemen - Admin Boundaries, Settlements | None | https://test-data.hdx.rwlabs.org/dataset/yemen-admin-boundaries-settlements | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=yemen-admin-boundaries-settlements
2015-08-03T11:40:54+0200 | resource | format | True | 3774 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/yemen_p-codes_27032013.xlsx | None | yemen_p-codes_27032013.xlsx | None | yemen-admin-boundaries-settlements | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=yemen_p-codes_27032013.xlsx
2015-08-03T11:40:59+0200 | resource | get | True | 3774 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/yemen_p-codes_27032013.xlsx | None | yemen_p-codes_27032013.xlsx | None | yemen-admin-boundaries-settlements | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=yemen_p-codes_27032013.xlsx
2015-08-03T11:41:27+0200 | resource | create | True | 3774 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/yemen_p-codes_27032013.xlsx | None | yemen_p-codes_27032013.xlsx | None | yemen-admin-boundaries-settlements | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=yemen_p-codes_27032013.xlsx
2015-08-03T11:41:27+0200 | resource | format | True | 97630 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/yemen_pcode_final_010715.xlsx | None | yemen_pcode_final_010715.xlsx | None | yemen-admin-boundaries-settlements | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=yemen_pcode_final_010715.xlsx
2015-08-03T11:41:31+0200 | resource | get | True | 97630 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/yemen_pcode_final_010715.xlsx | None | yemen_pcode_final_010715.xlsx | None | yemen-admin-boundaries-settlements | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=yemen_pcode_final_010715.xlsx
2015-08-03T11:42:01+0200 | resource | create | True | 97630 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/yemen_pcode_final_010715.xlsx | None | yemen_pcode_final_010715.xlsx | None | yemen-admin-boundaries-settlements | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=yemen_pcode_final_010715.xlsx
2015-08-03T11:42:07+0200 | dataset | update | True | 4246 | https://www.humanitarianresponse.info/en/operations/yemen/dataset/yemen-admin-level-1-boundaries-admin-level-2-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4246 | 24730302-590d-4539-9914-a6ae37c5f490 | Yemen - Admin Boundaries, Settlements | None | https://test-data.hdx.rwlabs.org/dataset/yemen-admin-boundaries-settlements | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=yemen-admin-boundaries-settlements
2015-08-03T11:42:07+0200 | dataset | COMPLETE | True | 4246 | https://www.humanitarianresponse.info/en/operations/yemen/dataset/yemen-admin-level-1-boundaries-admin-level-2-boundaries | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4246 | 24730302-590d-4539-9914-a6ae37c5f490 | Yemen - Admin Boundaries, Settlements | None | https://test-data.hdx.rwlabs.org/dataset/yemen-admin-boundaries-settlements | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=yemen-admin-boundaries-settlements
2015-08-03T11:42:07+0200 | dataset | START | True | 4537 | None | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | None | None | None | None
2015-08-03T11:42:08+0200 | dataset | get | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | None | None | None | None
2015-08-03T11:42:08+0200 | dataset | format | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | Afghanistan - Population Statistics | None | None | None
2015-08-03T11:43:09+0200 | dataset | update | False | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | Afghanistan - Population Statistics | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-population-statistics | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-population-statistics

Losing the third resource

In the most recent run, the log shows 3 resources migrated for node 4537, but only two are visible in ckan (the zip is dropped not appearing): https://test-data.hdx.rwlabs.org/dataset/afghanistan-population-statistics#

Log entries:

2015-07-10T13:51:51+0200 | dataset | START | True | 4537 | None | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | None | None | None | None
2015-07-10T13:51:52+0200 | dataset | get | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | None | None | None | None
2015-07-10T13:51:52+0200 | dataset | format | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | None | Afghanistan - Population Statistics | None | None | None
2015-07-10T13:51:59+0200 | dataset | update | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | 4c58fa87-3259-4cc8-a35c-48489cafb773 | Afghanistan - Population Statistics | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-population-statistics | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-population-statistics
2015-07-10T13:51:59+0200 | resource | format | True | 51842 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx | None | AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx
2015-07-10T13:52:00+0200 | resource | get | True | 51842 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx | None | AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx
2015-07-10T13:52:22+0200 | resource | create | True | 51842 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/datasets/AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx | None | AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=AFG_CSO_POP_DISTRICT_2014_2015_OCHA_201409Sep08.xlsx
2015-07-10T13:52:22+0200 | resource | format | True | 3860 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx | None | AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx
2015-07-10T13:52:24+0200 | resource | get | True | 3860 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx | None | AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx
2015-07-10T13:52:32+0200 | resource | create | True | 3860 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx | None | AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=AFG_CSO_POP_DISTRICT_2013_2014_OCHA_201307JUL31.xlsx
2015-07-10T13:52:32+0200 | resource | format | True | 3861 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/CSO%20Estimated%20Population%20of%20Afghanistan%202013-14%20Report.zip | None | CSO Estimated Population of Afghanistan 2013-14 Report.zip | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=CSO Estimated Population of Afghanistan 2013-14 Report.zip
2015-07-10T13:52:41+0200 | resource | get | True | 3861 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/CSO%20Estimated%20Population%20of%20Afghanistan%202013-14%20Report.zip | None | CSO Estimated Population of Afghanistan 2013-14 Report.zip | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=CSO Estimated Population of Afghanistan 2013-14 Report.zip
2015-07-10T13:53:54+0200 | resource | create | True | 3861 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/CSO%20Estimated%20Population%20of%20Afghanistan%202013-14%20Report.zip | None | CSO Estimated Population of Afghanistan 2013-14 Report.zip | None | afghanistan-population-statistics | None | https://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=CSO Estimated Population of Afghanistan 2013-14 Report.zip
zip
2015-07-10T13:54:00+0200 | dataset | update | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | 4c58fa87-3259-4cc8-a35c-48489cafb773 | Afghanistan - Population Statistics | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-population-statistics | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-population-statistics
2015-07-10T13:54:00+0200 | dataset | COMPLETE | True | 4537 | https://www.humanitarianresponse.info/en/operations/afghanistan/dataset/afghanistan-population-statistics | https://www.humanitarianresponse.info/en/api/v1.0/datasets/4537 | 4c58fa87-3259-4cc8-a35c-48489cafb773 | Afghanistan - Population Statistics | None | https://test-data.hdx.rwlabs.org/dataset/afghanistan-population-statistics | https://test-data.hdx.rwlabs.org/api/3/action/package_show?id=afghanistan-population-statistics

Identify an existing hdx dataset

dataset with same name:

  • tag the dataset with Node ID and a prefix (CJ proposed the form "nodeid12345", "nodeid" being the prefix and the numbers being the actual node id)
  • when check if exists, check also if the there is a tag with the specific node id
    • if it is, compare with current node id
      • if equal, update the dataset
      • else change the name (add "-0" at the end of the name) and try again.
    • else create a new dataset

Multilingual terms of use

There are different language versions of the terms of use (depending on the language setting of the hr.info space). French and Spanish are the only other ones as far as I know.

Just as we do with the english version of CFR's default terms of use, we need to transform the French and Spanish as well. We will transform them to english.

Issue #10 and #43 have more info about how we are handling for english.

For this issue
Add a handler for the string below with the same output as for english. I'll add the spanish string here as soon as I find an example.

terms_of_use: "<p>Prier de voir les<a href="/applications/data/page/terms-use">Conditions d’utilisation</a> de ce site. Cela ne remplace pas les conditions d’utilisation liées à ces données.</p> "

Migration success / failure tagging

What to do on migration process failure? (meaning for example failure of one resource of a multi-resource dataset)

As discussed with @cjhendrix:

  • upon failure:
    • tag it as "migration incomplete" - ONLY IF error does occur in resource part of the dataset
    • make it private
    • try to upload as much as possible (go to next resource) - this was harder to implement so it will just stop the current dataset migration process
  • upon success:
    • remove tag "migration incomplete" if exists
    • make it public if the intent says "public"

nomigrate-multiple locations error

We need to properly treat this error, aka log it and move to the next dataset in the intent file.
Right now it just raises an exception and exit.

requests logger cluttering log file

See below.

Either make a separate log file for our use or shut off the requests logger.

2015-06-21T01:07:44+0300 Starting new HTTP connection (1): test-data.hdx.rwlabs.org
2015-06-21T01:08:04+0300 Setting read timeout to None
2015-06-21T01:08:07+0300 "POST /api/action/resource_create HTTP/1.1" 200 2262
2015-06-21T01:08:07+0300 | resource | create | True | 3348 | https://www.humanitarianresponse.info/sites/www.humanitarianresponse.info/files/mli_dem_0.zip | None | mli_dem_0.zip | None | mali-elevation-model | None | http://test-data.hdx.rwlabs.org/api/3/action/resource_show?id=mli_dem_0.zip
2015-06-21T01:08:07+0300 Starting new HTTPS connection (1): www.humanitarianresponse.info
2015-06-21T01:08:08+0300 Setting read timeout to None
2015-06-21T01:08:08+0300 "GET /en/api/v1.0/datasets/26432 HTTP/1.1" 200 730
2015-06-21T01:08:08+0300 | dataset | get | True | 26432 | https://www.humanitarianresponse.info/en/operations/mali/dataset/mali-affected-per...

Strip out tabs from free text fields

We don't allow tabs to be entered via the interface, but they seem to sneak in through the API. Markdown is interpreting them as code (or something like that):

image

Could we simply strip them out as part of the processing you are already doing on free text?

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.