Coder Social home page Coder Social logo

warmuuh / milkman Goto Github PK

View Code? Open in Web Editor NEW
1.1K 13.0 69.0 5.87 MB

An Extensible Request/Response Workbench

License: MIT License

Java 91.74% Batchfile 0.13% Shell 0.45% JavaScript 5.82% SCSS 1.87%
hacktoberfest grpc rest http testing milkman-plugins

milkman's Issues

Grpc Demo Gif

to showcase bi-streaming in Grpc, simple ping-pong

issues with https calls

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Feature request: export as OpenAPI draft specification.

First, thanks for Milkman!

A nice-to-have for me is exporting a Collection as an OpenAPI specification. Obviously there are a few issues that might might need to be resolved, such as providing object names for a request body in JSON format and response JSON objects. Without names, these objects would just take the name of the request name.

This would be a big help in developing an OpenAPI specification based on a Milkman test suite, even if a complete specification might need some hand tweaking.

https://swagger.io/specification/

Grpc plugin

Now with http/2 support coming in 3.7.0, supporting grpc should be easier.

GRPC calls dont work on macos

apparently, there is something windows-specific going on:

me.dinowernli.grpc.polyglot.protobuf.ProtocInvoker$ProtocInvocationException: Unable to execute protoc binary
	at me.dinowernli.grpc.polyglot.protobuf.ProtocInvoker.invokeBinary(ProtocInvoker.java:110)
	at me.dinowernli.grpc.polyglot.protobuf.ProtocInvoker.invoke(ProtocInvoker.java:62)
	at milkman.plugin.grpc.processor.GrpcRequestProcessor.compileProtoSchema(GrpcRequestProcessor.java:135)
	at milkman.plugin.grpc.processor.GrpcRequestProcessor.makeRequest(GrpcRequestProcessor.java:82)
	at milkman.plugin.grpc.processor.GrpcRequestProcessor.executeRequest(GrpcRequestProcessor.java:51)
	at milkman.plugin.grpc.GrpcPlugin.executeRequestAsync(GrpcPlugin.java:81)
	at milkman.ctrl.RequestExecutor$1.call(RequestExecutor.java:43)
	at milkman.ctrl.RequestExecutor$1.call(RequestExecutor.java:29)
	at javafx.graphics/javafx.concurrent.Task$TaskCallable.call(Task.java:1425)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at javafx.graphics/javafx.concurrent.Service.lambda$executeTask$6(Service.java:725)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/javafx.concurrent.Service.lambda$executeTask$7(Service.java:724)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.io.IOException: Cannot run program "/Users/pmucha/protocjar14160495236028116982/bin/protoc.exe": error=316, posix_spawn failed
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
	at com.github.os72.protocjar.Protoc.runProtoc(Protoc.java:117)
	at com.github.os72.protocjar.Protoc.runProtoc(Protoc.java:78)
	at me.dinowernli.grpc.polyglot.protobuf.ProtocInvoker.invokeBinary(ProtocInvoker.java:107)
	... 15 common frames omitted
Caused by: java.io.IOException: error=316, posix_spawn failed
	at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
	at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340)
	at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
	... 19 common frames omitted

Add setting for following redirects

Postman has a setting that determines whether redirect responses should be followed. Sometimes I just want to see that the server returned a 30*, I don't need to follow it.

SSLHandshakeException for TLS10

Hi all,

I'm trying to do some REST calls and I'm getting

