Giter Club home page Giter Club logo

restor's Introduction

Restor

Restor is a user-friendly application to (mass) image macOS computers from a single source. It is an application intended to be run interactively on a machine.

Restor

You can attach the machine-to-be-imaged via Thunderbolt or USB to the machine running Restor.

Restor Disk Choice

Restor will cache an image once it has been downloaded for future use, and will validate the image via SHA256. Only if the signature has changed, will the image be downloaded again.

Restor Download Progress

Restor Image Validation

Example Configuration

Restor has a few configurable options, 1 of which is required. These can be specified using a local plist (stored at /Library/Preferences/com.google.corp.restor.plist) or using a Configuration Profile for the com.google.corp.restor domain.

ConfigURL

Required

Set the ConfigURL preference to point at a plist containing the images to be used.

sudo defaults write /Library/Preferences/com.google.corp.restor.plist ConfigURL "http://server/images.plist"

The following format for the plist is required:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Images</key>
	<array>
		<dict>
			<key>Name</key>
			<string>Sierra (10.12) All Models</string>
			<key>URL</key>
			<string>http://server/10.12.6.dmg</string>
			<key>SHA-256</key>
			<string>ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff</string>
		</dict>
	</array>
</dict>
</plist>

CustomImage

Optional

Set the CustomImage preference to toggle the use of a local custom image.

sudo defaults write /Library/Preferences/com.google.corp.restor.plist CustomImage -bool true

ConfigCheckInterval

Optional

Set how often Restor should download and validate the image configuration in the background. Specified in seconds, defaults to 900 (15 minutes).

sudo defaults write /Library/Preferences/com.google.corp.restor.plist ConfigCheckInterval -int 600

DiskFilterPredicate

Optional

Allows you to customize which disks will appear in the Restor UI (or that will be imaged automatically in auto-image mode). The default predicates, which cannot be overridden, will filter out internal disks and system volumes such as Recovery, VM, Preboot, etc. This key allows you to specify, using NSPredicate other disks which should not be shown to the user. You can use any of the properties on the Disk object to create your predicate.

You can also pass the --debug-disk-filters flag to Restor.app to see what effects the predicate is having.

Examples:

  • Filter out disks larger than 5TB:
sudo defaults write /Library/Preferences/com.google.corp.restor.plist DiskFilterPredicate -string \
    "(diskSize < 5497558138880)"
  • Filter out disks made by Seagate:
sudo defaults write /Library/Preferences/com.google.corp.restor.plist DiskFilterPredicate -string \
    "(deviceVendor != 'Seagate')"
  • Filter out disks by their id:
sudo defaults write /Library/Preferences/com.google.corp.restor.plist DiskFilterPredicate -string \
    "(bsdName != 'disk3s2')"

ASRAttempts

Optional

Set how many times Restor should attempt to run ASR until it runs successfully. This may help with issues where the Volume is not unmountable by ASR due to some external process (ie spotlight) holding onto it. Defaults to 1.

sudo defaults write /Library/Preferences/com.google.corp.restor.plist ASRAttempts -int 5

10.13 and APFS Note

In order to restore an APFS 10.13 DMG to a machine, the host machine running Restor must also be upgraded to High Sierra 10.13. Otherwise, you will receive an error when attempting to image the machine.

Restor APFS Error

Building from source

Building Restor from source is not required for general usage. Please see the Releases page to download a pre-compiled version of Restor.

Requirements

  • Xcode 9+ installed
  • bazel installed
  • A valid "Mac Developer" Signing Certificate from Apple
  • Xcode 9+ command line tools installed

Build steps

  1. git clone https://github.com/google/restor.git
  2. cd restor
  3. Find your certificate's common name (CN).
    security find-certificate -p -c "Mac Developer" | openssl x509 -inform pem -subject | perl -ne '/CN=([\w :\(\)]+)\// && print $1'
  4. Edit the .bazelrc file, filling in your CN.
  5. Build with the following command, making sure to insert a valid Team Identifier from the previous step.
    bazel build //Restor

If the build was successful the last line will contain the path to your compiled Restor.app.

Contributing

Patches to this library are very much welcome. Please see the CONTRIBUTING file.

restor's People

Contributors

arubdesu avatar clburlison avatar eigerman avatar howiekaye avatar jbaker10 avatar nguyen-phillip avatar russellhancox avatar tburgin avatar wardsparadox 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

restor's Issues

make error

well, it it might my stupidity, but i get an error on osx 10.12.6 an 10.13:

