Giter Club home page Giter Club logo

cachemanager's People

Contributors

ahockersten avatar auroradysis avatar fgideali avatar jkernsva avatar kriskit avatar michaco avatar michael-baker avatar nflash avatar rebulanyum avatar rwwilden avatar wenisman 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cachemanager's Issues

why not support local memory cache with BackPlate

I found that while I config WithSystemRuntimeCacheHandle with RedisBackPlate,it not work.
Then I found code in RegisterCacheBackPlate do not add handler which configed as IsBackPlateSource.

if (!handle.Configuration.IsBackPlateSource)
 {
           handleList.Add(handle);
 }

Can I modify it to support BackPlate when only local memory cache be configed?

Is it right just add the handler to handleList,then the item in memory will be removed?

Storing strongly typed classes

Hello, love your caching manager, trying to learn it and need it to scale.

When I only have the Runtime cache enabled, I can easily add complex classes into cache and retrieve them back as the complex class. It works beautifully.

However, when I enable the redis options, I get serialization error. My current project has been using the ObjectCache from .Net for so long, and it doesn't require you to do anything with your object, just add/get it to the cache.

Can I use CacheManager to cache these complex objects and not have to serialize/deserialize myself?

Thanks

GetOrAdd capability

I think a GetOrAdd function would be useful, as mentioned in the distributed environment it is necessary to make sure all caches are in sync. The function would basically add the value to the key/region only when the key doesn't already exists.

Perhaps something that looks like the following?

        private TCacheValue GetOrAddInternal(string key, string region, Func<CacheItem<TCacheValue>> itemFunc)
        {
            var item = string.IsNullOrWhiteSpace(region) ? GetCacheItem(key) : GetCacheItem(key, region);

            // if the cache item doesn't already exist, add them
            if (item == null)
            {
                item = itemFunc();
                AddInternal(item);
            }

            return item.Value;
        }

Remove AppFabricCache and WindowsAzureCaching packages

I'm planning to remove the two packages

  • CacheManager.WindowsAzureCaching
  • CacheManager.AppFabricCache

Azure Managed Cache will get removed from Azure at some point and replaced with Azure Redis Cache.
Apart from that, I cannot really test those packages to ensure they are actually working.

If anyone still needs this, let me know.

CacheFactory is missing non generic overloads

UnityContainer container = new UnityContainer();
 container.RegisterType<ICacheManager<A>>(
new ContainerControlledLifetimeManager(),
new InjectionFactory((c) => CacheFactory.FromConfiguration<A>("myCache")));

I has many class A、B、C...so when init IOC by code above, there will be many same code.
How can I simply register multiple types to IOC container?

CacheUpdateMode question and issues

I'm not sure this is the intended behaviour for CacheUpdateMode.Full implementation.

The current implementation for BaseCacheManager - GetCacheItemInternal causes the cache item to be re-added to all the handles now this is fine and not noticeable if the handle is memory cache. However, re-adding any item to any other type of cache requires serialization of the item and replacing the item in the target cache. this overhead seems to defeat the purpose of the cache, especially when this is done every access of the item.

I'm not sure if there is any better way to implement this, but perhaps this should be implemented through the backplate notification instead?

Redis fallback to Runtime Caching

Does CacheManager have functionality that would allow caching to fall back to runtime caching if the redis server is no longer available?

Thanks!

How to get CacheManager working with ASP.NET Web API + NInject

The System.Runtime.Caching.MemoryCache.Default is not cleared until appdomain shutdown. The memory cache in CacheManager is cleared on every new http request. I'm using it in an asp.net mvc web api controller.

Looking at the code, it's suppose to use MemoryCache.Default if the handle name is empty or the default of "default". It doesn't seem to be doing that. I think it's creating a new instance of MemoryCache each time.

line 50 here
https://github.com/MichaCo/CacheManager/blob/master/src/CacheManager.SystemRuntimeCaching/MemoryCacheHandle%601.cs

This is my configuration section:

<cacheManager xmlns="http://tempuri.org/CacheManagerCfg.xsd">
    <managers>
        <cache name="defaultCache" updateMode="Up" enableStatistics="false" enablePerformanceCounters="false">
            <handle name="default" ref="systemRuntimeHandle" expirationMode="Absolute" timeout="5m"/>
        </cache>
    </managers>
    <cacheHandles>
        <handleDef  id="systemRuntimeHandle" type="CacheManager.SystemRuntimeCaching.MemoryCacheHandle`1, CacheManager.SystemRuntimeCaching"
          defaultExpirationMode="Sliding" defaultTimeout="5m"/>
    </cacheHandles>
</cacheManager>