javax.net.ssl.SSLHandshakeException: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
	at java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.onServerHello(ServerHello.java:968)
	at java.base/sun.security.ssl.ServerHello$ServerHelloConsumer.consume(ServerHello.java:890)
	at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
	at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:448)
	at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1065)
	at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1052)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:999)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at java.net.http/jdk.internal.net.http.common.SSLFlowDelegate.lambda$executeTasks$3(SSLFlowDelegate.java:1059)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$DelegatingExecutor.execute(HttpClientImpl.java:153)
	at java.net.http/jdk.internal.net.http.common.SSLFlowDelegate.executeTasks(SSLFlowDelegate.java:1054)
	at java.net.http/jdk.internal.net.http.common.SSLFlowDelegate.doHandshake(SSLFlowDelegate.java:1020)
	at java.net.http/jdk.internal.net.http.common.SSLFlowDelegate$Reader.processData(SSLFlowDelegate.java:437)
	at java.net.http/jdk.internal.net.http.common.SSLFlowDelegate$Reader$ReaderDownstreamPusher.run(SSLFlowDelegate.java:263)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

I have added

-Djdk.tls.client.protocols="SSLv3,TLSv1,TLSv1.1,TLSv1.2" ^
	-Dhttps.protocols="TLSv1,TLSv1.1" ^
	-Djavax.net.debug=all ^
	-Djdk.tls.disabledAlgorithms="" ^

to milkman.bat file (on Windows) but to no avail.

Seems like in JavaRequestProcessor.java
builder.useSystemProperties()
must be called. (according to SO)

Thank you.

Send request on Enter

When I change the url I press the enter key and expect to send a request, but it doesn't :(

choco install milkman-grpc isn't found

The GRPC plugin page doesn't indicate what the chocolatey name is.

The output from choco is:

[ADMIN]: C:\Program Files\PowerToys> choco install milkman-grpc
Chocolatey v0.10.15
Installing the following packages:
milkman-grpc
By installing you accept licenses for the packages.
milkman-grpc not installed. The package was not found with the source(s) listed.
 Source(s): 'https://chocolatey.org/api/v2/'
 NOTE: When you specify explicit sources, it overrides default sources.
If the package version is a prerelease and you didn't specify `--pre`,
 the package may not be found.
Please see https://chocolatey.org/docs/troubleshooting for more
 assistance.

Chocolatey installed 0/1 packages. 1 packages failed.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

Failures
 - milkman-grpc - milkman-grpc not installed. The package was not found with the source(s) listed.
 Source(s): 'https://chocolatey.org/api/v2/'
 NOTE: When you specify explicit sources, it overrides default sources.
If the package version is a prerelease and you didn't specify `--pre`,
 the package may not be found.
Please see https://chocolatey.org/docs/troubleshooting for more
 assistance.

Requests don't send after importing from PostMan

Version: 3.2.0
OS: Windows 10
Steps to reproduce:

  • Start with fresh MilkMan instance
  • Send GET request to https://google.com
    • This works
  • Import PostMan file
  • Run request again
    • The UI does not indicate that the request has been made

I've included an anonymized dump file that narrows it down to the problem. For whatever reason, PostMan included two environments with the same name, and that causes this issue. In the PostMan UI, I do not see both environments, just the second one.

PostMan dump:

{
	"version": 1,
	"collections": [
	],
	"environments": [
		{
			"id": "28dc01f2-a653-4ce2-a95f-865322c92b12",
			"name": "My Workspace - globals",
			"values": [
				{
					"key": "anonymized",
					"value": "https://example.org",
					"description": "",
					"enabled": true
				}
			]
		},
		{
			"id": "60152d96-b54b-43bb-aece-e7bfdd14ec63",
			"name": "My Workspace - globals",
			"values": [
				{
					"key": "anonymized",
					"value": "https://example.org",
					"description": "",
					"enabled": true
				},
				{
					"key": "anonymized2",
					"value": "https://example2.org",
					"description": "",
					"enabled": true
				},
				{
					"key": "anonymized3",
					"value": "https://example3.org",
					"description": "",
					"enabled": true
				}
			]
		}
	],
	"headerPresets": [],
	"globals": []
}

Support question regarding TLS 1.2 handshake

I'm having trouble getting past the TLS handshake to my target, though cURL has no issue. Milkman under Windows has a pop-up reporting...

javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake

...while the target has a log reporting a handshake timeout.

