Salted MD5 (CRYPT MD5) ハッシュの生成 [Ruby, Perl, C言語]

先日PHPで生成していたSalted MD5をRubyでも出来てないのは
寝覚めが悪いと言うことでRubyで生成する方法を調べてみた。

PHPでの生成方法: Salted MD5 (CRYPT MD5) ハッシュの生成 [PHP]

Mac OS Xでなんとか試してみていたけど、うまくいかなかった。
どうも、Mac OS Xのcrypt(3)では標準のDESだけでMD5をサポートしていないらしい。
“Salted MD5 (CRYPT MD5) ハッシュの生成 [Ruby, Perl, C言語]” の続きを読む

RubyKaigi 2010に参加してきたよ

RubyKaigi 2010に参加してきた。

日本Ruby会議2010 (RubyKaigi2010)

開催概要
* 名称: 日本Ruby会議2010 (RubyKaigi2010)
* 会期: 2010 年 8 月 27 日(金)・28 日(土)・29 日(日)
* 会場: つくば国際会議場 (茨城県つくば市)
* 料金: 6,000 JPY
* 公式タグ: rubykaigi2010
* 公式ハッシュタグ: #rubykaigi
* 主催: 日本Ruby会議2010実行委員会, Rubyアソシエーション, 日本Rubyの会

仙台Ruby会議02への参加後、次のRubyイベントとして参加したいと思っていた
RubyKaigi 2010がつくばで開催された。

“RubyKaigi 2010に参加してきたよ” の続きを読む

お名前.com VPSで名前解決不具合

年末からお名前.comのVPSを借りて、いろいろと試してみている。

正月にこのブログなど、個人のサイトをこのサーバへ移行して運用を始めた。

その際にブログと一緒にサーバ移行をした自分用システムのレスポンスが
異常に遅くなったことに気づいた。

これはAmazonのAPI (Product Advertising API)を利用するシステムで、Rubyで開発している。

“お名前.com VPSで名前解決不具合” の続きを読む

Rubyでbit.lyのAPI経由で短縮URLを取得する

「ブログからRSSをとってきて、更新があったらTwitterにツイートをPOSTする。」

ということをやっているんだけど、URLの短縮化はAPIまかせにしているので
140字の制限に対してまだ余裕がある場合はURLは
「https://blog.bungu-do.jp/archives/1646」
と、そのまま表示される

この場合URLの文字数は37文字
“Rubyでbit.lyのAPI経由で短縮URLを取得する” の続きを読む

irbでTAB補完

Ruby関連本で評判が高いピッケル本(Dave Thomas著: プログラミングRuby)を
少しずつ読んでいたらirbの説明でTAB補完が出来ると書いてあった。

irbはRubyを対話的に実行することができるツールだ。
Rubyの動作をちょっと確認するのに便利だ。

requireすればライブラリや自分の書いたClassの動作確認もできる。

あれ?そんなにirbって便利だったっけ?
“irbでTAB補完” の続きを読む

Rubyで電子署名 Amazon アソシエイト Web サービス


Amazon Web Services

2009年8月15日からAmazon Web Servicesを利用するときはアクセスキーだけではなく電子署名も埋め込む必要があるというメールが来ていた。

まあ、アクセスキーが分かれば誰でもリクエスト出来るというのは
いかがなものかなとは思っていたところだったので良いことかと。

と言うことで、電子署名をする方法をRubyで確認。

さて、このたび、Amazon アソシエイト Web サービスの名称を、「Product Advertising API」と変更しましたことをお知らせいたします。この新名称は、開発者の皆様が Amazon サイトで販売されている商品の広告作成を行い、これによって Amazon より広告費を受け取るという、API の目的をより正しく表しています。

名称変更にともない、Product Advertising API にリクエストを送信いただく都度、認証のための電子署名を含めていただくことが必要になります。この変更は、2009年5月11日より3ヶ月の間の移行期間の後、2009年8月15日には、Product Advertising API へ送信されるリクエストは全て認証されることとなり、認証されない場合、リクエストは処理されなくなります。

以前はリクエストのURIにアクセスキーを埋め込みさえすれば良かったけど
今度はsecret keyを使って認証しなければならないとのこと。

secret keyは「Product Advertising API」のアカウントにログインして
「Access Identifiers」で確認できる。

amazon1

署名については以下のサイトを参考にした。
Amazon Product Advertising APIの認証の件 zorioの日記

Base64.encode64の文末に改行コードが入ることを知らずにいたことが原因で小一時間はまってしまった。

RubyのBase64エンコード ayucatのRuby/Rails日記

オフィシャルのマニュアル
Product Advertising API Request Authentication

require "cgi"
require "openssl"
require "base64"
require "digest/sha2"
require "time"

aws_host   = "webservices.amazon.co.jp"

access_key = '00000000000000000000'
secret_key = '1234567890'

req = ["Service=AWSECommerceService","AWSAccessKeyId=#{access_key}",
"Version=2009-06-01"]

req << "ItemId=0679722769"
req << "Operation=ItemLookup"
req << "ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews"
req << "Timestamp=#{CGI.escape(Time.now.getutc.iso8601)}"

req.sort!

message = ['GET',aws_host,'/onca/xml',req.join('&')].join("\n")

hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, 
secret_key, message)

sign = Base64.encode64(hash).split.join

req << "Signature=#{CGI.escape(sign)}"

url = "http://#{aws_host}/onca/xml?" + req.join('&')

puts url

Perlについては小飼 弾さんの「404 Blog Not Found」を見ておけば大丈夫だ。
perl - URI::Amazon::APA released! 404 Blog Not Found

Rubyで通貨表示 3桁ごとにカンマ

RubyのCGIで予約システム書いてて
金額を数字で扱っていて表示の時に通貨表示として
カンマを3桁ごとに表示したいとおもった。

Rubyでの数値の通貨フォーマット – CHNの中の人たちブログ

正規表現 – Rubyリファレンスマニュアル

上記のサイトを参考にしてIntegerにto_cというメソッドを
追加した。

class Integer
  def to_c
    str = to_s
    tmp = ""
    while(str.size > 3) do
      str.gsub!(/(.*\d)(\d\d\d)/,'\1')
      tmp = ",#{$2}" + tmp
    end
    str + tmp
  end
end

111222333.to_c  #  "111,222,333"

うえむらさんからのコメントでマイナスにも対応したものに修正してみました。

class Integer
  def to_c
    str = to_s
    tmp = ""
    while(str =~ /([-+]?.*\d)(\d\d\d)/) do
      str = $1
      tmp = ",#{$2}" + tmp
    end
    str + tmp
  end
end

-111.to_c      #  -11,222
-111222.to_c   # -111,222

最初は単純にサイトに書いてあるとおりに記述していたけど
テストして1,000~111,000にしか対応していないことに気づき
ちょっと修正した。

str.gsub!(/(.*\d)(\d\d\d)/, '\1,\2')

あと、メソッドに追加していたのはFixnumにだったけど
数が大きくなるとBignumになるので対応できないことにも気づく。

なので上位クラスのIntegerに追加することで解決。