Giter VIP home page Giter VIP logo

addon-context-windows's Introduction


⚠️⚠️⚠️⚠️⚠️⚠️⚠️

Important

This repository is being moved to a new location https://github.com/OpenNebula/one-apps During the transition the repository is in read-only mode


OpenNebula Windows VM Contextualization

Description

This addon provides contextualization package for the Windows guest virtual machines running in the OpenNebula cloud. Based on the provided contextualization parameters, the packages prepare the networking in the running guest virt. machine, set passwords, run custom start scripts, and many others.

Download

Latest versions can be downloaded from the release page. Check the supported OpenNebula versions for each release.

Install

Documentation on packages installation and guest contextualization can be found in the latest stable OpenNebula Operation Guide. For beta releases, refer to the latest development documentation.

Build own package

Requirements

The service manager NSSM is the preferred tool to manage services because it handles long running services better and more correctly (srvany/rhsrvany fails to terminate its child processes on stop). NSSM is in public domain and the binary is part of this repo. There are both 32bit and 64bit versions - currently 32bit version is used because it covers broader set of systems.

If you wish to use rhsrvany instead then you must set the shell variable SRV_MANAGER to rhsrvany otherwise it will default to nssm.

On RHEL (CentOS) and Fedora systems, the required binary rhsrvany.exe is distributed as part of the package virt-v2v and placed into /usr/share/virt-tools/rhsrvany.exe. Please copy the EXE into your local repository clone before creating the MSI.

Steps

Script generate.sh builds the MSI package. It's a wrapper around the wixl command from msitools. It reads the package.wxs, a package definition in the WiX-like XML format. Package name or version can be overridden by env. variables NAME and VERSION. For example:

$ TARGET=msi ./generate.sh
$ NAME=one-context TARGET=msi ./generate.sh
$ VERSION=1.0.0 TARGET=msi ./generate.sh

New package is created as ${NAME}-${VERSION}.msi, e.g. one-context-1.0.0.msi in the out/ directory.

You can also built both the iso and msi targets like this:

$ ./generate-all.sh

Or with a different service manager and explicit version:

$ env SRV_MANAGER=rhsrvany VERSION=5.13 ./generate-all.sh

Please ignore following assertion on package build, which is caused by skipping the attribute Start in tag ServiceControl. The parameter is optional in WiX specification, but the msitools still counts with it. Despite that, the package is built.

(wixl:22764): wixl-CRITICAL **: wixl_wix_builder_install_mode_to_event: assertion 'modeString != NULL' failed

Acknowledgements

This addon is largely based upon the work by André Monteiro and Tiago Batista in the DETI/IEETA Universidade de Aveiro. The original guide is available here: OpenNebula - IEETA

License

Copyright 2002-2021, OpenNebula Project, OpenNebula Systems (formerly C12G Labs)

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

addon-context-windows's People

Contributors

andremonteir avatar dann1 avatar eric-n-be avatar janis-veinbergs avatar jfontan avatar jmelis avatar kvaps avatar meerkampdvv avatar rsmontero avatar tinova avatar twangboy avatar vheathen avatar vholer avatar virtion avatar xorel avatar yenya avatar

Stargazers

 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

addon-context-windows's Issues

REPORT_READY=yes and VMware API does not work

Heay

If we use the VMware API to get the context Variables Report Ready is currently not working.

The Following does not work :

            $tokenPath = $contextLetter + 'token.txt'
            if (Test-Path $tokenPath) {
                $token = Get-Content $tokenPath
            } else {
                Write-Output " ... Failed: Token file not found"
                return
            }

The Token is already defined in $context['ONEGATE_TOKEN']

current workaround is to add the following startscript to the context :

#REPORT READY IF Required
if($context["REPORT_READY"] -eq "YES"){
    $body = "READY = YES"
    $token= $context.ONEGATE_TOKEN
    $target= $context.ONEGATE_ENDPOINT+"/vm"
    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    [System.Net.HttpWebRequest] $webRequest = [System.Net.WebRequest]::Create($target)
    $webRequest.Method = "PUT"
    $webRequest.Headers.Add("X-ONEGATE-TOKEN", $token)
    $webRequest.Headers.Add("X-ONEGATE-VMID", $context.VMID)
    $buffer = [System.Text.Encoding]::UTF8.GetBytes($body)
    $webRequest.ContentLength = $buffer.Length
    $requestStream = $webRequest.GetRequestStream()
    $requestStream.Write($buffer, 0, $buffer.Length)
    $requestStream.Flush()
    $requestStream.Close()
}

