Giter VIP home page Giter VIP logo

gunnarx / franca_install_automation Goto Github PK

View Code? Open in Web Editor NEW
5.0 5.0 4.0 288 KB

Private repo NOT CURRENTLY SUPPORTED - I recommend to refer to (http://github.com/genivi/eclipse_install_automation). Scripted installation of Eclipse+Franca Tools on a machine, or creation of a new Virtual Machine image. Please read README.md for instructions on which branch to use and known bugs.

License: Mozilla Public License 2.0

Shell 100.00%

franca_install_automation's Introduction

Automated Eclipse/Franca environment installation

Scripts related to Franca IDL installation.

VM or bare metal?

If you are installing on your machine directly, use the chapter "Installation on bare metal", after first reading about the branches.

If you want to create a Virtual Machine read on.

Corporate Environment?

If you are in an environment that requires web access through a proxy, read the chapter Proxy Configuration.

A note on branches (for VM)

Before you create the VM there is a choice to make and that is which flavour (distro) to use. The git repository has a number of branches with minor differences in the code but leading to quite big differences in the VM (different distros and graphical environments).

UPDATE: Because there are differences in Franca and tool versions, these branches now also modify what is installed in Eclipse. All information about the distro of course only applies only for the VM - if you install locally you have your own distro chosen already.

Branches / flavors:

The following branch installs C++ Common API support in addition to Franca. Compatibility requires this to stay on an older Franca version.

  • cpp_common_api_(with_yocto_tools) -- Ubuntu Trusty Tahr 14.04 LTS, with LXDE desktop and C++ Common API support (recommended).

The following branches install only Franca Tooling - the tip of the branch is typically installing the latest Franca version.

  • master -- Ubuntu Trusty Tahr 14.04 LTS, with LXDE desktop (recommended)
  • trusty64-unity -- Ubuntu Trusty Tahr 14.04 LTS, with standard Ubuntu (Unity) desktop (Warning: This is very big and takes a long time to install. Also read KNOWN BUGS)

Experimental branches:

  • ionas -- IONAS tooling for FRANCA/AUTOSAR(tm) integration NOTE: Using this requires some local archives that can only be downloaded using appropriate AUTOSAR/ARTOP accounts and memberships.

Branches named deprecated= are no longer kept up to date with changes, and will likely be removed soon.

Branches named broken= are broken, probably for quite some time - because if a break can be easily fixed it will be, and not renamed of course.

Branches not listed above are likely work-in-progress. Try them only if you need the very latest not yet merged functionality.

There are tags describing franca-version, eclipse-version, and operating system, as well as *-stable tags

All VM images are x86 64-bit versions.

The stable tags are an easy way to get the latest stable, but generally branches should be kept in working state, and the more specific tags are also there only if that combination has been tested at least once.

LXDE desktops are lightweight. Debian build is quick booting and lightweight but lacks the nicer Virtualbox integration. Ubuntu with LXDE is also good and with full integration.

If you prefer, a full Ubuntu desktop is available but 14.04 with Unity is heavier on resources. The memory for this VM is set to 2.5GB as opposed to 1.5 on the others. With that setting it runs alright. Installation is much slower though.

WARNING: There is a huge amount of packages being installed as part of ubuntu-desktop, including things like LibreOffice... This flavor takes a lot of time and bandwidth to initialize and is only recommended if you really need it.

Better measurements would be nice but here follows the approximate compressed sizes I could measure. I did not at this time check the actual install size, just a quick check of a gzipped version of the hdd image.

Note that this depends not only on the distro but more on how the provided "base box" has been installed. The base boxes can surely be optimized if desired.

Gzipped hard disk image size:

  • 1.3G debian_7.3-lxde
  • 886M precise64-lxde
  • 853M trusty64-lxde
  • 1.9G trusty64-unity

Sources:

The Ubuntu base systems are from Ubuntu's provided official "cloud" images. These are from the current/ directory, so these are not guaranteed to be unchanged. They will be updated by Ubuntu, and hopefully will not break. (Note however that the first time you run, you will download the current latest copy, but after that Vagrant caches the base box for you, so you will not get upstream changes unless you remove it from your Vagrant setup)

Ubuntu images include Virtualbox guest additions (automatic window resize etc.) which make the result nice to work with.

The Debian base system is fetched from Puppet Labs with a fixed version number so presumably the system on this URL will not change, but it is out of our hands. This Debian image does not include the Virtualbox integration for desktop/window resize, etc. (but the shared folder functionality apparently works, since it is required for Vagrant to work).

Instructions for Virtual Machine creation

  1. Install Vagrant. For example (for Debian or Ubuntu):

    $ sudo apt-get install vagrant

    or (for Fedora):

    $ sudo yum install vagrant

    Alternatively, download and install files from http://www.vagrantup.com/

  2. Install VirtualBox. For example (for Debian or Ubuntu):

    $ sudo apt-get install virtualbox

    Alternatively, download and install files from http://www.virtualbox.org/

  3. Run vagrant up:

    NOTE: I ran into a strange bug where a new machine claimed to be provisioned already (this should not happen...) but for that reason we can always give the explicit --provision flag. It shouldn't be necessary, but it works so do it:

    $ vagrant up --provision

    The first time it will download the VM "base box" system from the URL. The base box is cached in your vagrant environment. (~/.vagrant currently)

    Feel free to add an alternative box of another distro, but the provisioning code that uses apt-get might need changes then. Pull requests welcome.

    NOTE: There will be some errors towards the end of the provisioning which seem to be due to vagrant provisioning not running in a normal interactive shell. You can ignore those errors. Of course you may have some other error that I have not seen yet, but using vagrant and a known base box this should be quite foolproof.

  4. After provisioning, stop the VM which is now running headless. Update: Actually the gui=true flag is now in Vagrantfile. Nonetheless, rebooting is recommended at this stage:

     $ vagrant halt
  5. Then locate your VM in VirtualBox GUI and boot it normally

    You should soon see an graphical shell asking you to select user.

    Login as vagrant, password vagrant

  6. Enjoy testing Franca environment!

    Use the default workspace directory at /home/vagrant/workspace. Just hit OK.

  7. To run Franca examples you must manually import them into the workspace.

    The instructions can be found towards the end of script.sh.

Useful information about compatibility and versions: https://github.com/franca/franca/wiki/Compatibility-Overview

Tweaking settings

The VM is configured with 1.5 GB RAM (2.5 GB for Unity). You may want to modify that setting in Vagrantfile or change the VM settings manually in VirtualBox if you are doing large builds. I am not sure what is required except that 512MB was not enough, and 1.5GB worked for running Franca tests.

Sharing files

NOTE: In a Vagrant box you can share files through the /vagrant directory:

  • On host: It is this directory, where you have Vagrantfile and this README.
  • On Virtual Machine: Mounted at /vagrant

You can also get a direct command line on the VM using vagrant ssh, but that's not too useful for running Eclipse:

    $ vagrant ssh

Read Vagrant documentation to learn more: http://www.vagrantup.com/

Installation on bare metal

You may use ./script.sh (and CONFIG) directly on any existing machine (virtual or not) to simply automate the Franca installation.

  1. Edit CONFIG if needed (but more typically simply check out the appropriate git branch)
  2. Run script:
    $ ./script.sh

script.sh does not use any package manager so it should run on most distros. It is developed on Fedora 23 but to some extent tested also on Ubuntu and Debian (using the Vagrant method)

Prerequisites

script.sh does not install any packages except for Eclipse + Java packages so for the non-Vagrant installation you need to manually install the needed prerequisites on your machine.

This means JDK 7 as of now, but refer to official Franca documentation for up to date information. Install package java-1.7.0-openjdk on fedora or openjdk-7-jre on Ubuntu or Debian. (The vagrant script does this automatically)

The script downloads and installs Eclipse. If you have an Eclipse environment already that you want to use, you probably need to instead follow a manual procedure using Franca documentation to get Franca into your environment.

Proxy Configuration

To update your vagrant environment you need first to update vagrant to support using a proxy - you probably need to do this download also through the proxy of course... ;-)

