Giter Site home page Giter Site logo

slugged's Introduction

Slugged Build Status

About

Slugged is a simple slug library for ActiveRecord 3.0+.

It's main features are:

  1. A very simple and tested codebase
  2. Support for slug history (e.g. if a users slug changes, it will record the old slug)
  3. Simple defaulting for slugs to UUID's (to avoid showing ID's.)
  4. Built on ActiveRecord 3.0
  5. If stringex is installed, uses stringex's transliteration stuff

Slugged used to be called Pseudocephalopod - a name inspired by the Jason Wander series of books which I just happened to be reading when I had the need for this that focuses on a war with slug-like creatures.

Why?

I love the idea of friendly_id, and most of the implementation but it felt bloated to me and my experiences on getting it to work correctly with Rails 3 left a base taste in my mouth / was altogether hacky.

Slugged is very much inspired by friendly id but with a much simpler codebase and built to work on Rails 3 from the start.

Usage

Using Slugged is simple. In Rails, simply drop this in your Gemfile:

gem 'slugged', '~> 2.0'

Optionally restricting the version.

Next, if you wish to use slug history run:

$ rails generate slugged:slugs

Otherwise, when calling is_sluggable make sure to include :history => false

Next, you need to add a cached slug column to your model and add an index. In your migration, you'd usually want something like:

add_column :users, :cached_slug, :string
add_index :users,  :cached_slug

Or, using our build in generator:

$ rails generate slugged:slug_migration Model

Lastly, in your model, call is_sluggable:

class User
  is_sluggable :name
end

is_sluggable accepts the source method name as a symbol, and an optional has of options including:

  • :sync - when source column changes, save the result. Defaults to true.
  • :convertor - a symbol (for a method) or block for how to generate the base slug. Defaults to :to_url if available, parameterize otherwise.
  • :history - use slug history (e.g. if the name changes, it records the previous version in a slugs table). Defaults to true
  • :uuid - If the slug is blank, uses a generated uuid instead. Defaults to true
  • :slug_column - the column in which to store the slug. Defaults to :cached_slug
  • :to_param - if true (by default), overrides to_param to use the slug
  • :use_cache - uses Slugged.cache if available to cache any lookups e.g. in memcache.
  • :editable - if true (false is the default), allow the users to edit cached_slug column.

Once installed, it provides the following methods:

User.find_using_slug "some-slug"

Finds a user from a slug (which can be the record's id, it's cached slug or, if enabled, slug history)

User.other_than(record)

Returns a relationship which returns records other than the given.

User.with_cached_slug(record)

Returns a relationship which returns records with the given cached slug.

User#generate_slug

Forces the generation of a current slug

User#generate_slug!

Forces the generation of a current slug and saves it

User#autogenerate_slug

Generates a slug if not already present.

User#has_better_slug?

When found via Model.find_using_slug, it will return try if there is a better slug available. Intended for use in redirects etc.

Working on Slugged

To run tests, simply do the following:

bundle install
rake

And it's ready!

Contributors

Thanks to the following who contributed functionality / bug fixes:

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Changes

  • 2.0.0 - Support Rails 4.

Copyright

Copyright (c) 2010 Darcy Laycock. See LICENSE for details.

slugged's People

Contributors

anathematic avatar bcarreno avatar guitsaru avatar gzigzigzeo avatar sj26 avatar sutto 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

Watchers

 avatar  avatar  avatar  avatar

slugged's Issues

Rails 4 support

Do you plan to update slugged to be compatible with Rails 4?

Editable slugs

There is a case when user should be able to manually change a slug for an object. For example let we have Page model with sluggable name field used to construct russian site urls. User creates a contact information page:

Page.create(:name => "Контактная информация")

Page slug will be "kontaktnaya-informaciya", but it is very difficult to remeber and read in translit. So, best variant is to change this slug manually to "contacts" during page creation.

Page.create(:name => "Контактная информация", :slug_cache => "contacts")

