GithubHelp home page GithubHelp logo

voxpupuli / puppet-cvmfs Goto Github PK

View Code? Open in Web Editor NEW
9.0 40.0 35.0 635 KB

Puppet module for cvmfs

License: Apache License 2.0

Shell 0.69% Ruby 49.11% Puppet 50.20%
hacktoberfest centos-puppet-module debian-puppet-module linux-puppet-module puppet redhat-puppet-module scientific-puppet-module ubuntu-puppet-module

puppet-cvmfs's Introduction

Puppet Forge

puppet-cvmfs

This cvmfs module is designed to install, enable and configure CvmFS clients.

For general details on CvmFS see http://cernvm.cern.ch/portal/filesystem

This module obsoletes CERNOps-cvmfs-7.3.0

Custom Facts

The module include one customfact

  • cvmfspartsize returns the size in megabytes of partition that contains the CVMFS_CACHE_BASE.

Client Configuration

To configure a cvmfs client to mount cvmfs repository with the default autofs.

class{"cvmfs":
  cvmfs_http_proxy  => 'http://ca-proxy.example.org:3128',
  cvmfs_quota_limit => 100
}
cvmfs::mount{'files.example.org:
  cvmfs_server_url  => 'http://web.example.org/cvmfs/files.example.org',
}

To configure a cvmfs client to mount a domain of repositories with autofs.

class{"cvmfs":
  cvmfs_http_proxy  => 'http://ca-proxy.example.org:3128',
  cvmfs_quota_limit => 100,
}

cvmfs::domain{'example.net'
  cvmfs_server_url   => 'http://web.example.org/cvmfs/@fqrn@'
}

To use puppet's mount type rather that autofs a typical configuration might be the following. This example configures a cvmfs domain for common settings, a configuration repository and finally a particular repository for mount. In this example the cvmfs-config.example.org has been marked as the per client configuration repository and will always be mounted first.

class{'cvmfs':
  mount_method => 'mount',
  config_repo  => 'cvmfs-config.example.org',
}
cvmfs::domain{'example.org':
  cvmfs_server_url   => 'http://web.example.org/cvmfs/@fqrn@'
}
cvmfs::mount{'cvmfs-config.example.org':
  require => Cvmfs::Domain['example.org'],
}
cvmfs::mount{'myrepo.example.org':
  require => Cvmfs::Domain['example.org'],
}

Parameters to Cvmfs Class

See REFERENCE.md

Cvmfs::Mount Type

To mount individual repositories optionally with a particular configuration on each repository. e.g

cvmfs::mount{'lhcb.example.org':
}
cvmfs::mount{'atlas.example.org':
  cvmfs_timeout => 50
}
cvmfs::mount{'cms.example.org':
  cvmfs_timeout    => 100,
  cvmfs_server_url => 'http://web.example.org/cms.cern.ch'
}

Cvmfs::Mount Type Parameters

See REFERENCE.md

Cvmfs::Domain Type

A cvmfs domain file can be created with the cvmfs::domain type

cvmfs::domain{'example.org':
     cvmfs_server_url => 'http://host1.example.org/@repo@;http://host2.example2.org/@repo@',
     cvmfs_public_key => '/etc/cvmfs/keys/key1.pub,/etc/cvmfs/keys/key2.pub'
}

Cvmfs::Domain Type Parameters

See REFERENCE.md

Managing cvmfs fsck

The optional class 'cvmfs::fsck' can be included to enable a cron job to regualarly run fsck on cvmfs systems.

class{'cvmfs':
   cvmfs_fsck => true,
   cvmfs_fsck_options  => '-p',
   cvmfs_fsck_onreboot => true
}

In addition a cron will be created to purge quarentine corrupted files after 30 days.

Fsck Options

See REFERENCE.md and the CVMFS documentation.

License

Apache II License for all files except automaster.aug which is copied from the http://augeas.net project. The automaster.aug file is LGPL v2+.

Contact

Steve Traylen [email protected]

Support

