Giter Site home page Giter Site logo

azure / azure-functions-templates Goto Github PK

View Code? Open in Web Editor NEW
334.0 72.0 190.0 9.59 MB

Azure functions templates for the azure portal, CLI, and VS

License: MIT License

C# 46.95% JavaScript 13.59% PowerShell 5.71% Python 20.40% TypeScript 6.75% F# 6.60%
azure-functions

azure-functions-templates's Introduction

Overview

This repository is home to a collection of templates used by development tools to provide a quick start experience for Azure Functions. A template in this context is a sample that demonstrates use of one or more bindings supported by Azure Functions. Following are the development tools that use templates from this repository:

Dotnet templates are consumed by Visual Studio and Visual Studio code via tooling feed. Non-dotnet and C# Script templates are consumed via extension bundles.

Build Status

Branch Status Description
dev Build Status This is the primary development branch all pull request go against this branch.
master Build Status This is the deployment branch all releases are performed from this branch.

Build Requirements

Build Steps

cd Build
npm install
gulp build-all

These build steps only work on Windows

Dotnet templates

There are two kind of dotnet templates contained within this repository, script type (.csx and .fsx) templates that do not require compilation and non-script type (.cs and .fs) templates that require compilation.

Creating a dotnet templates (.cs and .fs)

Template for dotnet precompiled functions apps adheres to the specification provided by the dotnet templating engine. The dotnet templating engine or an implementation of one is present within each of the dotnet client and is responsible for consuming dotnet templates. This format is not specific to Azure Functions but is a standard used for all dotnet templates by VS, VS Code and dotnet cli. This section covers some basic information needed to add a pre-compiled template.

There are 2 kinds of dotnet templates.

  1. Project templates: Project templates are responsible for creating initial set of files needed to build and run the project. For azure functions this would include, csproj file, host.json, local.settings.json file and so on.
  2. Item templates: Item templates are templates include files that you would want to add to an existing project. For azure functions this would mean class files, new functions.

Template files:

At the minimum you need the following files for a valid dotnet template. Please refer to the this link for detailed documentation on each of the files and properties contained within the file.

  1. .template.config/template.json : Presence of this file within the folder structure indicates to the dotnet templating engine that this is a template. This file contains symbols and post action action configuration that is used to generate a function from the template. The key difference between project and item template file is that tags -> type property would say project vs item for corresponding template types. Below is sample file with comments on individual fields.
  2. .template.config/vs-2017.3.host : This file contains information required to generate UI elements in Visual studio. For example, label and help text for UI elements.
  3. .template.config/vs-2017.3/*.png: Icon files for menu items in Visual studio.
  4. Class file or Project file : Class file is required if you are creating an item template. This could be either a .cs file or a .fs file. Project file is require if you are creating a project template. This could be either a .csproj file or an .fsproj file.

Here is a sample PR adding a dotnet item template. #1162

Adding a dotnet template for release to Visual Studio / Visual Studio code

This section covers information you need to add your template to the list of templates that show up within Visual studio and Visual studio code. VS and VS code only support templates for a single major version of a particular extension. That means there currently is no way to simultaneously include templates that target different major versions of the same extension within the same template list. The build system in this repository uses .nuspec files to manage different release trains. Add your template to the nuspec file corresponding to the target runtime release based on the table below.

Nuspec File Description
ProjectTemplates_v3.x.nuspec Project templates for dotnet in-proc function app targeting runtime v3
ItemTemplates_v3.x.nuspec Item templates for dotnet in-proc function app targeting runtime v3
ProjectTemplates-Isolated_v3.x.nuspec Project templates for dotnet isolated (out of proc) function app targeting runtime v3
ItemTemplates-Isolated_v3.x.nuspec Item templates for dotnet isolated (out of proc) function app targeting runtime v3
ProjectTemplates_v4.x.nuspec Project templates for dotnet in-proc function app targeting runtime v4
ItemTemplates_v4.x.nuspec Item templates for dotnet in-proc function app targeting runtime v4
ProjectTemplates-Isolated_v4.x.nuspec Project templates for dotnet isolated (out of proc) function app targeting runtime v4
ItemTemplates-Isolated_v4.x.nuspec Item templates for dotnet isolated (out of proc) function app targeting runtime v4

Testing dotnet templates

Dotnet pre-compiled templates are currently hosted by the following clients. Please follow the instructions in this section to test the corresponding clients.

Visual Studio (VS 2019 and VS 2022):

  1. Once the template files have been added / updated, build the templates using the Build Steps
  2. Make sure all instances of Visual Studio are closed;
  3. Open the directory %userprofile%\AppData\Local\AzureFunctionsTools\Tags
  4. Each of the directory within the tags directory represent a runtime, for testing runtime v4 templates open directory v4
  5. Open the LastKnownGood file in the directory for the runtime version you want to test and note the release version present in the file
  6. Open the templates output directory, ..\bin\VS
    1. Rename Microsoft.Azure.WebJobs.ItemTemplates.X.0.0.nupkg to ItemTemplates.nupkg
    2. Rename Microsoft.Azure.WebJobs.ProjectTemplates.X.0.0.nupkg to ProjectTemplates.nupkg

To test dotnet-isolated, rename Microsoft.Azure.Functions.Worker.ItemTemplates.X.0.0 and Microsoft.Azure.Functions.Worker.ProjectTemplates.X.0.0 in above step.

  1. Open the templates cache directory for release version matching the one found in step 5: %userprofile%\AppData\Local\AzureFunctionsTools\Releases\<releaseVersion>
  2. Open the templates folder for the framework you want to test:
    1. For in-proc, use the templates folder fould at the root of the templates cache directory
    2. For net7-isolated, use the net7-isolated/templates folder (for isolated, you should see a folder for netfx, net6, net5 etc.)
  3. Replace the contents of the folder with the renamed package found in ..\bin\VS
  4. Delete the %userprofile%\.templateengine directory
  5. Select corresponding function runtime when creating a new function app via Visual Studio
  6. Run through the test scenarios

Core tools

  1. Once the template files have been added / updated, build the templates using the Build Steps
  2. Find the location of core tools installation,you can use the command where func from windows command prompt
  3. Locate the templates directory relative to azure-functions-core-tools at install location
  4. For in-proc templates:
    1. Open the templates output directory, ..\bin\VS and rename Microsoft.Azure.WebJobs.ItemTemplates.X.0.0.nupkg to itemTemplates.[version].nupkg, Microsoft.Azure.WebJobs.ProjectTemplates.X.0.0.nupkg to projectTemplates.[version].nupkg. Use the version from templates found in step 3.
    2. Replace the contents of the folder with the renamed package found in ..\bin\VS
  5. For testing dotnet-isolated templates, repeat the instructions for In-proc in step 4, but instead rename the templates Microsoft.Azure.Functions.Worker.ItemTemplates.x and Microsoft.Azure.Functions.Worker.ProjectTemplates.x using the format itemTemplates.[version].nupkg and projectTemplates.[version].nupkg respectively. Use the version denoted in the contents of the folder net-isolated, then replace those packages with the renamed packages from ..\bin\VS of your local templates repo.
  6. Delete the %userprofile%\.templateengine directory

Visual Studio Code

We currently do not have a way to test templates in VS code without going to through extensive set up. Will update this section with instructions once we have the right set of hooks enabled.

Creating script type templates

Script type templates are templates for functions that do not require a compilation step. The templates includes metadata files in addition to the files required to execute a function. The metadata files help drive the user interface and development experience for creating a function using a template. In addition to the metadata file you would also need to add a code file for the corresponding language in the template. You can find information on the metadata files in the section below:

Template files:

  1. Code file: This is the file that contains the function execution code. This could be Python, JavaScript (Node JS), PowerShell, CSharp Script, FSharp Script. The only time this file is not needed is when you are creating a template for custom handlers.

  2. Metadata.json: This file includes basic information that explains the purpose of the template. It also includes configuration properties that help drive the UI required to create a function using a template. Individual properties are explain inline.

{
    "defaultFunctionName": "TimerTrigger",      // Default name to be used for a function if the user does not provide one during deployment.
    "description": "$TimerTrigger_description", // Short description explaining the functionality of the generated function.
    "name": "Timer trigger",                    // The template name shown in UI.
    "language": "C#",
    "category": [                               // Category under which this template should be presented.
        "$temp_category_core", 
        "$temp_category_dataProcessing"
    ],
    "categoryStyle": "timer",                  // Category style used to pick the correct icon for the template.
    "enabledInTryMode": true,                  // Should this template be available in try mode: https://tryfunctions.com/ng-min/try?trial=true
    "userPrompt": [                            // The development tools will prompt to configure this setting during template deployment
        "schedule"
    ]
}
  1. Resources.resx: This file contains all the localized resource strings referenced in the metadata files. The strings are used for description, help, error text and other display text for the UI elements of the development tools. Strings in resources.resx file are reference by adding $ before the corresponding string name. For example TimerTriggerCSharp_description is present in resources.resx file and is referenced in metadata.json file as $TimerTriggerCSharp_description

  2. Bindings.json: This file contains metadata for all the configuration options available for all the bindings. This allows the development tools to provide the users with an option to configure additional settings for the bindings used by the template. It also drives to UI used to add / modify bindings of an existing functions. Here is a sample entry for timerTrigger binding. You only need to add a template for binding that does not exist in binding.json.

{
  "type": "timerTrigger",                                     // The binding type property matching the "type" property in function.json
  "displayName": "$timerTrigger_displayName",                 // This is the text used by the UI element to display binding name.
  "direction": "trigger", 
  "enabledInTryMode": true,                                   // Should this binding be available in try mode https://tryfunctions.com/ng-min/try?trial=true
  "documentation": "$content=Documentation\\timerTrigger.md", // Location of the documentation related to this binding in the templates repository
  "settings": [                                               
      {
        "name": "schedule",
        "value": "string",
        "defaultValue": "0 * * * * *",
        "required": true,
        "label": "$timerTrigger_schedule_label",              // display text for the config option
        "help": "$timerTrigger_schedule_help",                // help text explaining what the config option is
        "validators": [
          {
            "expression": "",                                 // regex that can be used to validate the configuration value
            "errorText": "$timerTrigger_schedule_errorText"   // help text in case the regex validation fails
          }
        ]
      }
    ]
}
  1. Sample.dat: Sample.dat contains sample input data for each template.

Adding a template to Extension bundle

Pretty much all non-dotnet templates do not require compilation. The only exception to this is java templates which are not part of this repository as of now. Non-dotnet templates, CSharp and FSharp script templates are deployed via Extension bundles. This means that a new version of these templates would be deployed when a new version of extension bundle is released. Similar to dotnet templates we use .nuspec files to control which templates are included in which package (in this case extension bundle). Following tables list all the .nuspec files and their corresponding bundles.

Nuspec File Description
ExtensionBundleTemplates-1.x.nuspec Templates for Extension bundle v1
ExtensionBundleTemplates-2.x.nuspec Templates for Extension bundle v2
ExtensionBundleTemplates-3.x.nuspec Templates for Extension bundle v3
ExtensionBundlePreviewTemplates-3.x.nuspec Templates for preview Extension bundle v3
ExtensionBundlePreviewTemplates-4.x.nuspec Templates for preview Extension bundle v4

Testing script type template via Core tools

  1. Once the template files have been added / updated, build the templates using the Build Steps
  2. Locate the zip file for built template in the bin directory ..\bin\
  3. Extract the zip file content you want to test. This be based on the nuspec file you updated.
  4. Create a function app via core tools, open host.json to verify that it has extension bundle configuration present.
    • Sample commands for node app: func init . --worker-runtime node
  5. Execute the func GetExtensionBundlePath to find the path to the bundle being used.
    • Sample response: %userprofile%\.azure-functions-core-tools\Functions\ExtensionBundles\Microsoft.Azure.Functions.ExtensionBundle\2.8.4
  6. Replace the contents of the StaticContent\v1 directory (path from step 5) with the files extracted from the zip file in step 3.
  7. Execute func new at the root of the sample app to see the new / updated templates.

License

This project is under the benevolent umbrella of the .NET Foundation and is licensed under the MIT License

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

Related Github Repositories

Contribute Code or Provide Feedback

If you would like to become an active contributor to this project please follow the instructions provided in Microsoft Azure Projects Contribution Guidelines. If you encounter any bugs with the templates please file an issue in the Issues section of the project.

azure-functions-templates's People

Contributors

ahmelsayed avatar aishwaryabh avatar alrod avatar anthonychu avatar bachuv avatar brettsam avatar cgillum avatar charles-gagnon avatar csigs avatar davidmrdavid avatar dependabot[bot] avatar fabiocav avatar francisco-gamino avatar hossam-nasr avatar jviau avatar kashimiz avatar kshyju avatar liliankasem avatar lucyzhang929 avatar maddydev avatar maiqbal11 avatar mathewc avatar mattchenderson avatar mhoeger avatar paulbatum avatar pragnagopa avatar soninaren avatar surgupta-msft avatar sylvanc avatar tsuyoshiushio 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

azure-functions-templates's Issues

JS queue trigger template has confusing .id reference

The template has this code:

module.exports = function (context, myQueueItem) {
    context.log('Node.js queue trigger function processed work item', myQueueItem.id);
    context.done();
};

The confusing thing is that this .id reference is not referring to the actual azure queue id of the message.. its based on the sample data having an ID property.

To make this sample less confusing, lets change the sample data to something else.

Easy Tables binding is confusing to Mobile Apps developers

In Functions, the "Easy Tables" binding uses the URL of a mobile app, which it looks like can be any table exposed by a App Service mobile app. In Mobile Apps, an "Easy Table" is usually a Node.js backend service, since Easy Tables in the portal doesn't support .NET backend.

This makes "Easy Tables" confusingly overloaded. Instead of Easy Tables we should call it Mobile Tables.

ServiceBus trigger parameter description and default values

The service bus trigger incorrectly calls the input/trigger source output .

The current verbiage is:

Which queue would you like to output to?

When it should be (for consistency with storage queues):

Which queue should the trigger monitor?

Queue Trigger Batch Function

Change name to Queue Trigger to Blob Batch Function
rename trigger queue to "samples-workitems"
Change name of output parameter to Out-Blob

Queue Trigger PHP Function

Add output or consider deleting the template
rename trigger queue to "samples-workitems"
rename template to include the output to

ServiceBusQueue binding connection string error

Creating a function using the ServiceBusQueue trigger currently triggers the following error on function creation:

Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.servicebusssignoffnode'. Microsoft.Azure.WebJobs.ServiceBus: Microsoft Azure WebJobs SDK ServiceBus connection string 'AzureWebJobs' is missing or empty.
2016-03-29T20:55:45  Welcome, you are now connected to log-streaming service.

Blob trigger node.js template throws errors

Created a blob template in node.js and it consistently throws the below errors (taken from the Webjob SDK dashboard)

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: Functions.BlobTriggerNodeJS1 ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Timeouts are not supported on this stream.
at System.IO.Stream.get_ReadTimeout()
at Microsoft.Azure.WebJobs.Host.Blobs.DelegatingStream.get_ReadTimeout()
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ClrFunc.MarshalCLRObjectToV8(Localv8::Object* , Object netdata)
at ClrFunc.MarshalCLRToV8(Localv8::Value* , Object netdata)
at ClrFunc.MarshalCLRToV8(Localv8::Value* , Object netdata)
at ClrFunc.MarshalCLRToV8(Localv8::Value* , Object netdata)
at NodejsFuncInvokeContext.CallFuncOnV8Thread()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Script.Description.NodeFunctionInvoker.d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__33.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__2e.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__15.MoveNext()
--- End of inner exception stack trace ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__2.MoveNext()

Queue Trigger Nodejs

Change name to: Queue Trigger to Blob Node.js Function
Add a parameter name for the trigger, if we can't, we should block the UX for the parameter name in the trigger
Rename the output blob from "receipt" to Out-Blob
Have an option for default storage account connection (filed separately in the UX repo)

Blob trigger node.js - change path name from sample-workitems to myblob

not a huge priority but couple of issues with current name:

  1. sample-workitems sounds more like a queue not a file folder
  2. having a dash is illegal for table storage (even though it is ok for blob storage might as well make it consistent)
    1. new name will be similar to the name of the object in code

Fix Node.js HTTP template log output

The Name= output is wrong. It outputs the full url, not a name. Should be RequestUri= like the C# sample.

context.log('Node.js HTTP trigger function processed a request. Name=' + req.originalUrl);

Queue Trigger Powershell Function

Consider removing this one if we don't have a good powershell story. If not, this one seems to have table output so we either change to blob to be consistent with the other ones or at least rename the template to Queue Trigger to Table Storage Powershell Function

Queue Trigger Bash Function

Add output to Blob. If impossible let's remove the template. Make sure we have parameter name.
rename trigger queue to "samples-workitems"

Issue with webhook binding type "generic"

There is no such thing as webhookType: "generic". The drop down should instead have an option that says "Generic JSON" and this should correspond to webhookType: "genericJson".

Service Bus bindings need work

  1. There is a binding labelled "Service Bus" which is quite ambiguous (if its for service bus queues it should be labelled as such).
  2. The picker for a service bus queue should not be asking you to select a notification hub. These need to be different pickers!
  3. The label for the queue name box is "Which queue would you like to trigger off of" -- but you're not triggering, you're creating messages in this queue.

GitHub webhook template needs instructions

Discussed this with Chris, he suggested that the code template should have a comment that includes instructions for setting up the webhook (or a link to some online instructions).

Cron Trigger expressions not supported

App: functions1f748f5a

I used http://www.cronmaker.com/ (from google search) to generate a few expressions
e.g
hourly
0 0 0/1 1/1 * ? *
every minute
0 0/1 * 1/1 * ? *

but we dont seem to support them.
2016-03-29T17:49:28.083 Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.TimerTriggerCSharp1'. mscorlib: String was not recognized as a valid TimeSpan.

We should validate the expressions upfront, a UI to generate working expressions would also be handy .

Remove runOnStartup from timer binding and template

RunOnStartup has a problem where it will run every time that the function app gets loaded up due to other bindings (such as another function reading queue messages). This means that the function wont actually run according to the schedule. We need to remove it from the templates and the binding.json so that this option is disabled.

C# http template returns JSON / XML instead of plain text

Not sure if this was a deliberate change, but raising it in case. Previously, HttpTriggerCSharp was returning text. Now, when I run it from portal, the response has JSON, e.g.

"Hello Azure"

What I don't like is that if you run copy the function your and run it from new tab, you get XML, e.g.

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
Please pass a name on the query string or in the request body
</string>

That feels pretty heavy for what's supposed to be the simplest template. That may be a runtime issue rather than template.

ServiceBus template only supports queues

The current templates only supports using service bus queues. There is no option to use a topic and the user must go into the advanced editor and have knowledge of the property name.

We're likely dealing with a UI limitation here as well, but we could address this by having one template for Service Bus Queues and another for Service Bus Topics in the meantime.

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.