Giter Site home page Giter Site logo

puppet-memcached's Introduction

memached module for Puppet

Build Status

Manage memcached via Puppet

Show some love

If you find this module useful, send some bitcoins to 1Na3YFUmdxKxJLiuRXQYJU2kiNqA3KY2j9

Supported Puppet versions

  • Puppet >= 5
  • Last version supporting Puppet 3: v3.0.2

How to use

Starting with version 3.0.0, memcached will be listening on 127.0.0.1 only.
This should make setups more secure (e.g. if there are no firewall rules in place).

For the old behaviour, you need to set listen to '0.0.0.0'.

Use roughly 90% of memory

    class { 'memcached': }

Set a fixed memory limit in MB

    class { 'memcached':
      max_memory => 2048
    }

Use 12% of available memory

    class { 'memcached':
      max_memory => '12%'
    }

Install multiple memcached instances

the multiinstance support uses a systemd instance unit file. This will be placed at /etc/systemd/system/[email protected]. It allows us to manage multiple instances via the same unit file. To start a simple instance, you only need to know the desired TCP port:

memcached::instance{'11222':}

that's it! It will bind to localhost and listen to TCP port 11222. You might want to tune the systemd limits, for example the number of file descriptors (LimitNOFILE) or the number of processes (LimitNPROC):

memcached::instance{'11222':
  limits => {
    'LimitNOFILE' => 8192,
    'LimitNPROC'  => 16384,
  }
}

All systemd limits are documented in the systemd documentation.

Another usecase. Let's assume your name is Eric and you want to change the actual memcached parameters, for example to bind it to every interface:

memcached::instance{'11222':
  override_content => "[Service]\nEnvironment='LISTEN=-l 0.0.0.0'",
}

Maybe Eric also wants to override the cache size (the unit is MB):

memcached::instance{'11222':
  override_content => "[Service]\nEnvironment=CACHESIZE=4096\n",
}

last but not least, Eric might also want to override the maximum amount of connections (the default is 1024):

memcached::instance{'11222':
  override_content => "[Service]\nEnvironment=MAXCONN=4096\n",
}

Now Eric wants to use all those three settings at the same time:

memcached::instance{'11222':
  override_content => "[Service]\nEnvironment=MAXCONN=4096\nEnvironment=CACHESIZE=4096\nEnvironment='LISTEN=-l 0.0.0.0'\n",
}

Instead of passing a long string with multiple \n, Eric can also put the content in a file and provide that:

memcached::instance{'11222':
  override_source => "${module_name}/memcached_11222_override.conf\n",
}

Other class parameters

  • $package_ensure = 'present'
  • $logfile = '/var/log/memcached.log'
  • $logstdout = false (Set this to true to disable logging to a file/syslog entirely, useful when memcached runs in containers)
  • $pidfile = '/var/run/memcached.pid' (Debian family only, set to false to disable pidfile)
  • $max_memory = false
  • $max_item_size = false
  • $min_item_size = false
  • $factor = false
  • $lock_memory = false (WARNING: good if used intelligently, google for -k key)
  • $listen = '127.0.0.1' (if TLS/SSL is enabled, 'notls' prefix can be used to disable for specific listeners "notls::")
  • $listen_ip = '127.0.0.1' (deprecated, listen will take precedence over this)
  • $tcp_port = 11211
  • $udp_port = 0
  • $manage_firewall = false
  • $user = '' (OS specific setting, see params.pp)
  • $max_connections = 8192
  • $verbosity = undef
  • $unix_socket = undef
  • $install_dev = false (TRUE if 'libmemcached-dev' package should be installed)
  • $processorcount = $::processorcount
  • $service_restart = true (restart service after configuration changes, false to prevent restarts)
  • $use_sasl = false (start memcached with SASL support)
  • $use_tls = false (start memcached with TLS support)
  • $tls_cert_chain = undef
  • $tls_key = undef
  • $tls_ca_cert = undef
  • $tls_verify_mode = 1 (0: None, 1: Request, 2: Require, 3: Once)
  • $large_mem_pages = false (try to use large memory pages)

puppet-memcached's People

Contributors

acceso avatar anesterova avatar bastelfreak avatar bgrolleman avatar blkperl avatar cubiclelord avatar derekhiggins avatar fcharlier avatar fizmat avatar garex avatar ghoneycutt avatar globin avatar gloppasglop avatar jaormx avatar jonasdemoor avatar kajinamit avatar mikemarseglia avatar mmarseglia avatar moisesguimaraes avatar obi11235 avatar pgl-az avatar riton avatar s10 avatar saz avatar sethlyons avatar siebrand avatar spredzy avatar thtomate avatar toggetit avatar traylenator 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