Milkman under Linux has java logs reporting...

07:40:28.769 [JavaFX Application Thread] INFO milkman.ctrl.WorkspaceController - Received response
07:40:28.822 [elastic-2] ERROR milkman.ui.plugin.rest.ResponseBodyTabController - Received Error
java.security.cert.CertificateException: No subject alternative names present

So I'm guessing an alternative name is required in the certificate for Milkman to properly connect?

Websocket Plugin

A nice addition to milkman would be a websocket plugin. With support of streaming/async responses starting with Milkman 4.0, this would be achievable. Also, having a websocket UI next to normal requests improves productivity by avoiding context switches.

The UI would be similar to the existing GRPC plugin, allowing to send and recieve multiple request/responses.

Non-Goals: a way to manually send responses based on async chunks sent by the server (i.e. a PONG send by client manually, but only, if the server sent PING before).

improve dark theme

The dark theme is usable at best. It can be improved. Some dropdowns still render in white, some fonts are not readable (black on darkgrey). the overall look&feel of this theme could probably be improved as well.
This mainly needs changes in the CSS file

reenable button effects

for testing performance improvements, any ripple effects where disabled
this leads to no feedback on clikcing buttons.
has to be re-enabled, at least for buttons

Missing .dektop file for linux

Being able to search for milkman in the gnome overview is nice. You can add a shortcut by creating a .desktop file and install it to either /usr/share/applications or $HOME/.local/share/applications.

The way i solved it was by unpacking milkman to
$HOME/.local/opt and writing the file shown below to $HOME/.local/share/applications/Milkman.desktop:

[Desktop Entry]
Name=Milkman
Exec=/home/pbsds/.local/opt/milkman-3.2.0/milkman.sh
Icon=/home/pbsds/.local/opt/milkman-3.2.0/milk-bottle.png
Terminal=false
Type=Application
Keywords=milkman;postman;rest;http;sql;jdbc;java;

Results:
Screenshot from 2019-07-09 14-12-11

(i did download the milk-bottle.png image to make this work)

I don't know whether the .desktop file supports environment variables or not, but adding a script or something to generate this file (to fill in the home path) or at least providing a template .desktop file would be nice.

Explore plugin requires Notes and Scripting plugins

Version: 3.2.0
OS: Windows 10
Issue: After installing the application with all plugins, I played around a little bit, but was unable to get HTTP requests to work (still looking into that). I tried removing most of the plugins, leaving the Rest and Explore plugins. After doing that and restarting the application, Milkman would flash on screen and then quickly exit. Looking into the logs (dump below), it seems that the Explore plugin is dependent upon Notes plugin. After re-adding that plugin, I got a similar dump for missing class ScriptingAspect.

It's not clear from documentation whether this dependency is intentional or not. If nothing else, an error popup before exit could be beneficial.

Log Dump:

2019-07-09 08:08:46,018 ERROR [JavaFX Application Thread] o.d.n.m.JacksonFacade [JacksonFacade.java:136] Error while converting document to object 
java.lang.IllegalArgumentException: Invalid type id 'milkman.plugin.note.NotesAspect' (for id type 'Id.class'): no such class found (through reference chain: milkman.domain.Workspace["openRequests"]->java.util.ArrayList[0]->milkman.ui.plugin.rest.domain.RestRequestContainer["aspects"]->java.util.ArrayList[3])
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3512)
	at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3431)
	at org.dizitart.no2.mapper.JacksonFacade.asObject(JacksonFacade.java:134)
	at org.dizitart.no2.mapper.GenericMapper.asObjectInternal(GenericMapper.java:53)
	at org.dizitart.no2.mapper.AbstractMapper.asObject(AbstractMapper.java:76)
	at org.dizitart.no2.objects.ObjectCursor$ObjectCursorIterator.next(ObjectCursor.java:110)
	at milkman.persistence.PersistenceManager.loadWorkspaceNames(PersistenceManager.java:50)
	at milkman.ctrl.ApplicationController.initApplication(ApplicationController.java:62)
	at milkman.MilkmanApplication.start(MilkmanApplication.java:27)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Invalid type id 'milkman.plugin.note.NotesAspect' (for id type 'Id.class'): no such class found (through reference chain: milkman.domain.Workspace["openRequests"]->java.util.ArrayList[0]->milkman.ui.plugin.rest.domain.RestRequestContainer["aspects"]->java.util.ArrayList[3])
	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:339)
	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:311)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:298)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:260)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:163)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:135)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:120)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:91)
	at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:142)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:279)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:260)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3507)
	... 17 common frames omitted
