Giter Club home page Giter Club logo

workshop's Introduction

Workshop (with examples in NServiceBus)

Welcome to the workshop.

Please ensure you have prepared your machine well in advance of the workshop. Your time during the workshop is valuable, and we want to use it for learning, rather than setting up machines.

Prerequisites

Index

If you have any difficulty preparing your machine, or following this document, please raise an issue in this repository ASAP so that we can resolve the problem before the workshop begins.

Demos

ASP.NET Core UI composition

The asp-net-core solution demonstrates the use of ASP.NET Core to compose a UI with data from several services.

FAQ

If the answer to your question is not listed here, consult your on-site trainer.

How can I clear the orders list?

The simplest method is to delete all databases, which will be automatically created by LiteDb.

The databases are individual files that are located in a .db folder under the solution folder. The entire folder can be deleted.

How can I clear all messages?

The exercises use the LearningTransport and LearningPersistance. Delete the entire .learningtransport under the solution folder.

How can I see what's inside each database?

You can download LiteDb Studio and open each database individually. The database files are stored in a .db folder in the root of each exercise its solution folder.

NOTE: If you open a database, open it as 'shared' as otherwise LiteDb Studio will lock the database and your exercises won't work anymore.

How can I test if the different HTTP API are working?

Sometimes there are issues in the API. Because of the CompositionGateway it might not be directly clear what the problem is.

workshop's People

Contributors

adamralph avatar aivascu avatar aleksandr-samila avatar andreasohlund avatar boblangley avatar casperli avatar danielmarbach avatar davidboike avatar dependabot[bot] avatar dvdstelt avatar gep13 avatar gieniowski avatar janovesk avatar jbogard avatar johnsimons avatar jpalac avatar markgould avatar mauroservienti avatar mcafee123 avatar mikeminutillo avatar pascalberger avatar ramonsmits avatar seanfarmar avatar serbrech avatar simoncropp avatar szymonpobiega avatar timbussmann avatar tjeerdhans avatar tmasternak avatar udidahan 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

workshop's Issues

Slides still use v5 signature

Some of the slides (e.g. Exploit Strongly-Typed message) uses v5 signature that is not async-based.

All the slides need to be reviewed and edited to use v6 code signature.

Convert all web sites to web app

Visual Studio handles web sites very badly for the purpose of sharing exercises, making simple things much more complex than expected.
All Divergent.Frontend.SPA web sites, in all exercises, need to be converted from a web site to a web app.

Simplify pub sub exercise

Seems like some elements from exercise 4 (reliable messaging) were left over after changing the exercises order. As a result, the pub sub exercise is very complex, e.g. there are many startup projects, it's not clear why we have reliable and unreliable payment processors (and we don't really have to use both here), seems it'd be sufficient to handle events in just one vertical to show how it works, it's not clear to me why we need two verticals handling the same event (and having the same handler name ;)).

Response templating for ASP.NET Core API Gateway demo

Overview

In it's current form API Gateway demo makes sure that request handling logic (calling appenders that match url and assembling response from parts returned by appenders and subscribers is generic - does not depend on url and/or appenders).

Depending on the usecase it might be useful to support templating for api gateway responses. In such case the owner of api gateway contract would be able to have a bigger control over the structure of json document returned to the clients.

Connects to: #59

Saga methods marked async but don't await anything

Results in a compiler warning:

warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.

Consider marking https://github.com/Particular/Workshop.Microservices/blob/master/exercises/03%20-%20Sagas.md#step-4-2 to not be async and return a Task:

    private Task ProcessOrder(IMessageHandlerContext context)
    {
        if (Data.IsOrderSubmitted && Data.IsPaymentProcessedYet)
        {
            // Send a message to execute shipment
            MarkAsComplete();
        }
        return Task.CompletedTask;
    }

The business sample is very weak

The actual business sample we are using is very weak and from a certain point of view it is implemented, in order to keep it as simple as possible, in the wrong way.
We should move to a better business sample, such as the "hotel reservation" one

Add intro and expected result to exercises descriptions

Add sections to the descriptions:

  • Intro - describing on a high level what the application does, what are the slices, how they interact (a few sentences, diagram, etc.)
  • Expected result - describing how to verify the solution works correctly (short description, screenshots, etc.)

Convert all API hosts in exercises from web projects to OWIN self hosted apps