Sample code showing that they work differently:

string key = "key";
var stringCache = CacheFactory.FromConfiguration<string>("defaultCache");
var myValue = stringCache.Get(key);
if (myValue == null)
{
    stringCache.Add(thingerCacheKey, "test");
}

key = "key2";
myValue = MemoryCache.Default.Get(key) as string;
if (myValue == null)
{
    var policy = new CacheItemPolicy
    {
        SlidingExpiration = TimeSpan.FromMinutes(5)
    };
    MemoryCache.Default.Add(key, "test", policy);
}

CacheItem expiration settings

The interface right now expects ExpirationMode and a timeout value, it has two drawbacks

  1. It is only possible to support one type of expiration for any cached item
  2. The user cannot specify exactly when the cache would expire because the absolute expiration is determined by the calculated by using timeout + UtcNow when the cache item is created. Instead of an actual datetime object.

Suggest removing the expiration mode and have two separate values for expiration (similar to HttpRuntime.Cache) with one TimeSpan for sliding expiration and one DateTime for absolute expiration.

Commands Flags (Redis) when getting or adding a key

In a replication group adding a key always goes to the master node (as it should), but when reading, it goes also to the master node, it will be better to give the clients the option of defining the Commands Flags when they are working with a redis handle or hardcode the PreferSlave flag on every get operation

Possible threading deadlock CacheFactory.FromConfiguration on Startup.cs in MVC application

CacheManager.Core 0.6.1
In ASP.NET MVC 5.2.3

Startup.cs

//Freeze here (possible reason threading deadlock)
   var cacheManager = CacheFactory.FromConfiguration<object>("storefrontCache");
   container.RegisterInstance<ICacheManager<object>>(cacheManager); 

web.config

<cacheManager xmlns="http://tempuri.org/CacheManagerCfg.xsd">
        <managers>
            <cache name="storefrontCache" updateMode="Up" enableStatistics="true" enablePerformanceCounters="true">
                <handle ref="runtimeMemory" name="inMemoryCacheHandle" expirationMode="Absolute" timeout="10m"/>
            </cache>
        </managers>
        <cacheHandles>
            <handleDef id="runtimeMemory" type="CacheManager.SystemRuntimeCaching.MemoryCacheHandle`1, CacheManager.SystemRuntimeCaching" />
        </cacheHandles>
    </cacheManager>

New logging package using NLog directly

The only currently available logger uses the Microsoft.Extensions.Logging package.
I'd like to have at least one other implementation, and one of them should be using the latest NLog directly so that we don't have deps to the Microsoft stack.

No section defined with name cacheManager

<system.web> <compilation debug="true" targetFramework="4.5.2" /> <httpRuntime targetFramework="4.5.2" /> <caching> <outputCache defaultProvider="CacheManagerOutputCacheProvider"> <providers> <add cacheName="cache" name="CacheManagerOutputCacheProvider" type="CacheManager.Web.CacheManagerOutputCacheProvider, CacheManager.Web" /> </providers> </outputCache> </caching> </system.web>

No section defined with name cacheManager

Enhancement: overload of Put that works like Update

Hi Michael,

I like the idea of Update resolving conflicts. So much so I think it would make sense if there was an overload of the Put method that works in the same way.

This new Put method would take a parameter named addOrUpdate of type Func<TCacheValue, TCacheValue>

On calling this Put method, if the key was not found then the first argument supplied to this delegate would be null (well actually default(T)). If on the other hand the key was found, its associated value would be supplied.

The Put method would then continue to execute the addOrUpdate delegate until conflicts were resolved.

Do you think this is a good idea or am I missing something fundamental?

Thanks
Christian

Configuring Redis distributed only

I was trying to have a Redis only solution in MVC core
In startup.cs I configured cache and injected it into Singleton
But it tells me that no cache handles are configured.

var cache = CacheFactory.Build("cacheName", settings => settings
           .WithJsonSerializer()
           .WithUpdateMode(CacheUpdateMode.Up)
           .WithRedisConfiguration("redis", config =>
                   {
                       //config.WithAllowAdmin()
                       //.WithDatabase(0)
                       config.WithEndpoint("Devgreen", 6379);
                   })
            //.WithExpiration(ExpirationMode.Absolute, TimeSpan.FromHours(29))
            );
        services.AddSingleton<ICacheManager<object>>(serviceProvider => cache);

What about a plugable value converter / serializer?

Is there a plan to make redis converter plugable, so we can change default implementation. Right now we're stuck with very inflexible and not very performant (both in speed and size) binary serializer. It's fine default, but adding redis support to existing project can be nightmare as you need to go over all project and mark all classes as serializable or create proxies that can be serialized if you don't own class(these are all runtime errors), while all this can be avoided using different or custom serializer.