I think, it will be useful to allow user to manually edit cached_slug field. The rule is simple: generate slug unless cached_slug_changed?, otherwise parameterize (convert) cached_slug and save.

Also, we should validate_uniqueness_of a slug, and may be add a sequence.

What do you think about it? I had implemented this, but I am not shure that it is elegant solution.

Gem Load Error is: uninitialized constant ActiveModel::ForbiddenAttributesProtection

Guys, I'm trying to upgrade an application from Rails 3.2.22 to 4.0.13 and I'm getting Gem Load Error is: uninitialized constant ActiveModel::ForbiddenAttributesProtection when trying to load slugged gem (2.0.0). The gem was suppose to be ready for Rails 4.0.x. That error was not suppose to be happening.

The error trace:

/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:94:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'slugged'. (Bundler::GemRequireError)
Gem Load Error is: uninitialized constant ActiveModel::ForbiddenAttributesProtection
Backtrace for gem load error is:
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/activerecord-4.0.0/lib/active_record/attribute_assignment.rb:6:in `<module:AttributeAssignment>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/activerecord-4.0.0/lib/active_record/attribute_assignment.rb:3:in `<module:ActiveRecord>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/activerecord-4.0.0/lib/active_record/attribute_assignment.rb:2:in `<top (required)>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/activerecord-4.0.0/lib/active_record/base.rb:300:in `<class:Base>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/activerecord-4.0.0/lib/active_record/base.rb:281:in `<module:ActiveRecord>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/activerecord-4.0.0/lib/active_record/base.rb:22:in `<top (required)>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/slugged-2.0.0/lib/slugged.rb:76:in `<module:Slugged>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/slugged-2.0.0/lib/slugged.rb:9:in `<top (required)>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:91:in `require'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:91:in `block (2 levels) in require'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:86:in `each'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:86:in `block in require'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:75:in `each'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler/runtime.rb:75:in `require'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/bundler-1.14.3/lib/bundler.rb:107:in `require'
/Users/marcosserpa/workspace/work/ironin/vmm/config/application.rb:13:in `<top (required)>'
/Users/marcosserpa/.rbenv/versions/2.1.8/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/marcosserpa/.rbenv/versions/2.1.8/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/marcosserpa/workspace/work/ironin/vmm/config/environment.rb:2:in `<top (required)>'
/Users/marcosserpa/.rbenv/versions/2.1.8/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/marcosserpa/.rbenv/versions/2.1.8/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/marcosserpa/workspace/work/ironin/vmm/spec/spec_helper.rb:6:in `<top (required)>'
/Users/marcosserpa/.rbenv/versions/2.1.8/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/marcosserpa/.rbenv/versions/2.1.8/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/Users/marcosserpa/workspace/work/ironin/vmm/spec/classes/notification/adapters/push_spec.rb:1:in `<top (required)>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `load'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `block in load_spec_files'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1433:in `each'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1433:in `load_spec_files'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:100:in `setup'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:86:in `run'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/invocations.rb:23:in `call'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:69:in `run'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:45:in `invoke'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/gems/rspec-core-3.5.4/exe/rspec:4:in `<top (required)>'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/bin/rspec:23:in `load'
/Users/marcosserpa/workspace/work/ironin/vmm/.gems/bin/rspec:23:in `<main>'

My Gemfile:

source 'http://rubygems.org'

ruby '2.1.8'

gem 'rails', '4.0.0'
gem 'rake'

gem 'activeresource'
gem 'rails-observers'

gem 'bootstrap-wysihtml5-rails'
gem 'jquery-rails', '= 2.2.1'
gem 'jquery-hotkeys-rails'
gem 'jquery-mousewheel-rails'
gem 'jquery-ui-rails', '= 4.0.1'
gem 'jscrollpane-rails'
gem 'requirejs-rails'
gem 'turbolinks'

gem 'acts_as_list', '0.7.4'
gem 'paranoia'
gem 'acts_as_tree', '2.2.0'

source 'https://rails-assets.org' do
  BOOTSTRAP_VERSION = '= 3.3.4'
  ANGULAR_VERSION   = '= 1.3.15'
  gem 'rails-assets-bootstrap-sass', BOOTSTRAP_VERSION
  gem 'rails-assets-angular', ANGULAR_VERSION
  gem 'rails-assets-angular-animate', ANGULAR_VERSION
  gem 'rails-assets-angular-gantt', '= 1.2.5'
  gem 'rails-assets-angular-filereader'
  gem 'rails-assets-angular-google-maps', '= 2.0.17'
  gem 'rails-assets-angular-resource', ANGULAR_VERSION
  gem 'rails-assets-angular-sanitize', ANGULAR_VERSION
  gem 'rails-assets-angular-ui-select', '= 0.11.2'
  gem 'rails-assets-angular-wysiwyg', '= 1.2.2'
  gem 'rails-assets-jquery', '= 2.1.3'
  gem 'rails-assets-jquery-debounce'
  gem 'rails-assets-ng-file-upload', '= 3.3.4'
  gem 'rails-assets-restangular'
end

gem 'simple_form_angular'

gem 'devise', '3.3.0'
gem 'devise_security_extension', '0.10.0'

gem 'pg'
gem 'slugged', '2.0.0'

gem 'active_model_serializers', '0.9.3'
gem 'activerecord-postgres-hstore' # Remove after removing DataActivity OR after update to Rails 4 - read the
gem 'foreigner', '1.7.3' # will not be needed in Rails 4.2 and up
gem 'geocoder', '1.4.3' # needs some changes when in rails 4.1 and up. look at gem page at github

gem 'haml', '4.0.7' # why using haml AND haml-rails at the same time? Try to remove with rails 4.2
gem 'less-rails'
gem 'sass-rails', '5.0.0' # needs to be changed to 5.0.0 when in rails 4.0 and up
gem 'rabl', '0.13.1'

gem 'autoprefixer-rails'

gem 'figaro', '>= 0.5.3' # Are we using figaro? I did not see any application.yml
gem 'rails-settings-cached', '0.3.2' # needs to be changed to 0.3.2 when in rails 4.0, to 0.3.2 when in rails


gem 'activerecord_any_of', '1.4' # could we replace the places that uses the methods to not use this gem?
gem 'axlsx', github: 'randym/axlsx'
gem 'carrierwave_backgrounder'
gem 'carrierwave_direct'
gem 'chronic', '0.10.2' # too old. could we replace this by some other thing?
gem 'doc_raptor' # deprecated. is this used somewhere? if yes change to https://github.com/DocRaptor/docraptor-ruby
gem 'draper', require: false # change to 2.1.0 when in rails 4.2
gem 'font_assets', github: 'grzlus/font_assets' # remove. not needed
gem 'interactor'
gem 'mimemagic' # do we really need this? Just one place uses this

gem 'mini_magick', git: 'git://github.com/minimagick/minimagick.git', ref: '6d0f8f953112cce6324a524d76c7e126ee14f392' # study remove rmagick and let only this in the last version
gem 'rmagick'

gem 'multi_fetch_fragments'
gem 'naught', '1.1.0'
gem 'redis-session-store', '0.9.1'
gem 'roar-rails', '1.0.2'
gem 'roo', '2.7.1'
gem 'roo-xls'
gem 'routing_concerns' # try to remove in rails 4.2
gem 'rubyXL', '3.3.22', require: false
gem 'virtus'
gem 'wicked_pdf', '1.1.0'
gem 'audited', '4.0.0'

gem 'activerecord-postgres-array', '0.0.9' # Not need in Rails4
gem 'fog', '~> 1.3.1' # try to update to 1.38.0
gem 'navigasmic', '1.1.0'
gem 'kaminari', '0.17.0' # needs to be changed to 1.0.1 when in rails 4.1 and up
gem 'kaminari-bootstrap'
gem 'savon', github: 'savonrb/savon'
gem 'rails_serve_static_assets', '0.0.5'
gem 'ruby-progressbar', require: false

gem 'tire'

gem 'ransack'

gem 'heroku-api'

gem 'passenger', '>= 5.1.2'

gem 'therubyracer'

gem 'httpclient'

gem 'sidekiq', '4.2.9'
gem 'sidetiq', github: 'grzlus/sidetiq'
gem 'sidekiq-middleware'
gem 'sinatra'
gem 'redis'

gem 'coffee-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'

group :beta, :production, :staging, :testing do
  gem 'newrelic_rpm'
end

group :test, :development do
  gem 'pry-byebug'
  gem 'capybara', '~> 2.12.0'
  gem 'dotenv-rails', '2.2.0'
  gem 'fabrication', '~> 2.16.0'
  gem 'guard-rspec', '4.6.4'
  gem 'json_expressions'
  gem 'rb-fsevent', '~> 0.9.8'
  gem 'rspec-rails', '~> 3.5.2'
  gem 'spring', '1.7.2' # will not be needed in Rails 4.1 and up
  gem 'spring-commands-rspec'
end

group :test do
  gem 'database_cleaner', '>= 0.9.1'
  gem 'email_spec', '>= 1.4.0'
  gem 'launchy', '2.4.3'
  gem 'rspec-sidekiq'
  gem 'shoulda'
  gem 'timecop', '0.8.0'
  gem 'vcr'
  gem 'webmock', '1.24.6'
  gem 'rspec-collection_matchers'
end

group :development do
  gem 'better_errors', '2.1.1'
  gem 'binding_of_caller', '>= 0.6.8'
  gem 'bullet', '4.14.0' # needs to be changed to 5.5.0 when in rails 4.0 and up
  gem 'coffee-rails-source-maps' # will not be needed in Rails 4.X and up that includes coffescript >= 1.6.1
  gem 'foreman', '0.83.0'
  gem 'meta_request'
  gem 'pry-remote'
  gem 'quiet_assets', '>= 1.0.1' # maybe not needed anymore in rails 4.0 and up
  gem 'ruby_parser', '>= 3.1.1'
  gem 'yard' # is someone using this for something?
end

gem 'whenever', require: false
gem 'classy_hash'

Rails is already in 4.0.0. Ruby, 2.1.8.

Thanks! <3

Slugged not playing nice with CanCan/Devise

Hey there!

I'm having a little issue using Slugged at the same time as CanCan (an authorization gem). I also posted this to CanCan's GitHub issues so that its author would know about it. Basically when CanCan loads and authorizes my resource which also has a slug tied to it, CanCan places the authorization code in the before_filter. By doing this, it triggers a ActiveRecord::RecordNotFound exception. I'm then told "Couldn't find Page with ID=home" thus Slugged was never integrated for some reason... to make things odder, none of this happens when I take CanCan's authorization code out. I cannot however, completely remove CanCan from my app, since the whole thing is built on it. Do you have any suggestions on how to fix this?

Thank you for your help! It is much appreciated!

-Robert

License missing from gemspec

RubyGems.org doesn't report a license for your gem. This is because it is not specified in the gemspec of your last release.

via e.g.

spec.license = 'MIT'
# or
spec.licenses = ['MIT', 'GPL-2']

Including a license in your gemspec is an easy way for rubygems.org and other tools to check how your gem is licensed. As you can imagine, scanning your repository for a LICENSE file or parsing the README, and then attempting to identify the license or licenses is much more difficult and more error prone. So, even for projects that already specify a license, including a license in your gemspec is a good practice. See, for example, how rubygems.org uses the gemspec to display the rails gem license.

There is even a License Finder gem to help companies/individuals ensure all gems they use meet their licensing needs. This tool depends on license information being available in the gemspec. This is an important enough issue that even Bundler now generates gems with a default 'MIT' license.

I hope you'll consider specifying a license in your gemspec. If not, please just close the issue with a nice message. In either case, I'll follow up. Thanks for your time!

Appendix:

If you need help choosing a license (sorry, I haven't checked your readme or looked for a license file), GitHub has created a license picker tool. Code without a license specified defaults to 'All rights reserved'-- denying others all rights to use of the code.
Here's a list of the license names I've found and their frequencies

p.s. In case you're wondering how I found you and why I made this issue, it's because I'm collecting stats on gems (I was originally looking for download data) and decided to collect license metadata,too, and make issues for gemspecs not specifying a license as a public service :). See the previous link or my blog post about this project for more information.

undefined method "is_sluggable "

Having a little trouble on the home stretch of using this plugin. Would really love to get all in place, I like what I see in this plugin.

After getting gem installed and migrations all in place, the is_sluggable, when placed in a model, is throwing an error stating its undefined.

Not sure I understand why the method wouldn't be defined. I've followed the readme as close as possible. Has anyone come across this before?

Gem name

Simple slug library...complex name! How about just "slugged"? It has not been taken.

Concatenate two or more fields before doing the magic?

I'm working on a project where I need to concatenate two fields and then get a slugg from them.

I can achieve this by creating an extra field, but this means having that extra field just for this. I was wondering if this could be done with slugged directly.

Thanks in advance,
Emiliano

For custom source method name x, what to return in x_changed?

In my model I've defined a custom method to generate the slug as follows.

  def slugify
    "#{UUID.generate(:compact)}"
  end

and calling it with is_sluggable as follow.

is_sluggable :slugify, :history => false

The gem calls for a slugify_changed? method. What is the proper method definition for this in this example?

Thanks in advance!

Add a way to disable cached_slug in certain paths helpers

Hi Guys,

I'm looking for a way to use the id instead of the slug in certain path helpers.

Namely I want admin_posts_path post to generate /admin/posts/2 and not /admin/posts/my-cool-post

So far I have come up with a ugly solution of overriding the to_param for each model in the admin controller and then back again..

class Admin::AdminController < ApplicationController

  before_action :dont_slug
  after_action :do_slug

  private

  def dont_slug

    Post.class_eval do
      def to_param
        self.id.to_s
      end
    end

  end

  def do_slug

    Post.class_eval do
      def to_param
        self.cached_slug.to_s
      end
    end

  end

end

But this is really ugly when you have 10 models using slugs.

I do know I could override each of the path helpers... but I have hundreds of paths and adding one for each route is prone to errors.

Any help with a better work-around would help me a lot!

Thanks!

Mysql2::Error: Specified key was too long; max key length is 1000 bytes...

Attempting to run migrations on my server, rake db:migrate fails with the following error:

Mysql2::Error: Specified key was too long; max key length is 1000 bytes: CREATE INDEX index_slugs_on_scope_and_slug ON slugs (scope, slug)

Not sure if this is an issue with slugged, or the mysql2 gem, but thought it worth mentioning here for others. If I can be of further assistance, please let me know.

have slugged use a scope to verify uniqueness?

Hey,

I was wondering if it is possible to have slugged check a specific scope before deciding if a slug is unique or not (and in the process adding --1, --2, etc)? I have a title field and account_id field and only want slugged to do this when both the title and account_id are equal to a database row.

Is this possible? Thanks.

Edit:

If this feature isn't already built in, I guess this would also mean I'd have to rewrite the find_using_slug method(s) to take this into account, right? I really hope this is already a built in feature and/or easy to implement, as it's quite crucial to my app.

Thanks in advance!

Should id point to latest slug?

I used to use friendly_id but found it too bloated and full of options I never used anyway. And for the custom options that I did want to use, I had to hack them in which wasn't very nice.

For my next version of the app I want to use slugged instead of friendly_id. I made the transition and am testing it now, however, it seems that the slug isn't converted to an ID when I make a page request.

It says: Couldn't find Page with ID=homepage

when I use the following show method:

def show
  @page = Page.find(params[:id])
end

Am I doing anything wrong or assuming slugged should do something that friendly_id did before, but I should be doing myself now?

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.