When exercises are run all WebAPI projects will open a new browser window just for the sake of starting up the web server. Depending on the browser configuration and some random browsers behavior users might end up with several browser windows that each time need to be manually closed.
Moving to console apps with OWIN self-hosted will greatly improve the attendee experience.

Change SQL Server to SQLite

All excercises and the demo require SQL Server, which is problematic for people running macOS and Linux. I would suggest using SQLite since it will run everywhere.

Platform Installer is blocked by Windows Defender

This seems to happen on a Windows 10 Professional edition in Edge. The whole click-once app is blocked by the Windows Defender and it is not allowed to run. Sometimes the progress bar just keeps spinning and nothing happens.

image

Opening it on the same machine but on Chrome, it works fine.

JavaScript files and HTML templates might be cached by browsers

When attempting exercises that touch the front-end portion of the application, currently built using AngularJS, it might happen that HTML templates are cached by browsers making it very difficult to debug what's going on.

We're moving away from Angular, however it’s not an Angular issue per se. Browsers cache JavaScript and HTML templates by default, thus moving away from Angular doesn’t solve the problem if we still want to have a single page application as client.

The easiest workaround, that we should document, is to disable browser cache, this can be easily achieved using browser debugging tools without clearing browser cache in its entirety.

Workshop set up the databases fails in Sqlcmd

Hello Adam and others

I have a problem setting up my machine for the workshop, at the step: Set up the databases:
https://github.com/Particular/Workshop#set-up-the-databases

Running the command:
PS C:\Code\Workshop> .\exercises\scripts\Setup-LocalDBInstance.ps1
Creates the following error:
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Data source name not found and no default driver specified.

I have the following listed in "Apps and Features":
image

Script output:
image

My Windows setup:
image

Can anybody help?

Color console output by service

Outcome of the discussion in #280
If there would be a way to color the console output of each process according to it's service there would be a good visual aid to distinguish the different running processes. This makes it easier to keep an overview of the running processes and identifying specific processes. This would also be nice to see in the compositiongateway, showing how the different services come together on a single process.

docker-compose based setup of the prerequisites & preparation steps

It would have been so much nicer to just do

docker-compose up

To have everything running instead of following the setup steps. Especially after this tweet
image

That can have RabbitMQ Setup instead of MSMQ automatically, MSSQL Server can run in Linux these days and you can automatically create the database when creating a container, etc.

Otherwise great work!

Order pricing is recalculated in Finance

In the Finance service, the OrderSubmittedHandler, the implementation calculates a new total for the order by re-retrieving the product pricing information. This implies the customer could be charged for a different price than they original saw.

Consider having the original service pass through the "quote price" or "display price" so that the handler uses what price it showed to the user instead of re-grabbing it.

This was brought up as a question in the BuildStuffLT course.

.NET Core assembly loading might fail with FileNotFoundException

When dynamically loading assemblies in .NET Core the full framework approach of using Assembly.Load might fail with FileNotFoundException even if the file is available and in the expected location.

Various reasons might lead to that error depending on the packaging configuration and/or if the assembly is already referenced.

The following snippet solves the issue by testing if the assembly is already referenced at compile time or run time (deployment package) and choosing the right approach to load the assembly.

static class AssemblyLoader
{
    public static Assembly Load(string assemblyFullPath)
    {
        var fileNameWithOutExtension = Path.GetFileNameWithoutExtension(assemblyFullPath);

        var inCompileLibraries= DependencyContext.Default.CompileLibraries.Any(l => l.Name.Equals(fileNameWithOutExtension, StringComparison.OrdinalIgnoreCase));
        var inRuntimeLibraries = DependencyContext.Default.RuntimeLibraries.Any(l => l.Name.Equals(fileNameWithOutExtension, StringComparison.OrdinalIgnoreCase));

        var assembly = (inCompileLibraries || inRuntimeLibraries)
            ? Assembly.Load(new AssemblyName(fileNameWithOutExtension))
            : AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyFullPath);

        return assembly;
    }
}

Mention prerequisites such as Windows 10 and Visual Studio Code in Workshop description.

Hey there, I subscribed to the "SOA Done Right" workshop because I'm interested in the topic. However the requirements are a bit of an issue for me and I think it's best if you have these mentioned in the workshop descriptions in the future.

I have a Mac and I'm not familiar with Microsoft's tech stack. I would have most likely chosen a different workshop if this information was presented from the start.

Thank you.

Change MSMQ to RabbitMQ