https://github.com/voxpupuli/puppet-cvmfs

puppet-cvmfs's People

Contributors

arbreezy avatar bastelfreak avatar deesto avatar dvanders avatar ebocchi avatar fmelaccio avatar fschaer avatar ghoneycutt avatar gwarf avatar jblomer avatar jcpunk avatar kenyon avatar kreczko avatar maxadamo avatar mboisson avatar olifre avatar rwf14f avatar smortex avatar sorrison avatar takadonet avatar traylenator avatar trevor-vaughan avatar vokac avatar xandm avatar zilchms avatar

Stargazers

 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

puppet-cvmfs's Issues

Drop autofs lens

We can drop the auges lens for autofs since even on sl5 augeas > 0.10.0 so the built in lens is fine.

Strange set of options for tmpwatch

In manifests/fsck.pp, I find:

/usr/sbin/tmpwatch -umc -f 30d ${cvmfs_cache_base}/shared/quarantaine

Reading the manpage:

param meaning
-u Make the decision about deleting a file based on the file's atime (default)
-m Make the decision about deleting a file based on the file's mtime instead of the atime.
-c Make the decision about deleting a file based on the file's ctime instead of the atime; for directories, make the decision based on the mtime.

I.e. u, m and c exclude each other - or rather, the last one will win.
Is this what is wanted here?

Configuration never taking place

I'm using this module (on the CERN OpenStack infrastructure) with:

include('cvmfs')
include('cvmfs::fsck')
cvmfs::mount{['grid.cern.ch']:}

However, no matter how many time I run puppet agent --test I always get the following:

Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for ganga-ci.cern.ch
Info: Applying configuration version '1454437217'
Notice: cvmfs has not been configured, one more puppet run required.
Notice: /Stage[main]/Cvmfs/Notify[cvmfs has not been configured, one more puppet run required.]/message: defined 'message' as 'cvmfs has not been configured, one more puppet run required.'
Notice: Finished catalog run in 44.01 seconds

So far I have run it about 10 times and the configuration has still not taken.

I guess this is because the custom facts have not been installed? Should they show up with:

facter | grep cvmfs

because at the moment, that returns nothing.

The custom fact file seems to have been installed:

# cat /etc/cvmfs/cvmfsfacts.yaml

---
#This file generated by puppet and is used by custom facts only.
cvmfs_cache_base: /var/lib/cvmfs

and /var/lib/cvmfs exists and is owned by cvmfs:cvmfs.

How best to start debugging this?

module with 'domain' settings?

It would be helpful for many sites to be able configure a CVMFS domain using a puppet module.
Any chances for a cvmfs::domain.pp that would maintain a .conf file in /etc/cvmfs/domain.d/ ?

Thanks,
Catalin

coveralls.io support?

With the increase in tests with the zerotype branch, it might be worth adding coveralls.io hooks to locate under tested code.

autofs management is all or nothing

I've a node which uses autofs for several file systems. I'd like to add CVMFS to that list, but not have it manage Service['autofs'].

Can this be made conditional?

hiera('key',undef) Incompatible with future parser.

With puppet's furture parser enabled this module fails:

Evaluation Error: Error while evaluating a Function Call, Could not find data item cvmfs_timeout in any Hiera data file and no default supplied at /home/travis/build/cvmfs/puppet-cvmfs/spec/fixtures/modules/cvmfs/manifests/params.pp:40:29

These are the following contructs in the params.pp

$cvmfs_timeout          = hiera('cvmfs_timeout',undef)

These are all unnecessary now with hiera data bindings being the preferred way to use hiera.
Probably these should be deprecated.

cvmfspartsize fact should be an Integer

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 5.5.22
  • Facter: 3.11.14
  • Distribution: Scientific Linux 7.9
  • Module version: 7.3.0

What are you seeing

Warnings logged by the puppetserver process, e.g.