onecontext service binary is dated 01.01.1970

Hi,

there seems to be a little issue with how the binary for the onecontext service is generated.
If I look at it with SysInternal's "autoruns" tool then it will show the "second 0" date.

Error creating user

Hello, following error in log

Method invocation failed because [System.Object[]] doesn't contain a method named 'Contains'.
At C:\Program Files (x86)\OpenNebula\context.ps1:114 char:47
+                 If (-Not $memberNames.Contains <<<< ($username)) {
+ CategoryInfo          : InvalidOperation: (Contains:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Can't set IPv6 when VM have multiple NICs

Hello,

I found a small bug on this script. I have 3 NIC with 2st NIC only have a IPv6 address. After run context.ps1 script then 2st and 3st NIC not configured. I solve the issue by modify conditional on configureNetwork function. I think you should update context.ps1 script.

function configureNetwork($context) {
    $nicId = 0;
    $nicIpKey = "ETH" + $nicId + "_IP"
    $nicIpKey6 = "ETH" + $nicId + "_IP6"
    while ($context[$nicIpKey] -Or $context[$nicIpKey6]) {
    .... truncated ....
    
    	$nicId++;
        $nicIpKey = "ETH" + $nicId + "_IP"
        $nicIpKey6 = "ETH" + $nicId + "_IP6"
    }
}

Contextualization is done even with no context ISO and no vmtoolsd.exe

If context ISO is not yet available (during early boot stage) and vmtoolsd.exe is not installed, the script doesn't fail, but continues in the contextualization process with empty context variables.

    # Try the VMware API
    $vmwareContext = & "$env:ProgramFiles\VMware\VMware Tools\vmtoolsd.exe" --cmd "info-get guestinfo.opennebula.context" | Out-String

    if ($vmwareContext -eq "") {
        Write-Host "No Context CDROM found."
        exit 1
    }

If vmtoolsd is missing, the $vmwareContext is null, not empty string. Expression for this case fails.

New attached NIC doesn't assign IP util reboot

When attach new NIC to VM, the new attached NIC does not assign IP correctly util restart or I have to run this command manually:
powershell.exe -ExecutionPolicy Unrestricted -file 'C:\Program Files (x86)\OpenNebula\context.ps1'

Can new attached NIC assign IP automatically without reboot or run command manually?

INIT_SCRIPTS not run when using VMWare Tools

If we end up using the VMWare tools to pull the context information instead of the CONTEXT ISO, the $contextLetter variable never gets set. I'd expect this to get set up $env:SystemDrive\. Without this being set, scripts declared in the runScripts function don't run because the this doesn't set the path correctly:

runScripts $context $contextLetter

$script = $contextLetter + $script

Puppet instead of scripts

Not really an issue, but I was wondering if anyone has given any thought (pros vs. cons) to using puppet or something alike to modify system configs instead of the scripts for both win and linux?

Thanks and hope I don't get dinged for posting it here...
Cheers

Support ALIAS_DETACH=YES

This is issue is related with the solution proposed to this bug.

Context network scripts, have to changed, if ALIAS_DETACH=YES the interface mustn't be configured.

vmtoolsd not found in 64-bit Windows guests

The path of vmtoolsd is hardcoded to ...\Program Files\VMware\..., however depending on the architecture it might be located under ...\Program Files (x86)\VMware\..., furthermore, it might be called entirely differently depending on the locale, for example in spanish it may be installed under ...\Archivos de programa\....

Instead of hardcoding the path, it would be a good idea to fetch it dynamically using an environment variable, possibly this one: "${Env:ProgramFiles(x86)}". If it's not easy to detect whether it's a 32-bit or a 64-bit guest, we could search first in one path (64-bit), and if it doesn't exist there, try to find it under the 32-bit path.

Capture script output

For debugging purposes it's necessary to have output from the contextualization script.

Recontextualization Support

Contextualization happens only on boot, i.e. hot-attached NIC are not configured, live-resized root disks are not resized until the Windows reboots. One time contextualization process should be switched into a permanent daemon, which A) listens for the system events and reruns the contextualization and/or B) periodically checks for changes. Recontextualization should happen also on VMware (where is no CD-ROM).