MBPRetina:restor felix$ make
Makefile:2: Pods dir does not exist, running 'pod install'
Makefile:3: *** missing separator. Stop.

Restor will not launch, can't connect to PrivilagedHelperTool

Launching Restor results in being unable to be used. Cleared Restor from system (removed /Library/PrivilagedHelperTool/com.google.corp.restord, /Lib/Pref/com.google.corp.restor.plist), re-built and re-ran Restor. The PrivilagedHelperTool does not get copied over. Fails with

default	14:49:14.461610 -0600	Restor	An error occurred installing the privileged helper tool: Error Domain=CFErrorDomainLaunchd Code=8 "(null)"

in console. Attached is Console log watching for Restor with "include Debug" turned on.
restor_log.txt

Default startup disk is not set when EFI password is enabled

I have a MacBook Air that I've been successfully testing restor with. If I turn on the firmware password, then restore an image, the mac boots to the blinking folder icon. If I remove the firmware password and run a restore, the mac boots the freshly loaded OS normally.

Not sure if this is a bug, limitation, or needs to be a feature request to support EFI passwords.

In case it matters: I'm using a 10.13.3 APFS image built with AutoDMG against a 2011 MacBook Air.

Restor shows the Recovery HD when a machine is connected

When a machine is connected to the machine running Restor, the app will show you two disks. The primary partition (i.e. 250GB) and what appears to be the Recovery HD (650MB). It should only show the primary HD if possible.

See image in the README regarding Disk Choice

Clicking image while still unlocking disk results in error

The disk unlock password prompt doesn't appear to prevent the user from clicking "Image" prematurely. Between entering the password and the time the disk is fully unlocked (password prompt still visible) user can click on "Image" which will throw the following error:

ASR failed with exit code: 1.
Potential Errors:
Couldn't set up partitions on target device - operation DeleteAPFSVolume, line #4518 - error 49165
Couldn't set up partitions on target device - operation DeleteAPFSVolume, line #4518 - error 49165
Couldn't set up partitions on target device - operation DeleteAPFSVolume, line #4518 - error 49165
Couldn't set up partitions on target device - operation DeleteAPFSVolume, line #4518 - error 49165
Couldn't set up partitions on target device - operation DeleteAPFSVolume, line #4518 - error 49165

While the error is expected, recovering from the error is difficult as you cannot re-select a disk that has errored out

[Req] Allow launching in auto-image state

Feature request:
Can you provide a switch or a preference that allows us to launch the program already in "Auto-Image" mode? Upon launch, it should read the preferences and use the primary disk image provided by the server's config plist and immediately download/cache/verify and then turn on Auto-Image mode.

This would allow us to create passive auto-launching auto-imaging restor devices, coupled with a launchagent using "KeepAlive" to ensure it's always running.

Restor 1.11 and MacOS 10.14.4

Seeing an issue with MacOS 10.14.4, with Restor 1.11 when restoring an image. All target machines boot into a flashing disk upon restor.
When running MacOS 10.14.3, with Restor 1.11 using the same source images, we see no problems.
Using asr on 10.14.4 works without issue, using this command: sudo /usr/sbin/asr restore --buffersize 16m --source test.apfs.dmg --target /Volumes/MacHD --erase --noprompt --noverify --puppetstrings --verbose
Have also tested with Restor 1.8 and have the same issue when running from a 10.14.4 machine.

Repartition disk to one container from Restor.app ?

I am not sure if this is an issue or a feature request.
I tested Restor with to restore a macbook with 2 partitions (one HFS, one APFS container) and both show up as targets. (disk2S2 and diks2s3).
I can restore to each target fine. (10.13.2 apfs dmg created with AutoDMG, running Restore.app on my Mac 10.13.2)
What I am looking for is to use the Resore.app to default one APFS container (plus 1 EFI), REGARDLESS OF EXISTING PARTITIONS to restore the Mac to 'factory' default.

Can I use the Restore.app to do this? Maybe I overlooked a preference setting.

Possible memory leak?

Disclaimer: I haven't run instruments yet to figure out where this is, just writing this up before I forget about it.

In a usage of Restor, the download of a 25GB .dmg file resulted in 45+ GB of memory being consumed during the process. I wasn't sure if the application was intentionally buffering to memory for some reason, but looking through

if (!self.authSession) self.authSession = [[MOLAuthenticatingURLSession alloc] init];
and the related code, I'm not seeing any intention to do this (also - nice trick hashing + downloading at the same time!)

Would it be a side effect of the dispatch queue? Would the received byte chunks queue up in memory while it waited for disk writes?