For example:

$ export http_proxy="http://user:password@your-proxy-host:port"

and then:

$ vagrant plugin install vagrant-proxyconf

Now vagrant can use a proxy for its http(s) access.

The Vagrantfile already includes support for copying settings from your shell environment to the virtual environment when vagrant runs. If http_proxy (and/or https_proxy) variables are defined as environment variables in your shell, these will be carried over.

However, the final VM might need some adjustment if you expect it to work with a proxy also. This is currently out of scope but please report your needs/findings and I'm sure we can find a solution.

In other words, simply define in your shell, before running vagrant up:

$ export http_proxy="http://user:password@your-proxy-host:port"
$ export https_proxy="http://user:password@your-proxy-host:port"

and so on. The rest should follow.

There might be more information available in the documentation/support channels of Vagrant-proxyconf plugin.

Development/Testing information

Most users can disregard this.

Apart from corporate environments I use an http proxy for repeated testing. By running a local caching proxy, the repeated downloads of files (everything from eclipse, franca, and all the apt-get installs) can be locally cached which speeds things up a lot, and reduces the load on networks and servers provided by others!

Out of interest, from inside the VM, the host is the default gateway, so here is a way to get the IP of the host:

$ netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10

But for now I simply have it hardcoded to 10.0.2.2 which appears to be constant. Presumably 10.0.2.x is a default adress scheme used by vagrant for the NATed network of the VM.