Dedicated dir. for state files

Right now, we are using root of the system drive (e.g. C:\) to store the copy of context.sh, state files, logging. We should move the files into a proper dedicated directory not to mess the root.

EJECT_CDROM doesn't work on Server 2016/2022 Core

The reason is:

PS> New-Object -ComObject IMAPI2.MsftDiscMaster2
New-Object : Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-000000000000} failed due to the following error: 80040154 Class not registered (Exception from HRESULT:
0x80040154 (REGDB_E_CLASSNOTREG)).
At line:1 char:1
+ New-Object -ComObject IMAPI2.MsftDiscMaster2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (:) [New-Object], COMException
    + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand

However this works:

#https://learn.microsoft.com/en-us/windows/win32/api/shldisp/ne-shldisp-shellspecialfolderconstants
$ssfDRIVES = 0x11
$sh = New-Object -ComObject "Shell.Application"
$sh.Namespace($ssfDRIVES).Items() | ? { $_.Type -eq "CD Drive" -and $_.Path -eq $cdrom_drive.Name } | %{ $_.InvokeVerb("Eject") }

I'v tested in Windows Server 2016 Core and Windows Server 2022 Core

Deploy SSH Keys for windows user

Since Windows also support now OpenSSH, it can be great that context support to deploy user ssh-keys for Administrator or common user.

Documentation

Progress Status

  • Code committed
  • Testing - QA
  • Documentation (Release notes - resolved issues, compatibility, known issues)

Created user doesn't have sufficient rights to connect via RDP

Hello, I manually apply fix from #38 and try context script again. User is created, but I can't connect via RDP, which says InsufficientPrivileges(9). Looks like that user is not added to right group, which should happend in that fixed If (-Not $memberNames -Contains $username) { struct.

**********************
Windows PowerShell Transcript Start
Start time: 20180401120256
Username  : WORKGROUP\SYSTEM 
Machine	  : WINDOWS7PC (Microsoft Windows NT 6.1.7601 Service Pack 1) 
**********************
Running Script: C:\Program Files (x86)\OpenNebula\context.ps1

Sunday, April 01, 2018 12:02:56 PM

Detecting contextualization data
- Looking for CONTEXT ISO
  ... Found
Loading Context File
- Extend partitions
Creating Account for kristian
- Creating account
- Setting password to never expire

Enabling Remote Desktop
- Enable Remote Desktop Rule Group
- Enable Allow Terminal Services Connections
  ... Success

Enabling Ping
- Enable Allow Inbound Echo Requests
  ... Success

Configuring Network Settings: Red Hat VirtIO Ethernet Adapter
- Release DHCP Lease
  ... Failed: 83
- Enable Static IP
  ... Success
- Set Gateway
  ... Success
- Set DNS Server Search Order
  ... Success
- Set Dynamic DNS Registration
  ... Success
- Disable IPv6 router discovery
  ... Success
- Removing old IPv6 addresses
  ... Not implemented
- Set IPv6 Address
- Removing old IPv6 DNS Servers
- Set IPv6 DNS Servers

Running Scripts

**********************
Windows PowerShell Transcript End
End time: 20180401120312
**********************

Improve context service error management

It is possible to make the context service crash and log errors non-stop in the logfile if the ISO is ejected from the CD-ROM