Of note, the machine I was testing this on had 3x+ times the available space needed for holding the .dmg prior to starting, but as a result of the memory usage ended up filling the disk with vm swapfiles and eventually caused Restor to not be able to finish saving the file to disk. Yes, my fault for doing something like this on a disk with "low" available space, I know, but just something interesting / possible room for improvement somewhere.

If I get a chance to analyze it for leakage, I'll see if I can find where it's happening and update here.

Allow insecure connections

There should really be a setting to allow either insecure connections over http, or there should be a way to enable self signed certificates to be accepted. I can not set up a full fledged SSL activated test server just to get thing up and running. It's nice to have SSL active, but in this particular scenario, where you usually use a local subnet webserver to serve the config plist and the image, secure connections are not that important in my opinion.

Default startup disk

Hello!

I'm currently testing restor with both a local custom image setting as well as downloading over our network off a mac mini with macOS server. Currently the local install of Sierra works, but only if I manually boot into recovery mode and set the hard drive as the startup disk. Else I get the flashing question mark folder boot.

I'm about to test local High Sierra plus network of both versions and will report back further. For reference this was done via TB2 cable off an iMac.

Thanks.

Edit: Network install of Sierra had no issue. I then did a local install of Sierra again and the issue did not recur. I'll continue to test with High Sierra on both methods and move on to additional different laptops afterwards.

http support

Would the Google team accept a PR to enable http support via the NSAllowsArbitraryLoads setting?

Custom Images Fails

If I compile my own project using our team project ID, it starts to work fine (I've gotten to where it deletes the partition), but then it will fail and tell me that I have to use 10.13+ to restore an APFS image. I'm running 10.13.15 B3, so that's clearly not the case. If i use an HFS image, I get " Could not unmount volume "/Volumes/%noformat" resource busy.

Using the release dmg doesn't give me either of these errors but will just hang indefinitely on "starting". I'm not really sure what to do, and i've poked at this for about 2 days now. Any insight into either of these issues would be much appreciated.

Usability issues, error-handling continued

I cleaned up my other asr-in-an-apfs/iMacPro-world-specific issue since that is encompassed by the work in #16, but I noticed these two other caveats I think should get logged for new users/noted as a 'rough edge' for low-priority future consideration:

  • if the image fetch request returns a 403, it just hangs at -1 bytes:

screen shot 2018-02-20 at 17 22 59

- if there's no network connectivity at time of app launch there's no built-in way to refresh/re-check (that I know of), you must quit and re-launch the app (love that 'autolayout is awsm' vibe the error message has, too ๐Ÿ˜œ )

screen shot 2018-02-21 at 13 28 11

Bundle the LaunchDaemon outside of the helper tool

In my process of automating the Restor installation, I have put together the following:

  1. Install Restor.app to /Applications
  2. Install Restor.app/Contents/Library/LaunchServices/com.google.corp.restord to /Library/PrivilegedHelperTools
  3. Extract the LaunchDaemon out of the helper tool (manually), install it to /Libary/LaunchDaemons and load it.

I have created a custom package with a postinstall script to handle this, however I had an idea.

If you would be willing to bundle the LaunchDaemon at Restor.app/Contents/Library/LaunchServices and remove it from the helper tool, someone (myself) could easily write an autopkg recipe for Restor that automates this procedure.

Right now the LaunchDaemon is in the source code, however I have found that the helper tool adds some components to the launchdaemon that are not here - my assumption is this is injected into the helper tool when the build process is being created.

Since you already supply a signed DMG, the build process/helper tool would just need to be slightly modified to do this.

Doc enhancement - cache location

Just to get it logged, the readme may benefit from containing the fact that images are cached in the users ~/Library/Caches/com.google.corp.Restor directory(and obvs filenames/sha256's should match). Thanks!

Various partition issues with latest MBP

Hello guys,

We have been using Google Restor very often recently. It's very useful and making our lives so much happier. However we are running on some errors just on certain machines. Do you know why this is the case?

  • ASR failed with exit code: 1.Potential Errors:Could not find APFS container disk for target - /dev/disk2s2
  • ASR failed with exit code: 1.Potential Errors:Couldn't set up partitions on target device - error 49165
  • ASR failed with exit code: 1.Potential Errors:Couldn't set up partitions on target device - Operation timed out
  • ASR failed with exit code: 1.Potential Errors:Couldn't set up partitions on target device - error 49182

Nick

'Host' (computer running Restor) powers off during imaging

Restor Device Model OS/Build Restor Version Image Used Hardware Being Imaged
A1989/MBP15,2 10.14.2 (18C54) 1.7(assuming same version priv. helper, sha1 starts 30cf9ffb) autodmg-cooked 10.14.1 apfs MBPro escape (A1708, touchbar-less)

Pardon that this is a second-hand report, I'm submitting this on behalf of my techs. Will update once they fill me in about the ? points above and/or I'm able to reproduce. I don't have a video of the exact symptom either, can't tell if it's a kernel panic situation, but it seems to have occurred on 4 distinct machines, base touchbar current model 13" MBP's and one 15-inch

How to use a local custom image

Hi
I created a local image .dmg with HighSierra with Autodmg, how to write the plist so Restor will use file instead of URL? My plistfile look like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CustomImage</key>
	<true/>
	<key>Images</key>
	<array>
		<dict>
			<key>Name</key>
			<string>High Sierra (10.13) All Models</string>
			<key>SHA-256</key>
			<string>b0bcd15848c9c4b1a1d8edc6621ce532ffdcafc12d086bf640e4d19dcdb19703</string>
			<key>URL</key>
			<string>/Users/username/Desktop/osx_updated_171010-10.13-17A405.apfs.dmg</string>
		</dict>
	</array>
</dict>
</plist>

Flashing Folder after imaging until USB or Recovery Partition is used

We are trying to use the Google tool restor and have built an image using the High Sierra Installer + AutoDMG (pulling latest updates). Once we have deployed the image to the Macbook Pro, the strangest thing happens:

We get a Flashing Folder with "?" until we plugin in a USB drive, then the machine boots fine. The USB Drive does not have any thing special about it, no bootable partition, no os files, nothing, just formatted HFS+ or AFS. It will continue like this until we Boot into the Recovery Partition, a) Select the disk and perform First Aid, then b) Select the Boot from this partition.

