Giter Club home page Giter Club logo

aws-greengrass-core-sdk-python's Introduction

Greengrass Core Python SDK

The AWS IoT Greengrass Core SDK is meant to be used by AWS Lambda functions running on an AWS IoT Greengrass Core. It will enable Lambda functions to invoke other Lambda functions deployed to the Greengrass Core, publish messages to the Greengrass Core and work with the local Shadow service.

Using AWS IoT Greengrass Core SDK

To use the AWS IoT Greengrass Core SDK, you must first import the AWS IoT Greengrass Core SDK in your Lambda function as you would with any other external libraries. You then need to create a client for 'iot-data' or 'lambda'. Use 'iot-data' if you wish to publish messages to the local Greengrass Core and interact with the local Shadow service. Use 'lambda' if you wish to invoke other Lambda functions deployed to the same Greengrass Core.

Here is an example for using the 'iot-data' client

import greengrasssdk

# Let's instantiate the iot-data client
client = greengrasssdk.client('iot-data')

Now that you have an iot-data client, you can publish requests.

response = client.publish(
    topic='someTopic',
    payload='some data'.encode()
)

Here is an example for using the 'lambda' client.

import greengrasssdk

client = greengrasssdk.client('lambda')

Now that you have a lambda client, you can publish requests.

# Define the payload to pass to the invoked lambda function
msg = json.dumps({
    'message':"hello"
})

# Invoke the lambda function
response = client.invoke(
    FunctionName='arn:<partition>:lambda:<region>:<account id>:function:<function name>',
    InvocationType='RequestResponse',
    Payload=payload,
    Qualifier='2'
)

Compatibility

As new features are added to AWS IoT Greengrass, newer versions of the AWS IoT Greengrass SDK may be incompatible with older versions of the AWS IoT Greengrass core. The following table lists the compatible SDKs for all GGC releases.

GGC Version Compatible SDK Versions
1.0.x-1.6.x 1.0.x-1.2.x
1.7.x-1.8.x 1.0.x-1.3.x
1.9.x 1.0.x-1.4.x
1.10.x 1.0.x-1.5.x
1.11.x 1.0.x-1.6.x

Stream Manager

Greengrass version 1.10 comes with a new optional feature, Stream Manager. This SDK supports Stream Manager, but it has additional requirements. Specifically, Stream Manager requires Python version 3.7 or above. It also has package requirements listed in the requirements.txt file. Please install these requirements and bundle it with your lambda zip package.

To install the requirements you can use pip such as pip install --target . -r requirements.txt. This will install the requirements to the directory that you run the command in. In order to work in Greengrass the dependencies must be bundled in the zip with your lambda code. With the pip command above, the dependencies will be installed to the current directory. The dependencies must be bundled with your lambda code, so if the current directory doesn't have your lambda code, then simply copy the installed dependencies to the directory which contains your code.

aws-greengrass-core-sdk-python's People

Contributors

liuszeng avatar mikedombo avatar seanc-amazon 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

Watchers

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

aws-greengrass-core-sdk-python's Issues

Question: How to fix "Your AWS IoT Certificate Needs to be deployed to a deployment group." ?

I am trying to run docker image in the core device thru docker connector but I am getting this error from the DockerApplicationDeployment.log. How can I fix this? I am 100% sure that the certs are correct because i was able to do openssl test successfully. All the cert config such as group.json or config.json also has correct path.

I apologize if I posted in the wrong site. Please point to the correct site if this is the case.

Thanks in advance

StreamManager KeyError

ERROR:StreamManagerClient:Unhandled exception occurred
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/greengrasssdk/stream_manager/streammanagerclient.py", line 201, in __read_loop
    await self.__handle_read_response(payload, response)
  File "/usr/local/lib/python3.8/site-packages/greengrasssdk/stream_manager/streammanagerclient.py", line 226, in __handle_read_response
    await self.__requests[response.request_id].put(response)
KeyError: '3e299203-e8a6-4341-ac86-e1db7eae1636'
{"message": "Unhandled exception occurred", "exc_info": "Traceback (most recent call last):\n  File \"/usr/local/lib/python3.8/site-packages/greengrasssdk/stream_manager/streammanagerclient.py\", line 201, in __read_loop\n    await self.__handle_read_response(payload, response)\n  File \"/usr/local/lib/python3.8/site-packages/greengrasssdk/stream_manager/streammanagerclient.py\", line 226, in __handle_read_response\n    await self.__requests[response.request_id].put(response)\nKeyError: '3e299203-e8a6-4341-ac86-e1db7eae1636'"}
ERROR:root:error writing data to stream manager
{"message": "error writing data to stream manager"}

Current Setup:
Streaming a small amount of IOT sensor data(250 events a minute) through StreamManager for extended periods of time.