puppet-memcached's Issues

Disabling pidfile not possible

Hi,

the README says to set pidfile to false if I don't want the "-P" setting in memcached.conf.

Unfortunately init.pp only allows Stdlib::Absolutepath or Undef. No boolean allowed, so setting the parameter to "false" results in an error. Setting the parameter to "undef" doesn't work either, because in that case the default value takes over.

# Parameter in init.pp
  Variant[Stdlib::Absolutepath, Undef] $pidfile = '/var/run/memcached.pid',

# memcached.conf.erb
  <% if @pidfile -%>
  # pidfile
  -P <%= @pidfile %>
  <% end -%>

Tested the following combinations:

class { 'memcached':
    pidfile         => '',
    ...
}

Result:
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Class[Memcached]: parameter 'pidfile' expects a Stdlib::Absolutepath = Variant[Stdlib::Windowspath = Pattern[/\A(([a-zA-Z]:[\\\/])|([\\\/][\\\/][^\\\/]+[\\\/][^\\\/]+)|([\\\/][\\\/]\?[\\\/][^\\\/]+)).*\z/], Stdlib::Unixpath = Pattern[/\A\/([^\n\/\0]+\/*)*\z/]] value, got String (file: /opt/puppetlabs/code/environments/****/modules/profiles/manifests/****.pp, line: 175, column: 5) on node ****

class { 'memcached':
    pidfile         => false,
    ...
}

Result:
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Class[Memcached]: parameter 'pidfile' expects a Stdlib::Absolutepath = Variant[Stdlib::Windowspath = Pattern[/\A(([a-zA-Z]:[\\\/])|([\\\/][\\\/][^\\\/]+[\\\/][^\\\/]+)|([\\\/][\\\/]\?[\\\/][^\\\/]+)).*\z/], Stdlib::Unixpath = Pattern[/\A\/([^\n\/\0]+\/*)*\z/]] value, got Boolean (file: /opt/puppetlabs/code/environments/****/modules/profiles/manifests/****.pp, line: 175, column: 5) on node ****

class { 'memcached':
    pidfile         => undef,
    ...
}

Result: the default value (/var/run/memcached.pid) is written to the config file.

Any ideas how to fix this?

Upstream release with Puppet 8 support?

Puppet 8 is released for quite a while now and in default configuration the legacy facts are not available anymore (in both opensource puppet and in PE).

A trivial fix is available in #151. Any chance to get that fix upstream?

Error while evaluating a Function Call, Failed to parse template memcached/memcached_sysconfig.erb (Version 3.7.0)

Hi,

after using Version 3.7.0 of this module with Puppet6 on RHEL8 I get the below error:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Function Call, Failed to parse template memcached/memcached_sysconfig.erb:
  Filepath: org/jruby/RubyString.java
  Line: 1179
  Detail: no implicit conversion of Integer into String
 (file: /etc/puppetlabs/code/environments/uat/modules/memcached/manifests/init.pp, line: 39, column: 16) on node test.exaple.org

Thanks
Kristian

Upstart service installation error

Ubuntu 14.04 Trusty

Error: /Stage[main]/Memcached/Service[memcached]: Could not evaluate: private method 'getpid' called for Service[memcached](provider=upstart):Puppet::Type::Service::ProviderUpstart Error: /Stage[main]/Memcached/Service[memcached]: Failed to call refresh: private method 'getpid' called for Service[memcached](provider=upstart):Puppet::Type::Service::ProviderUpstart Error: /Stage[main]/Memcached/Service[memcached]: private method getpid' called for Servicememcached:Puppet::Type::Service::ProviderUpstart`

$max_memory parameter is not a boolean

$max_memory is initially defined as a boolean, with an initial "false" value.

It would have to be initialized with a non bolean value, for example "64".

If puppet-memcached module is used in Foreman (www.theforeman.org) then max_memory is considered a Boolean, only admits True/False values, and this value cannot be changed using a number.

Add support for item size limit

It would be awesome if you could support adding the -I 5m to the memcached config.
Where the 5m is configurable to anything: 1m, 100k, or the max limit 128m per item

svcprop template has trailing newline

The svcprop template has a trailing newline and this means the svcprop module considers the content to have changed every time it runs, leading to the memcached service being refreshed continuously:

Debug: svcprop:value is "-m" "2048" "-l" "0.0.0.0" "-p" "11211" "-U" "11211" "-u" "nobody" "-c" "8192" "-t" "32"

Debug: svcprop return value is '"-m" "2048" "-l" "0.0.0.0" "-p" "11211" "-U" "11211" "-u" "nobody" "-c" "8192" "-t" "32"'

A simple change to chomp trailing whitespace fixes this.

No LICENSE file

This project doesn't appear to have any documentation about the license it's released under. I'd like to use it at my work, but we require explicit licensing before we can use any code. Can you please add a LICENSE file or otherwise make clear under what license this code is available?

Set additional memcached options

Here is a process that was started.

492 23453 1 0 16:08 ? 00:00:00 memcached -d -p 11211 -u memcached -m 512 -c 2048 -P /var/run/memcached/memcached.pid -t 1

How can we change or eliminate the -t 1 option and also how can we add other options to run? We use the -I option, which specifies the maximum size permitted for storing an object within the memcached instance. The size supports a unit postfix (k for kilobytes, m for megabytes). For example, to increase the maximum supported object size to 32MB:

https://docs.oracle.com/cd/E17952_01/refman-5.0-en/ha-memcached-using.html

Please advise. Thanks

allow create multiple instance

We run multiple memcached daemon in one node. we want to create it with this module, but cannot.

class { 'memcached':
    listen_ip => "0.0.0.0",
    tcp_port => 11211,
    udp_port => 0,
    max_connections => 30000,
    max_memory => 1024,
    pidfile => "/var/run/memcached/main.pid",
}
class { 'memcached':
    listen_ip => "0.0.0.0",
    tcp_port => 11212,
    udp_port => 0,
    max_connections => 8192,
    max_memory => 128,
    pidfile => "/var/run/memcached/session.pid",
}

Error on package removal with package_ensure set to absent

On Scientific Linux 6.x, steps to reproduce

[root@ccosvm0839 modules]# puppet module install saz-memcached
Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ saz-memcached (v2.5.0)
  ├── puppetlabs-firewall (v1.1.3)
  └── puppetlabs-stdlib (v4.1.0)

Install memcache with the module

# cat /root/Sources/test_memcached.pp
class { 'memcached': 
    package_ensure  => 'present'
}
# puppet apply /root/Sources/test_memcached.pp                                                                                                                                                                        
Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera defaults
Notice: Compiled catalog for ccosvm0839.in2p3.fr in environment production in 0.82 seconds
Notice: /Stage[main]/Memcached/Package[memcached]/ensure: created
Notice: /Stage[main]/Memcached/Service[memcached]/ensure: ensure changed 'stopped' to 'running'
Notice: Finished catalog run in 10.81 seconds
  1. Try to uninstall memcache with the module
# cat /root/Sources/test_memcached.pp
class { 'memcached': 
    package_ensure  => 'absent'
}
# puppet apply /root/Sources/test_memcached.pp
Notice: /Stage[main]/Memcached/Package[memcached]/ensure: removed
Notice: /Stage[main]/Memcached/File[/etc/sysconfig/memcached]/ensure: defined content as '{md5}49989b2e6ba170dca79c441f6f072f7c'
Error: Could not enable memcached: Execution of '/sbin/chkconfig memcached on' returned 1: error reading information on service memcached: No such file or directory
Error: /Stage[main]/Memcached/Service[memcached]/enable: change from false to true failed: Could not enable memcached: Execution of '/sbin/chkconfig memcached on' returned 1: error reading information on service memcached: No such file or directory
Notice: /Stage[main]/Memcached/Service[memcached]: Triggered 'refresh' from 1 events
Notice: Finished catalog run in 2.08 seconds

Not a critical bug; the final result is what is expected: "memcache is uninstalled" but it still raises an error.

No changelog available

We're currently using 3.0.2 of this module, and we'd like to update it to a newer version.
The lack of a changelog makes this process more complex than needed.

Can you add a Changelog to this project? If possible with the historic data

Changelog?

Hi, how come there is no changelog in Puppet Forge and here at all?
I'm using the 2.8.1 so I want to find out what happened in the three updates released afterwards.

Any chance of a release soon?

Hi,

Are you planning a release any time soon?

We're using 1.8.0 of the firewall module which uses dport/sport instead of port. You've already got the change in b1ba9fa - would be nice to have it in a tagged release :)

Thanks,

R.

CentOS 7 unix_socket does nothing

Checked generated /etc/sysconfig/memcached and OPTIONS still looks like this:
OPTIONS="-l 0.0.0.0 -U 11211 -t 4 >> /var/log/memcached.log 2>&1"

Other options like memory size working correct and is there.

Looked at module source and templates/memcached_sysconfig.erb does not even contain/use the unix_socket variable.

Default user on debian to "memcache"

A Debian/stretch memcached package installation would install a configuration file with -u memcache, so probably the puppet module should also set $user = 'memcache' on Debian systems.

Deprecation warning is shown by default

Currently the following deprecation warning is set unless memcached::listen is explicitly set.

Scope(Class[Memcached]) (warning): memcached::listen_ip is deprecated in favor of memcached::listen

This is not really useful in case a user wants to the default value(127.0.0.1).
IMO we should not show that warning "unless the listen_ip parameter is explicitly used"

Support multiple memcache instances

It would be great to have support for multiple memcache instances on a single box.

If you're open to pull requests I'd be happy to contribute once we have this support built on top of your module. I plan to work on this shortly.

memcached.log : "Could not open the pid file /var/run/memcached.pid for writing: Permission denied"

Is anyone else seeing this?

I'm running Memcached on Ubuntu server and the /etc/init.d/memcached script creates the PID file using root:root as owner.

In the memcached.conf file generated by this puppet module, a PID file is specified and an attempt to create the PID file fails because the default user 'nobody' on Ubuntu cannot create the file (given that the init.d script already created it with owner root).

If I comment out line seven referring to the PID file in https://github.com/saz/puppet-memcached/blob/master/templates/memcached.conf.erb

Then no errors are generated and memcached daemonizes cleanly and without warnings.

If I do not comment out line seven then the log file ends up filling with statements like this every time the process status is changed:

WARNING: The pid file contained the following (running) pid: 20738
Could not open the pid file /var/run/memcached.pid for writing: Permission denied
WARNING: The pid file contained the following (running) pid: 22334
Could not open the pid file /var/run/memcached.pid for writing: Permission denied
WARNING: The pid file contained the following (running) pid: 24377
Could not open the pid file /var/run/memcached.pid for writing: Permission denied
WARNING: The pid file contained the following (running) pid: 2541
Could not open the pid file /var/run/memcached.pid for writing: Permission denied
WARNING: The pid file contained the following (running) pid: 6287
Could not open the pid file /var/run/memcached.pid for writing: Permission denied

If this is just me, I'll comment it out locally. If this affects everyone using this module, on Red Hat as well as Ubuntu, then maybe line 7 should be removed from the config.

3.0.0 contains an additional colon typo in memcached_max_memory.rb

Output:

$ vagrant provision --provision-with puppet
==> default: Running provisioner: puppet...
==> default: Running Puppet with vagrant-manifest.pp...
==> default: Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera defaults
==> default: Error: Could not autoload puppet/parser/functions/memcached_max_memory: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:2: syntax error, unexpected ':', expecting ')'
==> default:   newfunction(:memcached_max_memory, type: :rvalue, doc: <<-EOS
==> default:                                           ^
==> default: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:5: syntax error, unexpected ')', expecting kEND
==> default:   ) do |arguments|
==> default:    ^
==> default: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:39: syntax error, unexpected kEND, expecting $end
==> default: Error: Failed to parse template memcached/memcached_sysconfig.erb:
==> default:   Filepath: /usr/lib/ruby/site_ruby/1.8/puppet/util/autoload.rb
==> default:   Line: 68
==> default:   Detail: Could not autoload puppet/parser/functions/memcached_max_memory: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:2: syntax error, unexpected ':', expecting ')'
==> default:   newfunction(:memcached_max_memory, type: :rvalue, doc: <<-EOS
==> default:                                           ^
==> default: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:5: syntax error, unexpected ')', expecting kEND
==> default:   ) do |arguments|
==> default:    ^
==> default: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:39: syntax error, unexpected kEND, expecting $end
==> default:  at /etc/puppet/modules/memcached/manifests/init.pp:107 on node hello.domain.com
==> default: Error: Failed to parse template memcached/memcached_sysconfig.erb:
==> default:   Filepath: /usr/lib/ruby/site_ruby/1.8/puppet/util/autoload.rb
==> default:   Line: 68
==> default:   Detail: Could not autoload puppet/parser/functions/memcached_max_memory: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:2: syntax error, unexpected ':', expecting ')'
==> default:   newfunction(:memcached_max_memory, type: :rvalue, doc: <<-EOS
==> default:                                           ^
==> default: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:5: syntax error, unexpected ')', expecting kEND
==> default:   ) do |arguments|
==> default:    ^
==> default: /etc/puppet/modules/memcached/lib/puppet/parser/functions/memcached_max_memory.rb:39: syntax error, unexpected kEND, expecting $end
==> default:  at /etc/puppet/modules/memcached/manifests/init.pp:107 on node hello.domain.com

Migration to Vox Pupuli?

Hi @saz. Vox Pupuli is a collective of puppet module authors who take care of a lot of modules: https://forge.puppet.com/puppet?utf-8=%E2%9C%93&sort=downloads

Are you interested in migrating your modules into their namespace? You can still keep write access to the repos, but it would allow others to help out with code reviews and releases. They also put a lot of effort into templates for modules. They have well maintained Gemfiles that work under all needed ruby and puppet versions, working changelog generator, common pattern for unit/acceptance tests .

Default pidfile on Ubuntu misplaced

Hello!
I found that default pidfile location is /var/run/memcached.pid, but there is some issues with it on Ubuntu:

root@ost-m03-v:~# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS"
  1. Service cannot create PID file in this location with default 'nobody' (Ubuntu) user because of default permissions for /var/run (/run) is 644
root@ost-m03-v:~# systemctl status memcached.service 
● memcached.service - memcached daemon
     Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-04-10 15:19:32 MSK; 58s ago
       Docs: man:memcached(1)
   Main PID: 1623154 (memcached)
      Tasks: 12 (limit: 9388)
     Memory: 10.4M
        CPU: 112ms
     CGroup: /system.slice/memcached.service
             └─1623154 /usr/bin/memcached -P /var/run/memcached.pid -m 793 -l X.X.X.X -p 11211 -U 0 -u nobody -c 8192 -t 6
Apr 10 15:19:32 ost-m03-v systemd[1]: Started memcached daemon.
Apr 10 15:19:32 ost-m03-v systemd-memcached-wrapper[1623154]: Could not open the pid file /var/run/memcached.pid.tmp for writing: Permission denied

root@ost-m03-v:~# ls -lh / | grep run
drwxr-xr-x  47 root root 1.3K Apr 10 15:35 run
  1. But official memcached deb-package from Ubuntu repos creates special PID directory /var/run/memcached with permissions for internal (built-in in package) service user (memcache). Please see #105
root@ost-m03-v:~# ls -lh /run/ | grep memcache
drwxr-xr-x  2 memcache  memcache    60 Apr 10 15:35 memcached

So for correct work on Ubuntu (minimum) we need to:

  1. Change default pidfile to /var/run/memcached/memcached.pid
  2. Change run as user from nobody to memcache

package_ensure: absent will assume the memcached user exists

For at least CentOS7, In the case that you specify the memcached package_ensure as absent, this module will still attempt to set ownership of the log files to the memcached user. However, the installation of the memcached package is what creates the memcached user. This results in the module throwing an error as it attempts to set the log file permissions to a user that doesn't exist.

Single-instance config not working

Hello :)

after merging of #54 , Puppet run in the TripleO [1](an OpenStack installer) fails [2] with this message:

Error: Could not start Service[memcached_11211]: Execution of '/sbin/service memcached_11211 start' returned 6: Starting memcached_11211 (via systemctl):  Failed to start memcached_11211.service: Unit memcached_11211.service failed to load: No such file or directory.

We only include the class via include ::memcached [3] and set the listen_ip parameter via hiera:

[root@ov-xxpg5ugstxz-0-pka54d6w3ryz-controller-ssjphxhoikxj hieradata]# pwd
/etc/puppet/hieradata
[root@ov-xxpg5ugstxz-0-pka54d6w3ryz-controller-ssjphxhoikxj hieradata]# grep -ri memcached
controller.yaml:memcached::listen_ip: 192.0.2.19

I think by default puppet should use the service init file which is shipped in distro's packages, instead of writing it's own. We're probably not the only ones broken by this and probably also not the only ones who consider writing custom service init files an anti pattern unless there's no other choice. Should the default behavior be restored to a state which is more resembling of how it was before merging #54 ?

[1] https://wiki.openstack.org/wiki/TripleO
[2] https://bugs.launchpad.net/tripleo/+bug/1458520
[3] https://github.com/openstack/tripleo-heat-templates/blob/631b1afee180317e4eca5980e82238265f1a7049/puppet/manifests/overcloud_controller_pacemaker.pp#L358

Default `listen_ip`

Hi,

The default value of $listen_ip will let memcached bind to all IP's (0.0.0.0). When the machine has an interface connected to the internet, this would allow anyone to connect to that instance, request/add/change/remove keys, etc.

I think a better and safer default would be to bind to 127.0.0.1, unless another IP address is specified through the class parameters.

Kind regards,
Cedric Dubois

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.