This is the only way to get the machine to complete the boot sequence. Has anyone else seen this?

Is it possible to ignore a disk?

We are setting up a restor kiosk that lays down an autodmg image. I was wondering if it's possible to ignore a disk in Restor? We have a 10 TB disk that we are using to take a snapshot of the TDM drive before we wipe and restor it, but restor tries to restor the 10 TB disk :P

[Feature Request] Support for Secure Boot compatible imaging workflow

Apple has made changes to asr's functionality and the workflow for restoring APFS images to Secure Boot devices and preserving trust / preventing Startup Security Utility from displaying dialogs that you need to connect to the Internet is slightly different than what Restor currently does for APFS.

Right now Restor deletes the APFS container partition and then re-creates it and then targets the newly created container as the restore destination.

In practice for us, this seems to cause problems with the iMac Pro (the only Secure Boot device model Apple currently makes). Devices that are imaged in this way seem to have problems with the new "encrypted at rest" capabilities and cause errors when attempting to enable FileVault2.

We noticed, however, that the text of the asr manpage changed under the section "RESTORING WITH APFS FILESYSTEMS" and a new section appeared regarding restoring volumes using erase.

An example of using asr directly with the new workflow is presented here:

iMac Pro, when Target Disk Mode attached to another Mac, the mounted disks show as follows:

/dev/disk2 (external):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         1.0 TB     disk2
   1:                        EFI EFI                     314.6 MB   disk2s1
   2:                 Apple_APFS Container disk3         1.0 TB     disk2s2