MSMQ only works on Windows and I seriously doubt most people will use it in production anyway. I would suggest using RabbitMQ instead and include instructions to get/run it in a Docker container, since this would simplify the setup and will allow using macOS and Linux for the workshop.

Add ServiceInsight and ServicePulse

In the last delivery of the workshop at NDC Oslo 2017, I instructed attendees to look at ServiceInsight as a part of the exercises that they were doing, as well as adding the Saga Audit plugin for the saga exercises.

For the existing NServiceBus users/customers who attended, experiencing Pulse and Insight first-hand was very significant. I heard them saying that there was no way that they'd go back to working without them, almost regardless of how much they cost.

In short, I propose that we incorporate more instruction into the workshop around how to install, configure, and use Pulse and Insight in the workshop.

I'd also suggest that this be prioritized so that it can be done in time for the next delivery of the workshop which, I believe, is Jimmy doing it in NDC Sydney.

Verify that exercises work with VS 2017

Now that VS 2017 has been released, we are likely to get attendees who have it installed, and possibly not having the older Visual Studios on their machine.

We should verify that all our exercises will still work.

Minimize HTTP API console windows

Outcome of the discussion in #280
Consider minimizing the console windows of the HTTP API processes to minimize the visual overhead to users as they most likely won't need to interact with those console windows.

Issue with database setup

When I'm running Powershell script to setup database I get the following error:

PS D:\git\Workshop.Microservices\exercises\scripts> .\Setup-Databases.ps1
LocalDB instance "microservices-workshop" created with version 13.0.2151.0.
Private LocalDB instance "microservices-workshop" shared with the shared name: "microservices-workshop".
LocalDB instance "microservices-workshop" started.
Name: microservices-workshop
Version: 13.0.2151.0
Shared name: microservices-workshop
Owner: PRZEMEK-PC\Przemek
Auto-create: No
State: Running
Last start time: 2017-10-19 00:32:17
Instance pipe name: np:\.\pipe\LOCALDB#SH87897A\tsql\query
HResult 0xFFFFFFFF, Level 16, State 1
SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.

