- 更新日: 2014年11月20日
- Ruby
Flickrの短縮URL用にRubyでbase58実装
FlickrのURLには、正規のURLのほかに、公式に短縮URLが用意されています。このFlickrの短縮URLは、base58 というアルゴリズムで生成されているそうです。
Short URLs
…
https://flic.kr/p/{base58-photo-id}
ruby の gem でも base58 というのを見つけたのですが、勉強がてら車輪の再発明をやってみました。base58 のアルゴリズム自体は、Perl/Objective-C/JavaScript の例ですが以下が参考になりました。
Aggressive Engineer: Base58について勉強+Encode::Base58コード解読
Flickrの短縮URLを生成する方法(Base 58によるエンコード) – A Day In My Life
base58 の Ruby 実装
base58 でエンコード・デコードを行う Ruby コードです。ついでに、Flickr の photo_id から短縮URLを生成する flickr_url_shortener というメソッドもおまけ。BASE58_ALPHABET の文字列は、小文字のl(エル)、大文字のI(アイ),O(オー)が抜けて58文字になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
BASE58_ALPHABET = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ" def base58_encode(photo_id) id = photo_id.to_i base = BASE58_ALPHABET.size encoded_str = "" while id > 0 mod = id % base encoded_str = BASE58_ALPHABET[mod] + encoded_str id = id / base end encoded_str end def base58_decode(encoded_str) base = BASE58_ALPHABET.size decoded = 0 multi = 1 while encoded_str.size > 0 c = encoded_str.slice!(-1) decoded = decoded + BASE58_ALPHABET.index(c) * multi multi = multi * base end decoded end def flickr_url_shortener(photo_id) "https://flic.kr/p/#{base58_encode(photo_id)}" end |
Ruby gem での実装例
rubygem の base58 実装は以下を参照。
https://github.com/dougal/base58/blob/master/lib/base58.rb
Flickraw(https://github.com/hanklords/flickraw)という、Flickr 用便利 gem の base58 エンコードの実装は以下のようになっていました。
1 2 3 4 5 6 7 8 9 10 |
def base58(id) id = id.to_i alphabet = BASE58_ALPHABET.split(//) base = alphabet.length begin id, m = id.divmod(base) r = alphabet[m] + (r || '') end while id > 0 r end |
やってることは同じですね。Flickraw を使うと、Flickr の URL 短縮のための base58 エンコードは以下のように行えます。
1 2 3 |
FlickRaw.api_key = "your_api_key" FlickRaw.shared_secret = "youra_shared_secret" base58_photo_id = FlickRaw.base58(photo_id) |
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!