Known bugs

  1. Not a bug in this project per se, but Franca 0.9.2 includes a bug that prevents the opening the Wizard for creating a new Franca file. For example by using "File->New Franca Interface"

    Workaround: Choose "File->New" instead and manually give it a .fidl suffix. Proceed editing as usual.

    http://code.google.com/a/eclipselabs.org/p/franca/issues/detail?id=149

  2. There is an odd bug for Unity/Ubuntu Desktop only that causes the Eclipse menus to not display at all. It seems to happen on the first boot after installation (and never again!) It affects also the HUD. Simply closing and restarting Eclipse seems to solve the problem. If you find any additional information, please feed it back.

Maintainer/Contact

= Github account: gunnarx

franca_install_automation's People

Contributors

gandaman avatar gmacario avatar gunnarx avatar johnnytk avatar kbirken avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

franca_install_automation's Issues

Pre-set the chosen workspace in the VM

This is minor, but the user do not really need to choose the workspace explicitly upon first launch of Eclipse.
It should be possible to automate the eclipse settings so that the workspace is already configured
(/home/vagrant/workspace)

Add keyboard locale support

There is a PR #21 adding support in LXDE at least. I have not looked at it much since I use english and am comfortable with the english keyboard layout, but I know some prefer swedish, german, etc. when actually using this as a working environment.

Please help me test this out - I only want to merge it if it is guaranteed to not cause much trouble for development. For example, it's only for LXDE but I suppose I can manage avoiding to merge it into non-LXDE branches...

Anyone, let me know if this works for you and seems a good idea.

I think you want this @kbirken, do you have time and desire to check it out ?

Add support for a web proxy

Provisioning should use http proxy if defined in the host environment

This is useful (sometimes necessary) in corporate environments.

Also, for repeated testing a caching proxy will significantly reduce the network load, and speed things up.

Improve MD5 check

The code around download and MD5 check has grown and is quite messy. It could use a rewrite.

It would be much better to make use of standard .md5 files - if such a file exists with the same base filename and the checksum matches, the file should be considered OK. If it doesn't then no consistency checking is possible, and appropriate action should be done - either download again, or try to use the file that was found anyway.

A collection of such MD5 files could be provided by the project itself instead of being hidden inside of CONFIG file.