The stack ran in a healthy state for around 18 hours after which all events to Kinesis stopped when we saw this error in the logs. A restart of the component containing the stream manager client did not fix the problem. A full restart of greengrass with systemd fixed it and events were again flowing all the way to Kinesis.

How do we handle this issue? Appreciate any help on this.

Stream Manager Client Config

  exports = ExportDefinition(kinesis=[KinesisConfig(identifier="KinesisExport" + self.stream_name, kinesis_stream_name=kinesis_stream_name,  batch_size=250)] )

  MessageStreamDefinition(name=self.stream_name, strategy_on_full=StrategyOnFull.OverwriteOldestData, persistence=Persistence.File, flush_on_write=True, export_definition=exports)

[IoTDataPlane] Named shadows

Currently greengrass python SDK supports interaction with classic shadows, opposed to boto3 sdk, where shadow name is a parameter alongside thing name.
How should I interact with named shadows?
I suppose the only currently available way is to use raw MQTT messages...

StreamClient Append Message Issue

I am trying to append a message to the Stream but I am getting this error ERROR:StreamManagerClient:Unable to read from socket, likely socket is closed or server died but I am able to create streams without any error. Digging deep into the stream logs, I see that Stream manager cannot deserialize the instance of byte[]. Please see the GGStreamManager.log excerpt below.

[2020-01-27T14:54:03.267-08:00][ERROR]- (nioEventLoopGroup-3-3) com.amazonaws.iot.greengrass.streammanager.server.handlers.MessageStreamHandler: Caught exception in MessageStreamHandler
[2020-01-27T14:54:03.267-08:00][ERROR]-com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `byte[]` out of VALUE_STRING token
[2020-01-27T14:54:03.267-08:00][ERROR]- at [Source: (io.netty.buffer.ByteBufInputStream); line: -1, column: 73] (through reference chain: com.amazonaws.greengrass.streammanager.protocol.AppendMessageRequest["payload"])
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.deser.std.PrimitiveArrayDeserializers.handleNonArray(PrimitiveArrayDeserializers.java:240) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.deser.std.PrimitiveArrayDeserializers$ByteDeser.deserialize(PrimitiveArrayDeserializers.java:498) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.deser.std.PrimitiveArrayDeserializers$ByteDeser.deserialize(PrimitiveArrayDeserializers.java:446) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4014) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3071) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.amazonaws.greengrass.streammanager.protocol.SerDesUtil.deserialize(SerDesUtil.java:65) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.267-08:00][ERROR]-	at com.amazonaws.iot.greengrass.streammanager.server.handlers.MessageStreamHandler.channelRead(MessageStreamHandler.java:95) ~[AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:328) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:302) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:328) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:302) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [AWSGreengrassStreamManager.jar:?]
[2020-01-27T14:54:03.268-08:00][ERROR]-	at java.lang.Thread.run(Thread.java:834) [?:?]

Unable to connect my client device to AWS greengrass core

Hi, I am trying to connect 2 laptops on my personal wifi with one laptop serving as AWS greengrass core while another acting as client device. While trying the basic_discovery.py getting socket error as shown below. Kindly help me to identify the cause.
1/ I have setup the policy for both core device and client device as specified in the tutorial

Debug log is also attached

PS E:\AWS Greengrass\certs> python3 "E:\AWS Greengrass\basic_discovery.py" --thing_name myLaptop02 --topic 'clients/myLaptop02/hello/world' --message 'Hello World!' --ca_file AmazonRootCA1.pem --cert device.pem.crt --key private.pem.key --region us-east-1 --verbosity Warn
Performing greengrass discovery...
[ERROR] [2023-01-16T12:10:19Z] [00002308] [socket] - id=000001A2C35B5D20 handle=00000000000004EC: connect completion triggered with error -1073741252
[ERROR] [2023-01-16T12:10:19Z] [00002308] [socket] - id=000001A2C35B5D20 handle=00000000000004EC: connection error with code 1049
Traceback (most recent call last):
[ERROR] [2023-01-16T12:10:20Z] [00002308] [http-connection] - static: Client connection failed with error 1051 (AWS_IO_SOCKET_CLOSED).
File "E:\AWS Greengrass\basic_discovery.py", line 62, in
discover_response = resp_future.result()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\lib\concurrent\futures_base.py", line 458, in result
return self.__get_result()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\lib\concurrent\futures_base.py", line 403, in __get_result
raise self._exception
File "C:\Users\DELL\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\awsiot\greengrass_discovery.py", line 103, in on_connection_completed
connection = conn_future.result()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\lib\concurrent\futures_base.py", line 451, in result
return self.__get_result()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.2544.0_x64__qbz5n2kfra8p0\lib\concurrent\futures_base.py", line 403, in __get_result
raise self._exception
awscrt.exceptions.AwsCrtError: AWS_IO_SOCKET_CLOSED: socket is closed.