/dev/disk3 (external, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0: UUID-SHOWS-UP-HERE                                +1.0 TB     disk3

In this case, the APFS container can be referenced as both disk2s2 or disk3.

The command for restore is now just simply:

sudo asr restore --source os_image.apfs.dmg --target /dev/disk2s2 --erase --noverify --noprompt

Note that we do not remove and re-create the container.

When used with this more recent build of macOS (on the host machine running Restore), the output looks like as follows:

Validating target...done
    Validating source...done
    Retrieving scan information...done
    Validating sizes...nx_kernel_mount:1359: : checkpoint search: largest xid 130, best xid 130 @ 3
done
    Restoring  ....10....20....30....40....50....60....70....80....90....100
    Inverting target volume...done
    Remounting target volume...done
Personalization over TDM succeeded

Note the last line - which is key. Personalization has occurred. This requires that the host machine running Restor has access to Apple's services over the internet at restoration time and that the OS that you're installing to the Secure Boot device is compatible/bootable for that device (otherwise personalization will fail).

This results in a device which, at power on, with Full mode security (the default) enabled for Secure Boot, it will successfully boot the OS without triggering Startup Security Utility. Additionally, the volume is marked "encrypted at rest", the first user logging in gets a SecureToken, and you are able to properly enable FileVault2.

For this feature to work successfully, it may require detecting the OS that Restor.app is running on.

Additionally, I might suggest providing a preference for enabling an additional flag --no-personalization, which isn't documented, but it prevents the last step if that's necessary for some reason.

Restor stuck at "Starting..." screen when restoring a new 2018 MacBook Pro.

When using Restor on a MacBook Pro (13-inch, 2018, 4 TBT3) or a MacBook Pro (15-inch, 2018) trying to restore an APFS image (10.13.6 for example), Resor sits at a "Starting..." prompt. This is using multiple different machines running Restor, all running 10.13.4 or 10.13.6. Using Disk Utility to blow away the drive and restart does not make a difference. Happy to send any log files, please let me know which ones would be most beneficial.

need to bless after restoring 10.13.4 (apfs)

I use Restor 1.4, and since restoring 10.13.4 (apfs) images created with AutoDMG I noticed two things:
-restor takes much longer (not measured yet)
-after reboot the client, by default it shows blinking question mark (missing bootable volume)

This can be solved in two ways:
-booting using cmd-R to recovery, in Startup Disk set the 'Macintosh HD' to boot volume
-on the mac that runs Restor run this command: 'sudo bless --folder /Volumes/Macintosh\ HD/System/Library/CoreServices' (Macintosh HD is the name of the restored volume)

To run this, you first need to mount the just restored volume (with commands like diskutil mount disk3s1)
one can check the bootability using sudo bless --info /Volumes/Macintosh\ HD. The output can be for a bootable system:

          46 => Blessed System File is <Preboot>/BD0ABA49-C7E0-4909-9838-3BE39D5B7B48/System/Library/CoreServices/boot.efi
          44 => Blessed System Folder is <Preboot>/BD0ABA49-C7E0-4909-9838-3BE39D5B7B48/System/Library/CoreServices
The blessed volume in this APFS container is "/Volumes/Macintosh HD"

and for a non-bootable volume:

           0 => No Blessed System File
           0 => No Blessed System Folder 

Can you include the bless --folder step into Restor workflow?

Build issue due to bazel changes

As reported in Slack #restor, I was building from source and hitting errors that seem to have been introduced recently in bazel, bazelbuild/bazel#7594

ERROR: /Users/allister/Documents/restor-master/Restor/BUILD:45:22: in asset_catalogs attribute of objc_library rule //Restor:restor_lib: objc_library resource attributes are not allowed. Please use the 'data' attribute instead.
ERROR: Analysis of target '//Restor:Restor' failed; build aborted: Analysis of target '//Restor:restor_lib' failed; build aborted
INFO: Elapsed time: 65.470s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (38 packages loaded, 654 targets configured)

I was able to figure out through the naming of the feature flip that the additional build flag I could use in the meantime is --incompatible_disable_objc_library_resources=false
I tried to manually fix it in the BUILD file and it seemed to work for assets but not storyboards, if it had done fixed it you know me brudda, I'dve sent the PR ๐Ÿ˜‰

asr inverting errors

Hi there. First of all, this is a really cool project that I've gotten a tremendous amount of use out of. I'm submitting this on behalf of one of coworkers working in a different office, and honestly I'm not certain if the problem is with our process or Restor. We use custom images I've created with hdiutil. Everyone is using the same images and version of Restor (v1.11 currently). The images are locally stored on mac-mini's in each office location. Lately one of my coworkers has been experiencing some error messages I've never seen before. The first of the issues appeared in v1.8 where one of the techs would receive the following error message during the inverter step of imaging:

Screen Shot1

Now this is an asr error and not specific to Restor, we tried running asr restore via terminal which kept failing as well. I had the tech attempt from different devices with no avail. Eventually I ended up sending the tech a mac-mini I had tested (in Chicago) to the tech (in NYC). I had confirmed Restor was working on the mac-mini and imaged several brand new 2018 MBPs without any issues. When the tech received the mac-mini, they were able to image one new 2018 MBP successfully, but are now receiving a mixture of errors:

Screen Shot2

Either the error message above will show during the inverter step during imaging or Restor will image and the MBP will boot into the following screen and be unable to start the MBP:

Image from iOS

Our setups are essentially identical, so I'm just curious if anyone has insights or has run into similar issues before. Let me know if more detail is needed, I'll provide what I can. Thanks in advance for any advice anyone can provide.

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.