When running Sql Managment Studio, I can connect to those two local servers:

  • (LocalDb)\v11.0
  • PRZEMEK-PC\SQLEXPRESS (here I run Setup-Databases.sql manually and it was successful, but it's not full instance, just express, so I understand that I should not use it)

Project Divergent.Sales.API.Host has an inconsistent default namespace and assembly name.

For the project Divergent.Sales.API.Host, the namespace and assembly name are not consistent with the project name.

The default namespace is Divergent.Shipping.API.Host and the assembly name is Divergent.Shipping.API.Host.

To verify this, right click on the project Divergent.Sales.API.Host and select Properties. Select the Application tab.

ReSharper verifies this inconsistency by underlining the namespaces with a blue squiggly line.

This should be an easy fix.

Can the API and the NSB endpoint projects be merged into a single project?

While I agree that this is a perfectly valid approach, providing some interesting examples on how to split up a service into multiple deployment units for decoupling, better availability and so, I'm not sure I see the value for the workshop exercises.

Especially when not using the special VS plugin for the startup projects, the dedicated host processes feel very noisy and cumbersome. The huge amount of open console windows is hard to oversee and it takes some time to find the right console window in case I wan't to look at the log output.

Merging the API and the NSB related code into a single project would make the project structure easier to view, the solution easier to setup and more convenient to run. The code can still be highly decoupled, so besides from a deployment perspective, not that much really changes?

thoughts @Particular/workshop-maintainers ?

Error when I run the Particular Platform Installer

Hi. When I go to https://particular.net/start-platform-download and run the installer I get an error message and a log file containing:

The following properties have been set:
Property: [AdminUser] = true {boolean}
Property: [InstallMode] = HomeSite {string}
Property: [NTProductType] = 3 {int}
Property: [ProcessorArchitecture] = AMD64 {string}
Property: [VersionNT] = 10.0.0 {version}
Running checks for package 'Microsoft .NET Framework 4.5.2 (x86 and x64)', phase BuildList
Reading value 'Release' of registry key 'HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full'
Read integer value 460805
Setting value '460805 {int}' for property 'DotNet45Full_Release'
Reading value 'v4' of registry key 'HKLM\SOFTWARE\Microsoft\NET Framework Setup\OS Integration'
Read integer value 1
Setting value '1 {int}' for property 'DotNet45Full_OSIntegrated'
The following properties have been set for package 'Microsoft .NET Framework 4.5.2 (x86 and x64)':
Property: [DotNet45Full_OSIntegrated] = 1 {int}
Property: [DotNet45Full_Release] = 460805 {int}
Running checks for command 'DotNetFX452\NDP452-KB2901907-x86-x64-AllOS-ENU.exe'
Result of running operator 'ValueEqualTo' on property 'InstallMode' and value 'HomeSite': true
Result of checks for command 'DotNetFX452\NDP452-KB2901907-x86-x64-AllOS-ENU.exe' is 'Bypass'
Running checks for command 'DotNetFX452\NDP452-KB2901907-x86-x64-AllOS-ENU.exe'
Result of running operator 'ValueEqualTo' on property 'InstallMode' and value 'HomeSite': true
Result of checks for command 'DotNetFX452\NDP452-KB2901907-x86-x64-AllOS-ENU.exe' is 'Bypass'
Running checks for command 'DotNetFX452\NDP452-KB2901954-Web.exe'
Result of running operator 'ValueNotEqualTo' on property 'InstallMode' and value 'HomeSite': false
Result of running operator 'ValueGreaterThanEqualTo' on property 'DotNet45Full_Release' and value '379893': true
Result of checks for command 'DotNetFX452\NDP452-KB2901954-Web.exe' is 'Bypass'
Running checks for command 'DotNetFX452\NDP452-KB2901954-Web.exe'
Result of running operator 'ValueNotEqualTo' on property 'InstallMode' and value 'HomeSite': false
Result of running operator 'ValueGreaterThanEqualTo' on property 'DotNet45Full_Release' and value '379893': true
Result of checks for command 'DotNetFX452\NDP452-KB2901954-Web.exe' is 'Bypass'
'Microsoft .NET Framework 4.5.2 (x86 and x64)' RunCheck result: No Install Needed
Launching Application.
URLDownloadToCacheFile failed with HRESULT '-2146697208'
Error: An error occurred trying to download 'https://s3.amazonaws.com/particular.downloads/PlatformInstaller/PlatformInstaller.application'.

Rename CompositionActionFilter to CompositionResultFilter

CompositionActionFilter should be renamed to CompositionResultFilter since it derives from IAsyncResultFilter, and not IAsyncActionFilter.

Also the class is missing an explicit access modifier. Without an access modifier the access defaults to internal. Was the class intended to be public?

I noticed that many classes and methods in the solution lack explicit access modifiers. It is a best practice to provide explicit access modifiers. Note that ReSharper flags missing access modifiers.

License expired

Running and setting up the workshop. Getting a warning about an expired license.
NServiceBus.LicenseManager Trial for the Particular Service Platform has expired.

Should ITOps handle messages?

When I attended the ADSD course last year in London, Udi said that ITOps is responsible for integration (+email) and hardly ever subscribes.

In the exercise about integration, Shipping sends a command to ITOps. But I was expecting a different implementation. Something like the PaymentClient in Finance, only then implemented in ITOps. Udi showed this in an example where he build the integration with the 3rd-party payment provider in ITOps. And Finance would call this in-process and not via messaging.

Is there a specifc reason why this workshop is using a different strategy? Both seems fine to me but I'm trying to understand both concepts.

BaseAddress is hard-coded

The base address is defined in the configuration files of the two "API.Host" projects.

However, it is hard-coded in the following files:

  1. Divergent.Sales.ViewModelComposition.OrderDetailsViewModelAppender
  2. Divergent.Shipping.ViewModelComposition.OrderDetailsViewModelAppender
  3. Divergent.Sales.ViewModelComposition.OrdersListViewModelAppender

For example:

string url = $"http://localhost:20296/api/shippinginfo/order/{id}";

So if the base address is changed then the application will fail.

.\SQLEXPRESS instance is used insted (localdb)\microservices-workshop in exercise 02

In https://github.com/Particular/Workshop/tree/master/exercises/02-publish-subscribe/before exercise insted of (localdb)\microservices-workshop in connection string in finance service is use .\SQLEXPRESS. This issue is in Divergent.Finance.Handlers.OrderSubmittedHandler.Handle method (FinanceContext has wrong connection string). In all app.config there are proper connection strings and I can find place where connection string is replaced.

Unable to compile using Visual Studio Community Edition | ./build command

Any idea?

Unhandled Exception: System.Exception: The following target was not found: exercise.
at Bullseye.Internal.TargetCollection.Validate(List1 names) in C:\projects\bullseye\Bullseye\Internal\TargetCollection.cs:line 99 at Bullseye.Internal.TargetCollection.RunAsync(List1 names, Boolean skipDependencies, Boolean dryRun, Logger log) in C:\projects\bullseye\Bullseye\Internal\TargetCollection.cs:line 28
at Bullseye.Internal.TargetCollection.RunAsync(List1 names, Boolean skipDependencies, Boolean dryRun, Logger log) in C:\projects\bullseye\Bullseye\Internal\TargetCollection.cs:line 37 at Bullseye.Internal.TargetCollectionExtensions.RunAsync(TargetCollection targets, List1 args, IConsole console) in C:\projects\bullseye\Bullseye\Internal\TargetCollectionExtensions.cs:line 116
at Bullseye.Targets.RunTargets(IEnumerable`1 args) in C:\projects\bullseye\Bullseye\Targets.Sync.cs:line 34
at Program.Main(String[] args) in C:\Users\codeb\Documents\gits\Workshop\targets\Program.cs:line 24
PS C:\Users\codeb\Documents\gits\Workshop>

Avoid hard-coding routes in <a> tags

For project Divergent.Website, the file /Views/Orders/Index.cshtml has a hard-coded route in the following tag:

Number: #@order.OrderNumber

It is a better coding practice to use an Html.ActionLink().

The loop on that page should be replaced with the following:

@foreach (dynamic order in Model.Orders)
{
    long orderNumber = order.OrderNumber;
    string orderNumberLink = $"Number: #{order.OrderNumber}";

    <tr>
        <td>@Html.ActionLink(orderNumberLink, "Details", "Orders", new {id = orderNumber })</td>
        <td>@order.ShippingStatus</td>
    </tr>
}

Exercise 3 says it's configured to run as in-memory storage, but it's not

Error when I run Setup-Databases.ps1 script

Hi.

When I run Setup-Databases.ps1 within Visual Studio Code's Powershell Integrated Console I get the following:

PS C:\Users\cdonnelly> c:\Users\cdonnelly\Source\Repos\Workshop.Microservices\exercises\scripts\Setup-Databases.ps1

LocalDB instance "microservices-workshop" created with version 13.0.1601.5.
Private LocalDB instance "microservices-workshop" shared with the shared name: "microservices
-workshop".
LocalDB instance "microservices-workshop" started.
Name: microservices-workshop
Version: 13.0.1601.5
Shared name: microservices-workshop
Owner: VmVs2017\cdonnelly
Auto-create: No
State: Running
Last start time: 8/13/2017 6:03:09 AM
Instance pipe name: np:\.\pipe\LOCALDB#SHE63730\tsql\query
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Client unable to establish connection because an error was encountered during handshakes before login. Common c
causes include client attempting to connect to an unsupported version of SQL Server, server too busy to accept new connections or a resource limitation (memory or maxiu
mum allowed connections) on the server..
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Named Pipes Provider: No process is on the other end of the pipe.
.
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Client unable to establish connection.
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Client unable to establish connection due to prelogin failure.

When I run it just in an elevated powershell prompt I get:
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\cdonnelly> C:\Users\cdonnelly\Source\Repos\Workshop.Microservices\exercises\scripts\Setup-Databases.ps1
LocalDB instance "microservices-workshop" created with version 13.0.1601.5.
Private LocalDB instance "microservices-workshop" shared with the shared name: "microservices-workshop".
LocalDB instance "microservices-workshop" started.
Name: microservices-workshop
Version: 13.0.1601.5
Shared name: microservices-workshop
Owner: VmVs2017\cdonnelly
Auto-create: No
State: Running
Last start time: 8/13/2017 6:09:37 AM
Instance pipe name: np:\.\pipe\LOCALDB#SHE63730\tsql\query
sqlcmd : The term 'sqlcmd' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Users\cdonnelly\Source\Repos\Workshop.Microservices\exercises\scripts\Setup-Databases.ps1:11 char:1

  • sqlcmd -S $serverName -i ".\Setup-Databases.sql"
  •   + CategoryInfo          : ObjectNotFound: (sqlcmd:String) [], CommandNotFoundException
      + FullyQualifiedErrorId : CommandNotFoundException
    
    

I'm having these problems on a azure vm created using the template: Visual Studio Enterprise 2017 (version 15.2) on Windows Server 2016 (x64)

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.