*** ENTERING THE SERVICE LOOP ***
I [2022-11-28 14:52 -08:00] Starting a wait-loop with the interval of 30 seconds...
*** WAIT-LOOP START
PS>TerminatingError (Test-Path): "Cannot bind argument to parameter 'Path' because it is nul Test-Path: Cannot bind argument to parameter 'Path' because it is null. At C:\Program Files (x86)\OpenNebula\context.ps1:1220 char:37
+
+
if ($dir -ne "" -and (Test-Path $dir)) {
+ CategoryInfo
: InvalidData: (:) [Test-Path], ParameterBindingValidationExcep
+ FullyQualifiedErrorId :
ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands. TestPathComman Test-Path: Cannot bind argument to parameter 'Path' because it is null.
At C:\Program Files (x86)\OpenNebula\context.ps1:1220 char:37

The error occurs due to the powershell conditions allowing an exception to be made when the Test-Path function receives a null value which is passed when the ISO is ejected. This exception can be avoided if checking when the value is null prior to using Test-Path.

Remove unnecessary polling logs

At the moment, the context service on windows, polls every 30 seconds for changes in the context files. The context service logs a lot of information when nothing is happening. For example

2022-11-24 12:49 -08:00]* Detecting contextualization data
2022-11-24 12:49 -08:00] Looking for CONTEXT ISO 2022-11-24 12:49 -08:00] ... Found
2022-11-24 12:49 -08:00] Found contextualization data: D:\context.sh -
2022-11-24 12:49 -08:00] Contextualization data were not changed
2022-11-24 12:49 -08:00] Cleanup for the next iteration ...
2022-11-24 12:49 -08:00] . Sleep for 30s ...
2022-11-24 12:50 08:00]* Detecting contextualization data
2022-11-24 12:50 08:00] Looking for CONTEXT ISO
2022-11-24 12:50 08:00]
Found
2022-11-24 12:50 08:00] Found contextualization data: D:\context.sh -
2022-11-24 12:50 08:00] Contextualization data were not changed
2022-11-24 12:50 08:00]
Cleanup for the next iteration ...
2022-11-24 12:50 08:00]
Sleep for 30s...

This causes the context log to fill up quickly with unimportant information.

Proposal

  • Only log information when changes happen

Set IP issue with Windows 2008 R2

The script was unable to set IP address properly on Windows 2008 R2, the DNS, and gateways were fine, however the IP wasn't.

Remove the line from the script that workaround this problem. It looks a time race between release IP and set the IP where the vNIC has not yet been ready for set manual IP address.

$nic.ReleaseDHCPLease()

IPv4 Contextualization not working

Hi,

I just created a Windows Server 2016 image as described in the wiki.
The IPv6 contextualization is working without a problem, but unfortunately on the IPv4 side it isn't working, only the Gateway has been added.

IPv4 NIC Settings:
rhfsil7

I tried to enter the values manually and noticed the appereance of a message that the IP and Gateway are in different subnets. I had to manually click ok and after that it also works.
Maybe that's where the problem is located?

7owxobv

Refactor how/when VM is restarted

We should think about how to refactor the code so we don't have to use sate files ...\.opennebula-renamed" when the VM is restarted.

Contextualize the instance on each run

With fix from 2770ff3 the contextualization is done only once. The file lock was created after successful run even before, but now this lock is checked in subsequent runs. We want to always run through the contextualization, because the instance static IP settings can change.

Windows 2016 Core Server does not Add user to local Administrators

I am trying to Contextualizat a Windows 2016 core installation on KVM.
Windows gets installed with one-context-5.6.0.msi and then i run sysprep.
After i Instantiate the Machine i cannot connect via RDP to the maschine via the given User:Passwort set in the Template.

CONTEXT = [
  NETWORK = "YES",
  PASSWORD = "Passw0rd!",
  REPORT_READY = "YES",
  TOKEN = "YES",
  USERNAME = "openuser" ]
CPU = "1"
DISK = [
  IMAGE = "Windows-2016-KVM-Packer" ]
GRAPHICS = [
  LISTEN = "0.0.0.0",
  TYPE = "VNC" ]
INPUTS_ORDER = ""
LOGO = "images/logos/windows8.png"
MEMORY = "2048"
MEMORY_UNIT_COST = "MB"
OS = [
  ARCH = "x86_64",
  BOOT = "" ]

.opennebula-context.out

**********************
Windows PowerShell transcript start
Start time: 20180827105636
Username: OPENNEBULAVM\Administrator
RunAs User: OPENNEBULAVM\Administrator
Machine: OPENNEBULAVM (Microsoft Windows NT 10.0.14393.0)
Host Application: powershell
Process ID: 3028
PSVersion: 5.1.14393.206
PSEdition: Desktop
PSCompatibleVersions: 1.0, 2.0, 3.0, 4.0, 5.0, 5.1.14393.206
BuildVersion: 10.0.14393.206
CLRVersion: 4.0.30319.42000
WSManStackVersion: 3.0
PSRemotingProtocolVersion: 2.3
SerializationVersion: 1.1.0.1
**********************
Running Script: &

Monday, August 27, 2018 10:56:36 AM