Debug_Log.txt

Stream Manager - how to read only latest message?

Hello -
I'm looking to use stream manager to read only the latest message (at any given moment).

Whenever i invoke read_mesages(..), it always returns from the start of the stream.

Is it possible with the ReadMessagesOptions that I can configure to retrieve only the latest message at any given time?

Thanks in advance!

Cheers.

Issue with GGC connection following the tutorial

Hi,

While following the tutorial of greengrass https://docs.aws.amazon.com/greengrass/v1/developerguide/module5.html I hit some connection exception.

My setup was:

  • Greengrass core on a raspberry
  • lightController IoT device in a docker container
  • trafficLight IoT device in another docker container

The problem is that with auto detection of the core connection, my core registers

127.0.0.1
Port 8883
192.168.2.2
Port 8883
::1
Port 8883

This means that in the lightController and trafficLight code, they try to connect to the core on 127.0.0.1 which does not work.

All the core addresses should be tried until one works.

Unable to genarate table in dynamoDB using lamda function

I am trying the below code
aws-greengrass-core-sdk-python/examples/TrafficLight/carAggregator.py

While delopying the Greengrass group i have no errors, similarly i have no errors while running both the devices.

I am from eu-central, i tried changing location from default N.virgina to frankfurt, At both locations a table 'carStats' is not created. As recommended i waited for 3 mins as the code pushes values after light turns green 3 times.

Only change i made: GG trafficlight for me is another raspberry Pi, which are connected to physical leds. Therefore subscriptions are made accordingly with the update/documents topic of my rasperrypi thing.

what should be the reason for lamda not generating a table? my lamda and greengrass group has full access dynamodb polices attached to its roles as well.

[StreamManager] [KinesisConfig] upload acts as default batch_size is 500

When uploading to Kinesis Data Streams with StreamManager, uploading happens in batches of 500 instead of immediately, even though batch_size value in ExportDefinition:KinesisConfig is not specified. According to documentation:

batch_size: The maximum size of a batch to send to Kinesis. Messages will be queued until the batch size is reached, after which they will then be uploaded. If unspecified the default will be 1.

Setting batch_size to 1, solves the issue, i.e. data is uploaded as it comes to the stream. Did I misread the documentation or is it a bug?

Lack of documentation for lambda client.

Within the greengrass developer guide there is a number of examples using GG SDK 'iot-client'.
I want to use the 'lambda' client but I have only found a single reference to it online.

That reference (found https://github.com/aws/aws-greengrass-core-sdk-python/README.rst) does not describe any of the arguments, or explain the single example in any meaningful way.

The code comments also do not explain the arguments or provide any more insite.

EDIT:

After running into further questions about using the lambda client, i did find the boto3 documentation for lambda (https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda.html#Lambda.Client.invoke). There i was able to find the information i needed around the arguments of the invoke method. I found this reference in the comments of the _invoke_internal method.

I still maintain this information should be more easily accessible and examples using both the iot-client and lambda client should be apparent in the developer guide.

EDIT 2:

For example, the Boto3 lambda invoke method documentation state that the "Qualifyer" can be a version number or alias; however i have found the alias does not work at all when it comes to greengrass. These differences should be documented for developers.

HelloWorldCounter example does not output correct message

The current version of greengrassHelloWorldCounter.py has a formatting issue on lines 53/54. When executed as a long lived lambda it should output both my_platform and my_counter. Each invocation results in my_counter increasing by one. However, the result is not as expected:

{"message": "Hello world! Sent from Greengrass Core running on platform: {}. Invocation Count: Linux-4.19.75-v7l+-armv7l-with-debian-10.1"}

It should be:

{"message": "Hello world! Sent from Greengrass Core running on platform: Linux-4.19.75-v7l+-armv7l-with-debian-10.1. Invocation Count: 1"}

The code in github also differs from the documentation here: https://docs.aws.amazon.com/greengrass/latest/developerguide/long-testing.html

Greengrass common missing

Hi,
When installing the greengrass SDK there seems to be an issue when you make a unit test.
When executing a unit test that imports a python file (which imports greengrasssdk) the following error occurs:

/python3.6/site-packages/greengrasssdk/Lambda.py:10: in <module>
    from greengrass_common.function_arn_fields import FunctionArnFields
E   ModuleNotFoundError: No module named 'greengrass_common'

When you pip install greengrasssdk this package is not part of the installation. I can not find any way to install this package.
Any ideas ?

Thanks.

Compatibility with Python 3.6

Hello,

Currently AWS Greengrass SDK only support lambda with Python2.7 or NodeJS 6, which are either deprecated or soon to be deprecated.

We need updates to run later version of each language (i.e: Python 3.6 and Node 10).

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.