Caused by: java.lang.IllegalArgumentException: Invalid type id 'milkman.plugin.note.NotesAspect' (for id type 'Id.class'): no such class found
	at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver._typeFromId(ClassNameIdResolver.java:66)
	at com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver.typeFromId(ClassNameIdResolver.java:48)
	at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:156)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:106)
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:91)
	at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:142)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:279)
	... 35 common frames omitted

requests should be sortable

requests should be sortable via drag & drop, also should be movable between collections.
The reason for not making collections drag/dropable is that this would interfere with auto-sorting (starred, a-z), which i prefer over manual sorting (also, this is how postman does it)

App does not show up in Linux

Just tested 3.7.0 on Fedora 31 (Gnome 3). No app window showed up. Got this in console:

$ ./milkman.sh 
11:51:42.658 [main] INFO milkman.MilkmanApplication - VM Startup time: 322 ms
java.lang.UnsupportedOperationException: Taskbar API is not supported on the current platform
	at java.desktop/java.awt.Taskbar.getTaskbar(Taskbar.java:216)
	at milkman.ui.main.MainWindow.setIcon(MainWindow.java:98)
	at milkman.ui.main.MainWindow.start(MainWindow.java:62)
	at milkman.MilkmanApplication.start(MilkmanApplication.java:43)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
	at java.base/java.lang.Thread.run(Thread.java:834)
11:51:43.123 [JavaFX Application Thread] INFO milkman.ctrl.WorkspaceController - Diplaying request: RequestContainer(name=New Request)
11:51:43.370 [JavaFX Application Thread] INFO milkman.ui.main.WorkingAreaComponent - tab repainted
11:51:43.370 [JavaFX Application Thread] INFO milkman.ui.main.WorkingAreaComponent - request area refreshed
11:51:43.993 [JavaFX Application Thread] INFO milkman.MilkmanApplication - App Initialization time: 1333 ms
11:51:44.167 [Thread-5] INFO milkman.cds.AppCdsGenerator - AppCds archive is up-to-date and usable. Not regenerating.

protoc-jar stuff

Hi there, somehow I noticed your usage of protoc-jar (I'm the author)
5e45f7e

Note that an API exists that allows capturing stdout/stderr: public static int runProtoc(String[] args, OutputStream out, OutputStream err)

And there is a built-in option to include the well-known types (--include_std_types)

Also, I saw something about grpc reflection -- FYI there is a separate project to make life easier with protobuf reflection, check it out perhaps:
https://github.com/os72/protobuf-dynamic

Cheers!

milkman.sh has incorrect line endings for Unix

Problem:

unable to run the milkman.sh script.

Steps to Replicate:

# pull down dist
wget https://github.com/warmuuh/milkman/releases/download/3.2.0/milkman-dist-linux64-bin.zip
# unzip it
unzip milkman-dist-linux64-bin.zip
cd milkman-dist-linux64-bin/
# make milkman.sh executable
chmod +x milkman.sh
# try and run it!
./milkman.sh

you get the following error:

$ bash: ./milkman.sh: /bin/sh^M: bad interpreter: No such file or directory

WORKAROUND

Replace Windows line ending with Unix line endings and then run:

$ sed -i -e 's/\r$//' milkman.sh
$ ./milkman.sh

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.