Detecting contextualization data
- Looking for CONTEXT ISO
  ... Found
Loading Context File
- Extend partitions
Creating Account for openuser
- Setting Password
- Setting password to never expire
Error while invoking GetType. Could not find member.
At C:\Program Files (x86)\OpenNebula\context.ps1:110 char:32
+ ...                            $memberNames += $_.GetType().InvokeMember(
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException
Error while invoking GetType. Could not find member.
At C:\Program Files (x86)\OpenNebula\context.ps1:110 char:32
+ ...                            $memberNames += $_.GetType().InvokeMember(
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException

Error while invoking GetType. Could not find member.
At C:\Program Files (x86)\OpenNebula\context.ps1:110 char:32
+ ...                            $memberNames += $_.GetType().InvokeMember(
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException
Error while invoking GetType. Could not find member.
At C:\Program Files (x86)\OpenNebula\context.ps1:110 char:32
+ ...                            $memberNames += $_.GetType().InvokeMember(
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException

Error while invoking GetType. Could not find member.
At C:\Program Files (x86)\OpenNebula\context.ps1:110 char:32
+ ...                            $memberNames += $_.GetType().InvokeMember(
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException
Error while invoking GetType. Could not find member.
At C:\Program Files (x86)\OpenNebula\context.ps1:110 char:32
+ ...                            $memberNames += $_.GetType().InvokeMember(
+                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException

- Adding to Administrators
Exception calling "Add" with "1" argument(s): "The specified account name is already a member of the group.
"
At C:\Program Files (x86)\OpenNebula\context.ps1:121 char:25
+                         $group.Add("WinNT://$computerName/$username")
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
Exception calling "Add" with "1" argument(s): "The specified account name is already a member of the group.
"
At C:\Program Files (x86)\OpenNebula\context.ps1:121 char:25
+                         $group.Add("WinNT://$computerName/$username")
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI


Enabling Remote Desktop
- Enable Remote Desktop Rule Group

Updated 3 rule(s).
Ok.
- Enable Allow Terminal Services Connections
  ... Success

Enabling Ping
- Enable Allow Inbound Echo Requests
  ... Success

Configuring Network Settings: Realtek RTL8139C+ Fast Ethernet NIC
- Release DHCP Lease
  ... Failed: 83
- Enable Static IP
  ... Success
- Set Gateway
  ... Success
- Set DNS Server Search Order
  ... Success
- Set Dynamic DNS Registration
  ... Success
- Ping Interface IP X.X.X.X
  ... Success (4 tries)

Running Scripts

**********************
Windows PowerShell transcript end
End time: 20180827105648
**********************

External ALIAS support

Alias should be configured inside VM only if EXTERNAL=no.

Currently the scripts doesn't check for EXTERNAL at all.

Windows not extending partition

The PowerShell script would not extend partitions on any of my Windows 10 or Server 2016 templates.

I found the root cause and made a patch.

Cause a hidden reserved partition before the main OS partition

wmic does not show it:

wmic partition where DiskIndex=0 get Index,Caption

Caption                Index
Disk #0, Partition #0  0
Disk #0, Partition #1  1
Disk #0, Partition #2  2

Where diskpart does:

"select disk 0","list partition"| diskpart | Select-String -Pattern "^  Partition \d" -AllMatches

  Partition 1    Recovery           499 MB  1024 KB
  Partition 2    System              99 MB   500 MB
  Partition 3    Reserved            16 MB   599 MB
  Partition 4    Primary            197 GB   615 MB

My changed version of the function extendPartitions:
I rewrote the $partsIds list collection using just diskpart.

function extendPartitions()
{
    Write-Output "- Extend partitions"

    #$diskIds = ((wmic diskdrive get Index | Select-String "[0-9]+") -replace '\D','')
    $diskId = 0

    #$partIds = ((wmic partition where DiskIndex=$diskId get Index | Select-String "[0-9]+") -replace '\D','' | %{[int]$_ + 1})
    $partIds = "select disk $diskId","list partition"| diskpart | Select-String -Pattern "^  Partition \d" -AllMatches | %{$_.matches} | %{$_.value.replace("  Partition ", "") }

    ForEach ($partId in $partIds) {
        extendPartition $diskId $partId
    }
}

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.