Configuration for Logging

On initial startup using microsoft logging, I see the the redis connection information.
I would like to see the trace logic of the decision making when I addorupdate or get, but am not seeing it. Any suggestions?

Thanks

My project.json
"Microsoft.Extensions.Logging": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
"CacheManager.StackExchange.Redis": "0.8.0",
"CacheManager.Serialization.Json": "0.8.0",
"CacheManager.SystemRuntimeCaching": "0.8.0",
"CacheManager.Microsoft.Extensions.Configuration": "0.8.0-beta-1219",
"CacheManager.Microsoft.Extensions.Logging": "0.8.0-beta-1219"

my startup.cs

public void ConfigureServices(IServiceCollection services)
{

//https://github.com/MichaCo/CacheManager
var cache = CacheFactory.Build("cacheName", settings => settings
.WithMicrosoftLogging(f => f
.AddConsole(minLevel: LogLevel.Debug)
.AddDebug(minLevel: LogLevel.Debug)
)
.WithJsonSerializer()
.WithUpdateMode(CacheUpdateMode.Full)
.WithSystemRuntimeCacheHandle("inProcessCache") //use local cache and sync with redis
.And
.WithRedisConfiguration("redis", config =>
{
config.WithAllowAdmin()
.WithDatabase(0)
.WithEndpoint("redistest", 6379);
})
.WithMaxRetries(1000)
.WithRetryTimeout(100)
.WithRedisBackplane("redis")
.WithRedisCacheHandle("redis", true)
.WithExpiration(ExpirationMode.Sliding, TimeSpan.FromMinutes(30)) /allow 30 minutes unused cache before blast/
.EnableStatistics().EnablePerformanceCounters()
);
services.AddSingleton<ICacheManager>(serviceProvider => cache);
}

Possibility to use shared CacheManager instance in CacheManagerOutputCacheProvider and in MVC application?

Hi @MichaCo thanks for great caching impl but we have some problem.

In our application we used full page caching throught using OutputCacheAttribute (integration by CacheManager.Web) and use ICachingManager in application code.

And we have problem with invalidation (clearing) cache because in code we have different instance ICachingManager not such that used in CacheManagerOutputCacheProvider.
Can you suggest how to clear cache in both cache providers instances or how to share one CacheProvider instance between CacheManagerOutputCacheProvider and application code.

Thanks.

Implementing Dependencies

I am currently trying to implement keys dependencies using CacheManager. Until now I have just come up with 2 options, either doing so through cache layers using BlackPlate and the already implemented consistency or using regions somehow.

I think that in the current implementation of the library it is not possible to add new handles dynamically to a manager, you will have to create a new manager all together if you wanted new handles, which I think will not be adequate for the task at hand and even if we could add new handles dynamically I don't know if it will be efficient to have possibly 100+ handles.

In the regions way I suppose it will be possible to define a region called "dependencies" and then subscribe to the events defined in BaseCacheManager and check the "dependencies" region every time an operation is executed in a key but again I don't know if this will be efficient enough.

Is there another way of tackling this problem or am I missing something?

Upgrade to .NET Core 1.0

I had to go back to RC1 packages because of too many changes and instabilities during builds.

Whenever RC2 gets released, I will upgrade the solution again...

CacheManager should support Redis < 2.6

Hi. I'm using Redis4You hosted redis server. And the following configuration works fine. When the code comes to line Cache.Add("a", "b");, then it stucks there for an infinite time. When I monitor the Redis server I see the console with full of PING there. What is the problem here?

    static class Program
    {
        static readonly ICacheManager<string> Cache = CacheFactory.Build<string>("Test", cbcp =>
        {
            cbcp.WithSystemRuntimeCacheHandle("testCache")
                .And
                .WithRedisConfiguration("redis", rcb =>
                {
                    rcb.WithEndpoint("<XXX>", 1111)
                       .WithPassword("<YYY>")
                       .WithAllowAdmin()
                       .WithDatabase(1);
                })
                .WithMaxRetries(100)
                .WithRetryTimeout(10)
                .WithRedisBackPlate("redis")
                .WithRedisCacheHandle("redis", true);
        });
        static void Main(string[] args)
        {
            /* It stucks in the first line. */
            Cache.Add("a", "b");
            Console.ReadLine();
        }
    }

I debugged the code and the LuaScripts you've provided such as the one below causes an error:

local result=redis.call('HMSET', KEYS[1], 'value', ARGV[1], 'type', ARGV[2], 'expiration', ARGV[3], 'timeout', ARGV[4], 'created', ARGV[5])
if ARGV[3] ~= '0' and ARGV[4] ~= '0' then
    redis.call('PEXPIRE', KEYS[1], ARGV[4])
else
    redis.call('PERSIST', KEYS[1])
end
return result

The reason is the RedisCacheHandle class's void LoadScripts() method doesn't check the server.Features.Scripting; since Redis4You uses redis version 2.4 it's forbidden to use luascripts in the way you provided. You shall give support for v 2.4 too.

Add logging as opt-in feature

Add logging to Cache Manager in a way users can opt-in to use it and CacheManager.Core or any other package has hard dependencies on e.g. NLog or Common Logging directly...

Can I load configuration from a different file?

Hello, I would like to ask to create an instance of Cache Manager by configuration file(eg: cachemanager.config), but cachemanger.config in a configuration folder(eg:/Config/cachemanager.config), then ask you through
CacheFactory.FromConfiguration ("cacheName");
Can not create cachemanager instance, there will be an exception : No section defined with name cacheManager, how can I create an instance cachemanager ? ? ?
Thank you!

Redis backPlate doesn't work when configured from config file

Redis backPlate doesn't work when configured from config file.
I am using following configuration in web.config:

 <configSections>
    <section name="cacheManager" type="CacheManager.Core.Configuration.CacheManagerSection, CacheManager.Core" />
    <section name="cacheManager.Redis" type="CacheManager.Redis.RedisConfigurationSection, CacheManager.StackExchange.Redis" />
  </configSections>
  <cacheManager.Redis>
    <connections>
      <connection id="redis1" database="0" >
        <endpoints>
          <endpoint host="127.0.0.1" port="6379" />
        </endpoints>
      </connection>
    </connections>
  </cacheManager.Redis>

  <cacheManager xmlns="http://tempuri.org/CacheManagerCfg.xsd">
    <managers>
      <cache name="redisWithBackPlate" enableStatistics="false" backPlateName="redis1" backPlateType="CacheManager.StackExchange.Redis.RedisCacheBackPlate, CacheManager.StackExchange.Redis">
        <handle name="default" ref="runtimeHandle" />
        <handle name="redis1" ref="redisHandle" expirationMode="None" isBackPlateSource="true" />
      </cache>      
    </managers>
    <cacheHandles>
      <handleDef  id="runtimeHandle" type="CacheManager.SystemRuntimeCaching.MemoryCacheHandle`1, CacheManager.SystemRuntimeCaching" defaultExpirationMode="Sliding" defaultTimeout="5m"/>
      <handleDef  id="redisHandle"  type="CacheManager.Redis.RedisCacheHandle`1, CacheManager.StackExchange.Redis" defaultExpirationMode="Sliding" defaultTimeout="5m" />
    </cacheHandles>
  </cacheManager>

but after running two instances of application I see that variable Configuration.BackPlateType is set to null and backPlate doesn't work.

at the same time with following configuration in code it works perfectly.

  ICacheManager<object> cache = CacheFactory.Build<object>("myCache", settings =>
            {
                settings
                    .WithSystemRuntimeCacheHandle("inProcessCache")
                    .And
                    .WithRedisConfiguration("redis", config =>
                    {
                        config.WithAllowAdmin()
                            .WithDatabase(0)
                            .WithEndpoint("localhost", 6379);
                    })
                    .WithMaxRetries(1000)
                    .WithRetryTimeout(100)
                    .WithRedisBackPlate("redis")
                    .WithRedisCacheHandle("redis", true);
            });

Looks like a bug in config file parsing.

Thanks
Ihor

Update docs

  • new Update, TryUpdate signature
  • Logging added
  • Serialization added
  • new configuration path #43

System.UnauthorizedAccessException: Access to the registry key 'Global' is denied

With enabled performance counters in environments where the user running the app has not enough permissions to access the registry, this error System.UnauthorizedAccessException: Access to the registry key 'Global' is denied gets thrown.
PerformanceCounter impl in CacheManager should disable itself on any security exceptions during initialization and not throw them.

Support for Microsoft.Extensions.Configuration

Add support for the new .NET Core configuration extensions.
Add json schema for json based CacheManager configuration.

There is a lot of reflection based type loading required because the package shouldn't know about the other packages...

How to the CacheFactory support generic instance?

It is not convenient for each type to be registered.
In addition, do not support connection retry,For example, when the redis server is down to restart, the client should be able to reconnect to the server when requested

Configuring System.RuntimeCaching from App/Web config

I have noted that you can configure System.RuntimeCaching from the Json file using Microsoft.Extension (I think this feature is pretty cool, so first of all congrats on that one). I was checking out if you could do the same from web/app config and it seems that there is no way other than hard code the configuration for the System.RuntimeCaching in the code

