Guillotine
Simple URL Shortener hobby kit. Currently used to shorten URLs at GitHub.com, and also available as a an installable Heroku app.
USAGE
The easiest way to use it is with the built-in memory adapter.
“by
app.rb
require ‘guillotine’ module MyApp class App < Guillotine::App adapter = Guillotine::Adapters::MemoryAdapter.new set :service => Guillotine::Service.new(adapter)
get '/' do
redirect 'https://homepage.com'
end
end end
“
“by
config.ru
require “rubygems” require File.expand_path(“../app.rb”, FILE) run MyApp::App
“
Once it’s running, add URLs with a simple POST.
curl http://localhost:4567 -i \
-F "url=http://techno-weenie.net"
You can specify your own code too:
curl http://localhost:4567 -i \
-F "url=http://techno-weenie.net" \
-F "code=abc"
Sequel
The memory adapter sucks though. You probably want to use a DB. Check out the Sequel gem for more examples. It’ll support SQLite, MySQL, PostgreSQL, and a bunch of other databases.
“by require ‘guillotine’ require ‘sequel’ module MyApp class App < Guillotine::App db = Sequel.sqlite adapter = Guillotine::Adapters::SequelAdapter.new(db) set :service => Guillotine::Service.new(adapter) end end
“
You’ll need to initialize the DB schema with something like this (depending on which DB you use):
“REATE TABLE IF NOT EXISTS urls
( url
varchar(255) DEFAULT NULL, code
varchar(255) DEFAULT NULL, UNIQUE KEY url
(url
), UNIQUE KEY code
(code
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
“
Redis
Redis works well, too. The sample below is adapted from Katana, a hosted wrapper around Guillotine designed for Heroku.
“by require ‘guillotine’ require ‘redis’
module MyApp class App < Guillotine::App # use redis adapter with redistogo on Heroku uri = URI.parse(ENV[REDISTOGO_URL]) redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) adapter = Guillotine::Adapters::RedisAdapter.new(redis) set :service => Guillotine::Service.new(adapter) end end
“
Riak
If you need to scale out your url shortening services across the cloud, you can use Riak!
“by require ‘guillotine’ require ‘riak/client’ module MyApp class App < Guillotine::App client = Riak::Client.new :protocol => ‘pbc’, :pb_port => 8087 bucket = client[guillotine] adapter = Guillotine::Adapters::RiakAdapter.new(bucket) set :service => Guillotine::Service.new(adapter) end end
“
Cassandra
you can use Cassandra!
“by require ‘guillotine’ require ‘cassandra’
module MyApp class App < Guillotine::App cassandra = Cassandra.new(‘url_shortener’, ‘127.0.0.1:9160’) adapter = Guillotine::Adapters::CassandraAdapter.new(cassandra)
set :service => Guillotine::Service.new(adapter)
end end
“
You need to create keyspace and column families as below
“l CREATE KEYSPACE url_shortener; USE url_shortener;
CREATE COLUMN FAMILY urls WITH comparator = UTF8Type AND key_validation_class=UTF8Type AND column_metadata = [code, validation_class: UTF8Type];
CREATE COLUMN FAMILY codes WITH comparator = UTF8Type AND key_validation_class=UTF8Type AND column_metadata = [url, validation_class: UTF8Type];
“
Domain Restriction
You can restrict what domains that Guillotine will shorten.
“by require ‘guillotine’ module MyApp class App < Guillotine::App adapter = Guillotine::Adapters::MemoryAdapter.new # only this domain set :service => Guillotine::Service.new(adapter, :required_host => ‘github.com’)
# or, any *.github.com domain
set :service => Guillotine::Service.new(adapter,
:required_host => /(^|\.)github\.com$/)
# or set a simple wildcard
set :service => Guillotine::Servicew.new(adapter,
:required_host => '*.github.com')
end end
“
Not TODO
- Statistics
- Authentication