If an MD5 file can be downloaded from the file source, we can decide to also trust it and store it for next run.

Revert to non-gui during provisioning

Originally the project ran without gui during first run and the user was requested to restart the VM to test out the result. Even if GUI is up during provisioning it seems that a reboot is the easiest way to make sure the graphical shell / window manager is presented to the user anyway.
If you're not in an X environment, it fails example

For the purpose of running the project on a build machine, where the result not tested graphically at the same time (automated build) - should the project maybe revert to gui = false in the Vagrantfile?

What do you think @gmacario ?

Vagrantfile:67:in `block in <top (required)>': uninitialized constant VMNAME (NameError)

Tested on ITM-GPAOLO-W10

  • OS: MS Windows 10
  • git version 2.9.0.windows.1
  • Vagrant 1.8.5
  • Oracle VM VirtualBox 5.1.4r110228

Start a command prompt and clone repository

C:\Users\gmacario>git clone https://github.com/gunnarx/franca_install_automation
Cloning into 'franca_install_automation'...
remote: Counting objects: 1283, done.
Receiving objects: 100% (1283/1283), 263.08 KiB | 0 bytes/s, done.

Resolving deltas: 100% (752/752), done.
Checking connectivity... done.

C:\Users\gmacario>

Change directory and type vagrant up

C:\Users\gmacario>cd franca_install_automation

C:\Users\gmacario\franca_install_automation>vagrant up
Vagrant has no proxy plugin => skipped proxy configuration.
Vagrant has no proxy plugin => skipped proxy configuration.
C:/Users/gmacario/franca_install_automation/Vagrantfile:67:in `block in <top (required)>': uninitialized constant VMNAME (NameError)
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/v2/loader.rb:37:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/v2/loader.rb:37:in `load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/loader.rb:113:in `block (2 levels) in load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/loader.rb:107:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/loader.rb:107:in `block in load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/loader.rb:104:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/config/loader.rb:104:in `load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/vagrantfile.rb:28:in `initialize'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/environment.rb:740:in `new'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/environment.rb:740:in `vagrantfile'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/environment.rb:486:in `host'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/environment.rb:208:in `block in action_runner'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/action/runner.rb:33:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/action/runner.rb:33:in `run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/environment.rb:473:in `hook'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/lib/vagrant/environment.rb:722:in `unload'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/bin/vagrant:177:in `ensure in <main>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.5/bin/vagrant:177:in `<main>'

C:\Users\gmacario\franca_install_automation>

The Eclipse installation has two conflicting Xtend versions.

The current provisioning produces an Eclipse installation which contains the plug-in "Xtend Core" in versions 2.0.0 and 2.7.3. The latter is correct, the former shouldn't be installed. This leads to problems when Xtend is used, e.g., for Franca transformations.

Tested with branches precise64-lxde and automotive.

Remove failing (but harmless) packages in Ubuntu image

The user experience (i.e. running Vagrant, not the VM result) is bad because of errors reported during Vagrant provisioning

This does not negatively impact the result (or rather, if it does, a separate bug should be filed for that) but it it not as nice if the program reports errors when in fact the result is OK.

Background

  • Some Ubuntu packages assume that apt-get is run in an interactive shell, which Vagrant is not during provisioning.
  • This causes some installations to "fail", at least they report errors.
  • Todo, look up the results/solutions for this. I think I found a relevant StackExchange item earlier.

fix-no-tty fails

the addition of fix-no-tty fails.
I thought this worked before but maybe not. Or vagrant changed some syntax.

Add VIM syntax support for Franca

Add VIM syntax support for Franca. Not really a major thing since editing is supposed to happen inside Eclipse. Still, an idea I ran into when opening files using vi (vim) from the command shell.

VM provisioning fails when trying to download Franca examples

Tested on branch "trusty64-lxde"

gmacario@ITM-GMACARIO-W7 /cygdrive/e/data/GENIVI/franca_install_automation
$ vagrant up
Vagrant has no proxy plugin => skipped proxy configuration.
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/trusty64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Setting the name of the VM: franca_install_automation_default_1442848625326_56729
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
...
==> default: GTK+ Version Check
==> default:  ***
==> default: Downloading Franca examples
==> default: Downloading...
==> default: /Releases/0.10/org_franca_examples_src_2015-07-29.zip: Scheme missing.
==> default: Something went wrong.  Message:
==> default: wget failed.  Is wget installed?
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.
gmacario@ITM-GMACARIO-W7 /cygdrive/e/data/GENIVI/franca_install_automation
$

Use extended configuration instead of github branches.

Currently, github branches are used to represent various configurations of the install_automation product. However, quite some work is involved to merge all cross-cutting changes to the various branches. And it might be confusing which branches represent a configuration and which branches are only supporting some git workflow.

When I look at the existing issues, there even will be some more configuration possibilities in future.

Proposal

Maybe (this is just an idea intended for being discussed further) it would pay off to use some kind of additional configuration to represent the actual product variants and reduce the number of git branches. The additional configuration could be a feature model, which describes the space of all possible configurations in a consistent way. Based on this, consistent configurations could be created and used as input for the VM creation.

Feature model

I prepared a feature model in sxml format, see http://www.birken.info/download/ivi_develop_feature_model.sxfm

This can be used online for creating a consistent configuration:

  1. Open the online product configuration editor from the SPLOT website.
  2. Paste the model URL (see above) into the appropriate edit field and press "Click here".
  3. Now the configuration can be edited (e.g., use the *More Features" auto-completion).
  4. Save the configuration as xml.

Maybe the vagrant configuration could use the xml (or the corresponding csv) file for building the actual VM based on the configuration description. Some configurations could be already put in the git repo as preconfigured products.

Notes

The above section is just an example of how this configuration could be done. Maybe there is something similar more Linux-specific... (or Vagrant-specific...?).

Detail remark: I would have preferred to push the sxml file to the github repo, but it appears that github provides raw files via https only and SPLOT cannot consume https URLs (?).

Automate import of franca examples into the workspace

Maybe it is possible to automate the import of the franca example files into the workspace.

Where are the workspace / current project settings stored in Eclipse?

Ideas?

This needs to be done after "Automatic configuration of workspace"

Add support for MS Windows 7

Hello,

I tried gunnarx/franca_install_automation with Vagrant running under MS Windows 7 and Cygwin.

As suggested I chose the supposedly stable "trusty64-lxde" branch. Here is the result I got:

gmacario@ITM-GMACARIO-W7 /cygdrive/e/data/GENIVI/franca_install_automation
$ vagrant up --provider=virtualbox
Vagrant has no proxy plugin => skipped proxy configuration.
Vagrant has no proxy plugin => skipped proxy configuration.
E:/data/GENIVI/franca_install_automation/Vagrantfile:42:in ``': No such file or directory - date +%Y%m%d%H%M (Errno::ENOENT)
        from E:/data/GENIVI/franca_install_automation/Vagrantfile:42:in `block in <top (required)>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/v2/loader.rb:37:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/v2/loader.rb:37:in `load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/loader.rb:103:in `block (2 levels) in load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/loader.rb:97:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/loader.rb:97:in `block in load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/loader.rb:94:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/config/loader.rb:94:in `load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/vagrantfile.rb:28:in `initialize'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/environment.rb:691:in `new'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/environment.rb:691:in `vagrantfile'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/environment.rb:441:in `host'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/environment.rb:207:in `block in action_runner'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/action/runner.rb:33:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/action/runner.rb:33:in `run'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/environment.rb:428:in `hook'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/environment.rb:673:in `unload'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/bin/vagrant:177:in `ensure in <main>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.7.2/bin/vagrant:177:in `<main>'

gmacario@ITM-GMACARIO-W7 /cygdrive/e/data/GENIVI/franca_install_automation
$

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.