2021-03-24 00:04:33,855 WARN [qtp868931630-68188] [puppetserver] Puppet The string '98204' was automatically coerced to the numerical value 98204 (file: /etc/puppetlabs/code/environments/production/modules/cvmfs/manifests/config.pp, line: 36, column: 75)

What behaviour did you expect instead

No warnings.

Any additional information you'd like to impart

Just cast to integer when the final number is found in the fact.

Facter::Util::Resolution.exec("/bin/df -m -P #{directory}").split("\n").last.split(%r{\s+})[1].to_i

How to include CMS_LOCAL_SITE

Dear all,

I am trying to include the line
export CMS_LOCAL_SITE=/opt/cvmfs/cms.cern.ch/SITECONF/local
into /etc/cvmfs/config.d/cms.cern.ch.local
This variable is crucial for production as it creates the symbolic link
/cvmfs/cms.cern.ch/SITECONF/local -> /opt/cvmfs/cms.cern.ch/SITECONF/local

However, mount (https://github.com/cvmfs/puppet-cvmfs/blob/master/manifests/mount.pp) and the corresponding template (https://github.com/cvmfs/puppet-cvmfs/blob/master/templates/repo.local.erb) don't have the functionality.

Currently I want to implement it by adding a parameter env_variables to mount:


What do you think? Is there a better way?

cvmfs::one::install does not inherit any params.

# included once from the cvmfs::one defined type.
 class cvmfs::one::install (
   $cvmfs_version = $::cvmfs::params::cvmfs_version

 ) {
 ) inherits cvmfs::params {
   class{'::cvmfs::server::yum':}

   package{'cvmfs-server':

Facter error if cvmfs has never been mounted

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 7.17.0
  • Ruby: ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-linux]
  • Distribution: Ubuntu 20.04
  • Module version: 8.1.0

How to reproduce (e.g Puppet code you use)\

Any use of module, without mounting cvmfs.

What are you seeing

Error message appears when /etc/cvmfs/cvmfsfacts.yaml has been created but cvmfs never mounted.

What behaviour did you expect instead

No error message should appear.

Output log

2022-06-24 18:01:24 erc-hpc-comp001 INFO puppet-agent[3377379]: Using environment 'production'
2022-06-24 18:01:24 erc-hpc-comp001 INFO puppet-agent[3377379]: Retrieving pluginfacts
2022-06-24 18:01:24 erc-hpc-comp001 INFO puppet-agent[3377379]: Retrieving plugin
2022-06-24 18:01:25 erc-hpc-comp001 INFO puppet-agent[3377379]: Loading facts
2022-06-24 18:01:29 erc-hpc-comp001 ERR puppet-agent[3377379]: (Facter) Error while resolving custom fact fact='cvmfspartsize', resolution='<anonymous>': undefined method `split' for nil:NilClass

Any additional information you'd like to impart

PR for fix to follow.

few typos

config.pp line 28
$major_release = $cvmfs::parmas::major_release,

$major_release = $cvmfs::params::major_release,

install.pp line 26
$default_cvmfs_cache_base = $default_cvmfs::params::cvmfs_cache_base

$default_cvmfs_cache_base = $cvmfs::params::default_cvmfs_cache_base

v0.4.3 unable to resolve dependency 'erwbgy-limits' (>=1.0.0)

$ puppet module install CERNOps-cvmfs
Preparing to install into /home/jcpunk/.puppet/modules ...
Downloading from http://forge.puppetlabs.com ...
Error: Could not install module 'CERNOps-cvmfs' (latest: v0.4.3)
No version of 'erwbgy-limits' will satisfy dependencies
'CERNOps-cvmfs' (v0.4.3) requires 'erwbgy-limits' (>=1.0.0)
Use puppet module install --ignore-dependencies to install only this module

https://forge.puppetlabs.com/erwbgy/limits shows latest version is 0.3.1

cvmfs-fsck.timer ist not enabled

After rebooting a client machine, I find in the first Puppet run:

Notice: /Stage[main]/Cvmfs::Fsck/Systemd::Unit_file[cvmfs-fsck.timer]/Service[cvmfs-fsck.timer]/ensure: ensure changed 'stopped' to 'running' (corrective)
Info: /Stage[main]/Cvmfs::Fsck/Systemd::Unit_file[cvmfs-fsck.timer]/Service[cvmfs-fsck.timer]: Unscheduling refresh on Service[cvmfs-fsck.timer]

It seems the cvmfs-fsck.timer is deployed, but not enabled, so Puppet needs to re-activate it after each machine reboot.

Should we also add enable => true here?
https://github.com/cvmfs/puppet-cvmfs/blob/ca6eb1588ffd18c4fb01aad9866662cd4a19f5ab/manifests/fsck.pp#L19-L26

Support fstab entry for cvmfs mounts.

For various reasons it is sometimes desirable to persistently mount a cvmfs repository via
a /etc/fstab entry.

This module already supports disabling of autofs with

---
cvmfs::config_automaster: false
cvmfs::manage_autofs_service: false

Propose to allow.

cvmfs::mount{'a.example.org':
   fstab => true,
   fstab_options => ....
}

where fstab_options defaults to something sensible and fstab defaults to false
to maintain backward compatibility. Inside the type it will declare a puppet mount type.

Drop cvmfs 2.0 support

This allows us to drop the cvmfsversion fact and mechanism resulting in one less puppet run also.

non-existent option CVMFS_FORCE_SIGNING is set automatically

It seems the puppet module sets CVMFS_FORCE_SIGNING='yes'.
I don't see that coming from anywhere in our config so the CVMFS puppet module seems to be doing it automatically.

This does not appear to be a documented or supported option of the CVMFS client. If it ever existed, it does not anymore. With the setting in the config file, you can see that it is not recognized:
cvmfs_config showconfig | grep CVMFS_FORCE_SIGNING

So I would think that anything related to CVMFS_FORCE_SIGNING should be removed from the Puppet module.

Configuration repositories should be mounted first

When cvmfs repositories are mounted through /etc/fstab entries, the configuration repository should be mounted first:
https://cvmfs.readthedocs.io/en/stable/cpt-configure.html#:~:text=If%20a%20configuration,mounts.%20For%20example%3A

Currently one has to manually patch each non-config repository like this

cvmfs::mount_method: mount
cvmfs::manage_autofs_service: false

cvmfs::cvmfs_hash:
  cvmfs-config.cern.ch:
    {}
  atlas.cern.ch:
    { options => 'defaults,_netdev,nodev,x-systemd.requires-mounts-for=/cvmfs/cvmfs-config.cern.ch', }
  atlas-nightlies.cern.ch:
    { options => 'defaults,_netdev,nodev,x-systemd.requires-mounts-for=/cvmfs/cvmfs-config.cern.ch', }
  # [...]

but it would be preferable to have the module do this automatically. Perhaps only requiring the user to specify which of the entries that is the config-repository.

Update stdlib required version

  • Puppet: any
  • Ruby: any
  • Distribution: any
  • Module version: 8.0.0

How to reproduce (e.g Puppet code you use)

include cvmfs

What are you seeing

Error: Resource type not found: Stdlib::Yes_no (file: /etc/puppetlabs/code/environments/puppet6/modules/cvmfs/templates/repo.local.epp, line: 10, column: 12) on node alice-sl7b-kit.gridka.de

What behaviour did you expect instead

No error.

Any additional information you'd like to impart

The requirements for module version 8.0.0 are inaccurate: In order to be able to use the Stdlib::Yes_no data type the version of the stdlib module must be at least 6.1.0, not ">=4.13.1 < 7.0.0" as written in metadata.json.

Catalog timeouts mismatched with CVMFS default

As of:
942b207
catalog timeouts are now set to 30 s.
However, checking upstream code:
https://github.com/cvmfs/cvmfs/blob/bfceb7b8fa4a98e27c0409fffe33987e42642478/cvmfs/server/cvmfs_server_apache.sh#L279
and also what a fresh install creates, I see:

    # 60 seconds and below is not cached at all by Squid default settings
    ExpiresByType application/x-cvmfs "access plus 61 seconds"
    ExpiresByType application/json    "access plus 61 seconds"

so this new default of 30 s seems to mismatch upstream and be a bad idea for default squid configurations.

cvmfs_server_url deprecation warning issues out of the box

This:

  if $cvmfs_server_url {
    warning('The $cvmfs_server_url to cvmfs is deprecated, please set this value per mount or per domain.')
  }

is shown out of the box, even if $cvmfs_server_url is not set at all, the warning is just hidden in the puppetserver logs.

Reason: params.pp contains:

  $_cvmfs_server_url       = hiera('cvmfs_server_url',false)
  if $_cvmfs_server_url {
    notify{'Setting cvmfs_server_url as a hiera variable is deprecated, use cvmfs::cvmfs_server_url now':}
    $cvmfs_server_url       = $_cvmfs_server_url
  } else {
    $cvmfs_server_url       = ''
  }

i.e. the default value is not false, but '' which triggers the warning.

Question about reintroducing stratum 0 support

Hello!

At my employer we are currently evaluating cvmfs. We will probably use this module to configure the clients.
It looks like there was code for working with stratum 0 servers earlier but it was removed in #113.

Is that decision "final"? Or was it simply a case of nobody using and maintaining it?
(Would you be open to accepting merge requests that refresh the code?)

Best wishes,
Jon

Cache directories group `root`

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 7
  • Ruby: 2
  • Distribution: Almalinux 9
  • Module version: 9.0.0

How to reproduce (e.g Puppet code you use)

cvmfs::cvmfs_claim_ownership: "yes"
cvmfs::cvmfs_mount_rw: "no"
cvmfs::cvmfs_quota_ratio: 0.85
cvmfs::cvmfs_timeout: 90
cvmfs::cvmfs_timeout_direct: 900
cvmfs::cvmfs_shared_cache: "no"
cvmfs::cvmfs_syslog_level: NULL
cvmfs::cvmfs_fsck: true
cvmfs::cvmfs_fsck_options: -p
cvmfs::cvmfs_fsck_onreboot: true
cvmfs::repo_manage: false

cvmfs::cvmfs_hash:
  fermilab.opensciencegrid.org: {}

cvmfs::fsck::usesystemd: true

What are you seeing

The cache dirs under /var/lib/cvmfs have owner cvmfs and group root.

What behaviour did you expect instead

The cache dirs under /var/lib/cvmfs should probably have owner cvmfs and group cvmfs.

Output log

Any additional information you'd like to impart

Default SELinux context is incorrect.

As per cvmfs/cvmfs#549
CVMFS now has a different default context type.
With SELinux enabled, this can cause CVMFS to fail.

ie:

Notice: /Stage[main]/Cvmfs::Install/File[/build1/cvmfs]/ensure: created
Notice: Applied catalog in 20.84 seconds
[root@pmjptppyum6 ~]# cvmfs_config chksetup
Warning: SELinux enabled, but cache directory (/build1/cvmfs) labeled 'var_lib_t' instead of 'cvmfs_cache_t'
[root@pmjptppyum6 ~]# cvmfs_config probe
Probing /cvmfs/atlas-condb.cern.ch... Failed!
Probing /cvmfs/atlas-nightlies.cern.ch... Failed!
Probing /cvmfs/atlas.cern.ch... Failed!

Patch file attached

set_default_secontext.patch.txt

Migrate to using puppet-autofs

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 6

What are you seeing

Module adds items to auto.mater itself

What behaviour did you expect instead

Module should use puppet-autofs to manage all autofs configuration.

Missing packages/hidden dependency?

Including the following CVMFS snippet on a CC7 puppet host

  # CVMFS
  class {'::cvmfs':
    cvmfs_quota_limit => 'auto',
    cvmfs_quota_ratio => '0.25',
  }

  include('::cvmfs::fsck')

  ::cvmfs::mount{['alice.cern.ch','atlas.cern.ch','atlas-condb.cern.ch','sft.cern.ch','geant4.cern.ch',
                  'na61.cern.ch','lhcb.cern.ch', 'alice-ocdb.cern.ch', 'cernvm-prod.cern.ch']:}

seems to result in the following error /bin/sh: /usr/sbin/tmpwatch: No such file or directory coming from a root cronjob /usr/sbin/tmpwatch -umc -f 30d /var/lib/cvmfs/shared/quarantaine

CVMFS "uninstall"

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 7
  • Ruby: 3
  • Distribution: RHEL8
  • Module version: 8.1.0

How to reproduce (e.g Puppet code you use)

Look to use this module to remove CVMFS from a host

What are you seeing

No clear parameters for "uninstall"

What behaviour did you expect instead

A clear way to use this module to remove CVMFS

Output log

Any additional information you'd like to impart

CVMFS_SYSLOG_LEVEL now supports a setting of `2`

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 7
  • Ruby: AIO
  • Distribution: RHEL8
  • Module version: 8.1.0

How to reproduce (e.g Puppet code you use)

Set cvmfs_syslog_level to 2

What are you seeing

Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Function Call, lambda: parameter 'cvmfs_syslog_level' expects a value of type Undef or Integer[0, 1], got Integer[2, 2]

What behaviour did you expect instead

Loglevel to match upstream support

Output log

Any additional information you'd like to impart

https://cvmfs.readthedocs.io/en/stable/apx-parameters.html

Client configuration in README.md provides invalid example

Client Configuration

To configure a cvmfs client enable the module

class{cvmfs:
}

or

class{'cvmfs':
  cvmfs_quota      => 100
  cvmfs_server_url => 'http://web.example.org/cvmfs/cmfs.example.org'  # this line doesn't work
}

the second example reports no cvmfs_server_url option to init.pp

baseurl breaks usage for users with their own mirrors

baseurl => "${repo_base}/cvmfs/EL/${facts['os']['release']['major']}/${facts['os']['architecture']}",

The new yumrepo baseurl build-up as it is now in 8.0.0 breaks the way we used the module so far:

cvmfs::cvmfs_quota_limit: 30000
cvmfs::cvmfs_cache_base: '/scratch/local/cvmfs/cache'
cvmfs::cvmfs_yum: "%{hiera('ubelix::mirror01')}/mrepo/centos%{facts.os.release.major}-$basearch/RPMS.cvmfs
                   %{hiera('ubelix::mirror02')}/mrepo/centos%{facts.os.release.major}-$basearch/RPMS.cvmfs"
cvmfs::cvmfs_http_proxy: 'http://cvmfs01.lhep.unibe.ch:3128|http://cvmfs02.lhep.unibe.ch:3128;http://proxy.arnes.si:3128;http://dcache.ijs.si:3128'
cvmfs::cvmfs_hash:
  atlas.cern.ch: {}
  atlas-condb.cern.ch: {}
  atlas-nightlies.cern.ch: {}
  sft.cern.ch: {}
  grid.cern.ch: {}

As the above hiera config shows, we use our own mirror due in order to be good citizens and not DDosing the cern server with our HPC cluster. We have to mirror and use the "load-balancing feautre" of yum using baseurl with two URLs. The new baseurl setup is breaking this.

Feature Request_
As a sysadmin I'd like to use my own URL (even two as above) without the module adding additional path segments to it.

If ok for you, Steve, I'm happy to provide a PR with the needed changes and unit tests in about two weeks, when I will have time for that. Any input on the form of the change you like to see?
I'd like to do something like @ghoneycutt is doing in his ghoneycutt/puppet-module-ssh - using 'USE_DEFAULTS' as the default value and acting with an if later to gather the real baseurl either by taking the user input as is or by generating the string as it is done now - for each of the three repos (though we do not need cvmfs-testing and cvmfs-config).
Or would you rather favor a solution like it is done in puppet-epel?

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.