darthfubumvc / fubumvc Goto Github PK
View Code? Open in Web Editor NEWA front-controller style MVC framework for .NET
Home Page: http://fubumvc.github.io
License: Other
A front-controller style MVC framework for .NET
Home Page: http://fubumvc.github.io
License: Other
The FubuMVC guide Behaviors needs to be converted from Textile to reStructuredText and moved from the fubuguides to this repository in the docs/source directory.
The guide also is currently unfinished, this is one of the biggest features of FubuMVC so this should also be finished and set up as a prep guide to the Advanced Behaviors guide.
This should most likely go under the topics directory, but it should be discussed.
The Getting Started guide can be used as a good starting point as to how to use Sphinx and reStructuredText. It can be found at /docs/source/intro/gettingstarted.rst
Commit 9054064 makes the actions not to be registered in Fubu when using ApplyHandlerConventions() from FubuRegistry.
Removing that line makes everything go back to normal.
The only registered action points to:
"Behaviors GET hello/{Name} get_Name_handler.Execute(SayHelloRequestModel request) : String"
During testing the new diagnostics package I bumped into a Mono (OS X / Linux) related exception with regards to serialization of FubuMVC.Diagnostics.Models.Grids.JsonGridColumn.
After further digging around I realized that the standard implementation of IJsonWriter uses HtmlTags.JsonUtil which wraps around JavaScriptSerializer. The corresponding serializer on Mono is apparently buggy (and has been for a while) - I tried switching to Json.NET and that made things work on Mono.
I think it would be nice if we could use something that works on both platforms. I can think of two Json serializers:
ASP.Net MVC will bind requests like the following:
http://localhost/app/action?param=foo¶m=bar
To actions which have the following signature:
public ActionResult Action(string[] param) { }
In Fubu I had to work around this by changing the property to a string and then splitting the resulting string on commas.
I am attempting to utilize the multiple cores on our build machines to speed up out CI build time. In this attempt I tried to bottle up multiple features at a time run spooling up a number of threads for each processor that I have on those machines. This occasionally gives me an error because the .version file in the temporary directory is in use by another process.
I am interested in working on a fix for this, but didn't want to step on your toes if there was a deeper underlying reason to the way you've implemented it. My proposed solution is to create a nested temporary directory within the user's temp directory, and perform all bottle operations for the given run within that sandbox. I don't believe this would cause any conflicts with the current implementation, I would just like a confirmation before continuing.
Thanks,
Matt Smith
public override string ViewUrl
{
get
{
string urlFor = Urls.UrlFor(x => x.View());
return urlFor;
}
}
In master, that returns "gettingstartedwidget/view"
We're expecting it to return /DovetailCRM/gettingstartedwidget/view
It looks like the change to findAnswerFromResolver in commit 5aac9d4 located here: 5aac9d4#diff-14
is the culprit. I don't know the intent behind that change. I don't know if it's returning the correct value now, or if it's broken and our code that's using it should change. Looking at the test for UrlFor, it's working properly.
This isn't going to be non-trivial. Might wait until Serenity exists
BehaviorGraph.BehaviorFor(Expression) can give you misleading results when more than one behavior chain in the graph contains the same ActionCall. I think we should blow up if there are multiple results.
Otherwise, we could make BehaviorFor(expr) work on the FirstCall, but the same problem is still there.
When a view renders a #this.Partial action which returns a HtmlTag the resulting output is not rendered in-context with the view.
Spark view:
<h1>I should come first</h1>
#this.Partial<ExampleRequest>();
HTML rendered like so:
Partial Output
<h1>I should come first</h1>
My guess is that the default output writer does a Response.Write(tag.ToString()) which is rendered first because the spark view engine has multiple string builders composing the view witch only do a Response.Write after the entire view is composed.
1. New empty web project, net40
2. install-package FubuMVC
3. Press F5
Exception:
Package loading and application bootstrapping failed
FubuMVC.Core.Packaging.StandaloneAssemblyPackageLoader
System.IO.FileLoadException: Could not load file or assembly 'Ionic.Zip, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Ionic.Zip, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c'
at Bottles.Zipping.ZipFileService.ExtractTo(String description, Stream stream, String directory)
at Bottles.Exploding.PackageExploder.<>c__DisplayClass19.<explodeAssembly>b__18(String name)
at System.Collections.Generic.GenericEnumerableExtensions.Each[T](IEnumerable`1 values, Action`1 eachAction)
at Bottles.Exploding.PackageExploder.explodeAssembly(Assembly assembly, String directory)
at Bottles.Exploding.PackageExploder.<>c__DisplayClass16.<ExplodeAssembly>b__14()
at Bottles.Exploding.PackageExploder.explode(ExplodeRequest request)
at Bottles.Exploding.PackageExploder.ExplodeAssembly(String applicationDirectory, Assembly assembly, IPackageFiles files)
at Bottles.Assemblies.AssemblyPackageInfo.CreateFor(Assembly assembly)
at Bottles.Assemblies.AssemblyPackageInfo.CreateFor(String fileName)
at FubuMVC.Core.Packaging.StandaloneAssemblyPackageLoader.<Load>b__0(String assembly)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Bottles.PackagingRuntimeGraph.<findAllPackages>b__6(IPackageLoader loader)
at Bottles.Diagnostics.PackagingDiagnosticsExtensions.<>c__DisplayClass2`1.<>c__DisplayClass4.<LogExecutionOnEach>b__1()
at Bottles.Diagnostics.PackageLog.Execute(Action continuation)
Need to eliminate the StructureMapControlBuilder and replace with something IoC agnostic to make IoC integration easier
The PackagesCommand probably should NOT have been moved into Bottles. The code is hard wired to be consistent with FubuMVC and will not work outside of that context
This code does not work:
Route("griddata/{gridName}").Calls(x => x.Data(null));
Route( pattern ) creates a RouteDefinition and there's no way to have it "up" itself to RouteDefinition when the action call is added
Be nice to be able to turn on some pre-existing canned rules to validate a BehaviorGraph
Lo! and behold. I hereby summon the powers that be to provide for us, the mere mortals, a great and excellent grand unification of the Model Binding and Value Converting Families of amazing awesome with the most benevolent IObjectResolver. For too long our separate tribes have warred over the same terrain of watery code. I propose instead that we dry up the waters between our two camps and provide for us a direction of complete awesome.
TL;DR: please unify Model Binding / Value Conversion with IObjectResolver. :)
-d
Currently, data loading output is written to bin/package-data-results. It should be outside of the build folder.
Maybe even out of the app folder completely. How about the system/user's temp folder? Or user's application data folder?
Should just write to the MimeType.New() object
The fubu.exe documentation (/docs/source/ref/fubuexe.rst) is pretty much an exact copy of the documentation that fubu.exe prints out for each command. This is OK as it is at least complete, but it could use some more love on formatting and what each command is meant for. It also is lacking on some actual examples on how to use each command.
Add this and watch it go boom!
public class MessStuffUpRegistryExtension : IFubuRegistryExtension
{
public void Configure(FubuRegistry registry)
{
registry.Configure(bg=>
{
var chain = new BehaviorChain();
bg.AddChain(chain);
});
}
}
In Denmark we are so "lucky" to use the comma instead of point as decimal separator. That makes the following test fail:
FubuCore.Testing.ObjectConverterTester.parse_a_number : Expected: 123.45d But was: 12345.0d
FubuCore.Testing.ObjectConverterTester.parse_timespan_as_hours : Expected: 01:30:00 But was: 05:00:00
Code like this:
public class SearchRequest
{
[QueryString]
public string query { get; set; }
}
...
var url = _urlRegistry.UrlFor(new SearchRequest());
Is Throwing an exception like this:
Exception Details: System.Web.HttpException: 'search/search?query=' is not a valid virtual path.
Source Error:
Line 59: if (Uri.IsWellFormedUriString(url, UriKind.Absolute)) return url;
Line 60: if (url.IsEmpty()) url = "/";", url);
Line 61: if (!_isAbsolute(url))
Line 62: {
Line 63: url = _combine("
Source File: c:\projects\fubumvc\src\FubuCore\UrlContext.cs Line: 61
Stack Trace:
[HttpException (0x80004005): 'search/search?query=' is not a valid virtual path.]
System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options) +8862571
System.Web.VirtualPathUtility.IsAbsolute(String virtualPath) +13
FubuCore.UrlContext.ToAbsoluteUrl(String url) in c:\projects\fubumvc\src\FubuCore\UrlContext.cs:61
FubuMVC.Core.Registration.Routes.RouteDefinition1.CreateUrl(Object input) in c:\projects\fubumvc\src\FubuMVC.Core\Registration\Routes\RouteDefinition.cs:134 FubuMVC.Core.Urls.UrlRegistry.UrlFor(Object model) in c:\projects\fubumvc\src\FubuMVC.Core\Urls\UrlRegistry.cs:104 Dovetail.Search.Web.Administration.CapabilitiesController.Index() in C:\projects\seeker\src\Dovetail.Search.Web\Administration\CapabilitiesController.cs:17 lambda_method(ExecutionScope , CapabilitiesController ) +9 FubuMVC.Core.Behaviors.ZeroInOneOutActionInvoker
2.performInvoke() in c:\projects\fubumvc\src\FubuMVC.Core\Behaviors\ZeroInOneOutActionInvoker.cs:22
FubuMVC.Core.Behaviors.BasicBehavior.Invoke() in c:\projects\fubumvc\src\FubuMVC.Core\Behaviors\BasicBehavior.cs:26
FubuMVC.Core.Diagnostics.BehaviorTracer.b__0() in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\BehaviorTracer.cs:21
FubuMVC.Core.Diagnostics.BehaviorTracer.invoke(Action action) in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\BehaviorTracer.cs:42
FubuMVC.Core.Diagnostics.BehaviorTracer.Invoke() in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\BehaviorTracer.cs:21
FubuMVC.Core.Behaviors.BasicBehavior.Invoke() in c:\projects\fubumvc\src\FubuMVC.Core\Behaviors\BasicBehavior.cs:28
FubuMVC.Core.Diagnostics.BehaviorTracer.b__0() in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\BehaviorTracer.cs:21
FubuMVC.Core.Diagnostics.BehaviorTracer.invoke(Action action) in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\BehaviorTracer.cs:42
FubuMVC.Core.Diagnostics.BehaviorTracer.Invoke() in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\BehaviorTracer.cs:21
FubuMVC.Core.Diagnostics.DiagnosticBehavior.Invoke() in c:\projects\fubumvc\src\FubuMVC.Core\Diagnostics\DiagnosticBehavior.cs:26
FubuMVC.StructureMap.NestedStructureMapContainerBehavior.Invoke() in c:\projects\fubumvc\src\FubuMVC.StructureMap\NestedStructureMapContainerBehavior.cs:29
FubuMVC.Core.Runtime.FubuHttpHandler.ProcessRequest(HttpContext context) in c:\projects\fubumvc\src\FubuMVC.Core\Runtime\FubuRouteHandler.cs:49
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
https://gist.github.com/1187033
[TestFixture]
public class SearchExtensionTester
{
private FubuRegistry _fubuRegistry;
private BehaviorGraph _graph;
[SetUp]
public void setup()
{
_fubuRegistry = new FubuRegistry();
_fubuRegistry.Actions.IncludeClassesSuffixedWithController();
_fubuRegistry.Applies
.ToAssembly(typeof (FakeEntity).Assembly);
_fubuRegistry.Import<EntitySearchExtension>();
_graph = _fubuRegistry.BuildGraph();
}
[Test]
public void _graph_should_contain_a_generic_search_action()
{
_graph.Actions()
.Where(call => call.HandlerType.Closes(typeof (EntitySearchAction<>)))
.Count().ShouldBeGreaterThan(0);
}
}
public class FakeEntity : DomainEntity{}
public class EntitySearchExtension : IFubuRegistryExtension
{
public void Configure(FubuRegistry registry)
{
registry.Actions.FindWith<EntitySearchActionSource>();
registry.Routes.UrlPolicy<EntitySearchUrlPolicy>();
registry.StringConversions(x => x.IfCanBeCastToType<IDomainEntity>()
.ConvertBy(c => c.IsNew()?"":c.Id));
}
}
Without this line in my test
_fubuRegistry.Actions.IncludeClassesSuffixedWithController();
The TypePool scanning is not scanning my assemblies by the time the IActionSource is executed
Currently, a single route is created for each behavior chain (endpoint) via the conventions established in the Routes DSL. In some cases (back-compat link preservation), you may want an alternate route pattern to also resolve to the same chain. Maybe a [UrlAlias("other/route")] attribute?
The idempotent nature of the UseSpark call is troublesome for packages that need to modify the template registry and apply bindings.
For instance, with the getting started bits, we need to redirect the view's application.spark to the diagnostics package. This is possible when the host application is not using Spark. However, with a UseSpark in the host...no modifications can be made later.
Packages can now be at either /bin/fubu-packages or /fubu-content, but the fubu.exe commands only know about the ones in /bin/fubu-packages.
Application-specific registrations are being stomped by Fubu's
Came up in Dovetail work. Once in a while, you may want a package that overrides the view of an existing behavior chain from the core. Just want something like:
BehaviorChain.ReplaceOutputNodesWith(params OutputNode[] nodes)
Calling UrlRegistry.UrlFor() when passing in a model with properties decorated with the QueryString attribute does not produce a url with querystring parameters. This is occurring with the default conventions and behaviors (straight out of the NuGet package).
Here's a quick controller that will reproduce the issue:
public class ReproController
{
private readonly IUrlRegistry _urlRegistry;
public ReproController(IUrlRegistry urlRegistry)
{
_urlRegistry = urlRegistry;
}
public HtmlDocument get_qs_repro(QSReproModel input)
{
var document = new HtmlDocument();
document.Title = "QueryString Repro";
document.Add("h1").Text("The parameter is " + input.Param);
var model = new QSReproModel() { Param = 42 };
var url = _urlRegistry.UrlFor(model);
document.Add("a").Attr("href", url).Text("Link to this page with parameter 42");
return document;
}
public class QSReproModel
{
[QueryString]
public int Param { get; set; }
}
}
RouteInput.cs looks like it has code intended to handle this (based on a quick step-through), but the _queryParameters member doesn't appear to ever have any items added to it.
With the controller above, I can visit the URL http://localhost:50683/qs/repro?Param=54
and the document would display "The parameter is 54". I am expecting that the link in the document would have an href of http://localhost:50683/qs/repro?Param=42
, but instead it is http://localhost:50683/qs/repro
.
Regarding ahjohannessen's suggestion below:
If I change the method name to get_qs_repro_Param, http://localhost:50683/qs/repro?Param=54
results in a 404. Visiting http://localhost:50683/qs/repro/54
works, and the UrlFor call produces http://localhost:50683/qs/repro/42
. So route parameters are working as expected. But I'm trying to use querystring parameters.
Keeps coming up over and over again. Want a quick way to decorate an existing Behavior with a conditional "run the inner behavior if this condition is met, but pass into the next behavior as normal regardless"
Needs more conversation.
Way, way too much stuff going on. Every property has to be bound, yet only a handful will ever be used at any one time. We should probably consider killing this thing as we redo our http abstractions.
Rather than rely on a return type to determine the response output. It would also be nice to have the client specify the format in the content type of the request.
Need end to end tests
The FubuMVC guide Advanced Behaviors needs to be converted from Textile to reStructuredText and moved from the fubuguides to this repository in the docs/source directory.
This should most likely go under the topics directory, but it should be discussed.
The Getting Started guide can be used as a good starting point as to how to use Sphinx and reStructuredText. It can be found at /docs/source/intro/gettingstarted.rst
Hi.
Is it possibile to change a bit HtmlTags.JsonUtil class? I think that all ToJson() methods should use JavaScriptSerializer constructed with config parameters read from web.config. Idea: http://paste.org/pastebin/view/15584
Thanks.
System.ApplicationException crossed a native/managed boundary
Message=Package loading and application bootstrapping failed
FubuMVC.Core.Packaging.StandaloneAssemblyPackageLoader
System.IO.FileLoadException: Could not load file or assembly 'Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=null'
at Bottles.Zipping.ZipFileService.ExtractTo(String description, Stream stream, String directory)
at Bottles.Exploding.PackageExploder.<>c__DisplayClass19.<explodeAssembly>b__18(String name)
at System.Collections.Generic.GenericEnumerableExtensions.Each[T](IEnumerable`1 values, Action`1 eachAction)
at Bottles.Exploding.PackageExploder.explodeAssembly(Assembly assembly, String directory)
at Bottles.Exploding.PackageExploder.<>c__DisplayClass16.<ExplodeAssembly>b__14()
at Bottles.Exploding.PackageExploder.explode(ExplodeRequest request)
at Bottles.Exploding.PackageExploder.ExplodeAssembly(String applicationDirectory, Assembly assembly, IPackageFiles files)
at Bottles.Assemblies.AssemblyPackageInfo.CreateFor(Assembly assembly)
at Bottles.Assemblies.AssemblyPackageInfo.CreateFor(String fileName)
at FubuMVC.Core.Packaging.StandaloneAssemblyPackageLoader.<Load>b__0(String assembly)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Bottles.PackagingRuntimeGraph.<findAllPackages>b__6(IPackageLoader loader)
at Bottles.Diagnostics.PackagingDiagnosticsExtensions.<>c__DisplayClass2`1.<>c__DisplayClass4.<LogExecutionOnEach>b__1()
at Bottles.Diagnostics.PackageLog.Execute(Action continuation)
=== Pre-bind state information ===
LOG: User = isomorphism\xyz
LOG: DisplayName = Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///D:/code/throw-away/Mischief/Mischief/
LOG: Initial PrivatePath = D:\code\throw-away\Mischief\Mischief\bin
Calling assembly : Bottles, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: D:\code\throw-away\Mischief\Mischief\web.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Users/xyz/AppData/Local/Temp/Temporary ASP.NET Files/root/272256eb/d98feb62/Ionic.Zip.DLL.
LOG: Attempting download of new URL file:///C:/Users/xyz/AppData/Local/Temp/Temporary ASP.NET Files/root/272256eb/d98feb62/Ionic.Zip/Ionic.Zip.DLL.
LOG: Attempting download of new URL file:///D:/code/throw-away/Mischief/Mischief/bin/Ionic.Zip.DLL.
WRN: Comparing the assembly name resulted in the mismatch: PUBLIC KEY TOKEN
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
------------------------------------------------------------------------------------------------
Source=Bottles
StackTrace:
at Bottles.PackageRegistry.<AssertNoFailures>b__a()
at Bottles.PackageRegistry.AssertNoFailures(Action failure)
at Bottles.PackageRegistry.AssertNoFailures()
at FubuMVC.Core.FubuApplication.Bootstrap()
at FubuMVC.Core.FubuApplication.Bootstrap(IList`1 routes)
at Mischief.App_Start.AppStartFubuMVC.Start() in D:\code\throw-away\Mischief\Mischief\App_Start\FubuMVC.cs:line 17
InnerException:
Somene is not following semver here!
Hmm, let's see if I can get sinatra up and running then! Figured I'd give it a take or two with fubu, but this is getting old.
"We are floating the idea of adding a "super-debug" mode that would be
very verbose, and you really wouldn't want on except in deliberate
debugging scenarios." - Joshua Flanagan
Based on this thread:
http://groups.google.com/group/fubumvc-devel/browse_thread/thread/29dff01fec155967
Dru wanted more info about how views were being (or not being) attached to actions
Add more detailed diagnostics for package image/css loading
Current behavior is that requests are returned as JSON within an HTML textarea, unless an XmlHttpRequest header exists, in which case, you get a true JSON response. This was required by the jquery.forms plugin for file uploads. But for non-web clients, it just doesn't make sense. Need to change the default behavior (or provide an easy way to choose a different IJsonWriter implementation).
When my package foo.zip is exploded to fubu-content, it creates a fubu-content\foo directory and a fubu-content\Foo.Extensions directory. My foo.zip contains a Foo.Extensions.dll - it is the primary assembly. All of the package files are in the fubu-content\foo directory, as expected. The fubu-content\Foo.Extensions directory is empty, and probably should not exist.
The .package-manifest is:
<?xml version="1.0"?>
<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>foo</Name>
<Assemblies>Foo.Extensions</Assemblies>
<DataFileSet Include="*.*">
<DeepSearch>true</DeepSearch>
</DataFileSet>
<ContentFileSet Include="*.as*x;*.config;*.master;Content\*.*">
<DeepSearch>true</DeepSearch>
</ContentFileSet>
</package>
As reported on the mailing list, when attempting to download FubuMVC.Diagnostics or FubuMVC.WebForms from Nuget within Visual Studio, you get an error stating External packages cannot depend on packages that target projects.
This error is easily reproduced by opening up a new Empty Web Application solution, downloading FubuMVC from Nuget, and then attempting to download FubuMVC.Diagnostics afterword. The dialog window gives the following output:
Attempting to resolve dependency 'FubuMVC.References (≥ 0.9.1.513)'.
Attempting to resolve dependency 'Bottles'.
Attempting to resolve dependency 'FubuCore'.
Attempting to resolve dependency 'CommonServiceLocator (≥ 1.0)'.
Attempting to resolve dependency 'HtmlTags'.
Attempting to resolve dependency 'DotNetZip'.
Attempting to resolve dependency 'FubuLocalization'.
Attempting to resolve dependency 'StructureMap'.
Attempting to resolve dependency 'FubuMVC.Spark'.
Attempting to resolve dependency 'Spark'.
External packages cannot depend on packages that target projects.
StringToken.ToFormat() doesn't use the default text
The FubuMVC guide Configuring Actions in FubuRegistry needs to be converted from Textile to reStructuredText and moved from the fubuguides to this repository in the docs/source directory.
This should most likely go under the topics directory, but it should be discussed.
The Getting Started guide can be used as a good starting point as to how to use Sphinx and reStructuredText. It can be found at /docs/source/intro/gettingstarted.rst
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.