CacheItem not serializing correctly

I am trying to set a cacheitem into the cache.
Since I had to inject the cache as an type object when I try to add cacheitem it complains that cant convert between ClientPrefernce and object. How could I convert or inject CacheManager to handle different complex types serialized with JSON? Am I missing something simple?

Thanks

startup.cs
var cache = CacheFactory.Build("cacheName", settings => settings
.WithJsonSerializer()
.WithUpdateMode(CacheUpdateMode.Up)
.WithSystemRuntimeCacheHandle("inProcessCache")
);
services.AddSingleton<ICacheManager>(serviceProvider => cache);

class
private readonly ICacheManager _cache;

public DoController(ICacheManager cache): base()
{
this._cache = cache;
}

function...
var item = new CacheItem(
cacheKeyLookup, preference, ExpirationMode.Absolute, TimeSpan.FromHours(29));
this._cache.Add(item);

Backplane type not found

in web.config i config the cache like this:




but when i runing the application the error take out:

Backplane type not found, CacheManager.Redis.RedisCacheBackplane, CacheManager.StackExchange.Redis.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: Backplane type not found, CacheManager.Redis.RedisCacheBackplane, CacheManager.StackExchange.Redis.

Memory Cache instance key

The MemoryCacheHandle.instanceKey field makes working with memory caches a bit painful. This essentially forces you to scope any memory cache instances as singletons. This becomes even more difficult when working with different typed caches. Is this scoping intentional? A workaround for multi-threading or multi-worker-process application pools maybe?

For example:

var cacheA = CacheFactory.FromConfiguration<string>("myConfig");
cacheA.Add("key", "value");

var cacheB = CacheFactory.FromConfiguration<string>("myConfig");
cacheB.Get("key"); // returns null

Infinite loop when trying to add a key to an slave node (Redis)

In my current setup I have one master node and two slaves (readonly), for the purpose of testing in the config file I just defined the endpoints of the slaves node. In this scenario when I try to add a key to the slave node CacheManager gets stuck trying to add the key (confirmed while monitoring the slave node). Also confirmed that StackExchange Redis raise an exception on this scenerio, so I suppose the problem is with the retry part implemented in the handle

the problem of the CacheUpdateMode

I have seen the source code. I found that when you call Get method,you then call AddToHandles method.if the cache does not exist in the second layer,it may add,but if I manual change the value of the cache in the second layer,when I call the Get method,It can not be updated.Is it is a error or your purpose?

Couchbase handle JArray support

issue added to track #51

I had an issue where I couldn't store arrays/collections straight into couchbase using the BucketCacheHandle resulting in an InvalidCastException when BaseCache uses GetCasted to return the expected type.
I've currently had to work around this by wrapping up all my cached items in another object so that the deserialisation happens as part of a child property deserialisation automatically when ToObject is called on a JObject value type.

Redis backplane optimizations

One problem in scenarios with a lot of writes per second is, that the message buffer on the redis server gets overwhelmed with messages pretty quickly and other clients cannot pick them up fast enough.

Current Tests show that adding a backplane doesn't really affect the numbers that much in scenarios where adds or updates are used frequently. But put is slightly different because I use fire and forget.

Local Redis
Numbers are for one local/single redis instance; cache is configured to use in memory and redis cache.

test without backplane with backplane messages sent per sec
AddOrUpdate and Gets (2 clients) 190,000 ops/s 180,000 ops/s 5000
RandomRW (2 clients) 40,000 ops/s 38,000 ops/s 500
AddThenGetAndUpdate (2 clients) 300,000 ops/s 260,000 ops/s 750
Put and Gets (2 clients) 3,500,000 ops/s 2,200,000 ops/s 55,000

Remote VM (3 node 12 instances cluster)
I'm using 3 VMs running on one server which has a 1Gbit connection to my local box.
The network doesn't seem to be the bottleneck, throughput is around 100 and 200MBit at full load.

test without backplane with backplane messages sent per sec
AddOrUpdate and Gets (2 clients) 39,000 ops/s 33,000 ops/s 840
RandomRW (2 clients) 6,000 ops/s 3,600 ops/s 100
AddThenGetAndUpdate (2 clients) 79,000 ops/s 76,000 ops/s 100
Put and Gets (2 clients) 2,400,000 ops/s 850,000 ops/s 25,000

Anyways, for any scenarios, sending every key update to all clients is very inefficient (100s of thousands of messages every second...).
Sending a few thousand messages every ~100ms in one round-trip should be much more efficient.

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.