黒川仁の文具堂ブログ三昧

Hitoshi Kurokawa, an engineer at Next SeeD

Archive for the ‘Ruby三昧’ Category

RubyKaigi 2010に参加してきたよ

one comment

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がつくばで開催された。

Read the rest of this entry »

Written by 黒川仁(文具堂)

8月 31st, 2010 at 9:48 pm

仙台Ruby会議02に参加してきたよ

leave a comment

昨日、念願の仙台Ruby会議02に参加してきた。

仙台Ruby会議01も参加予定だったけれども、いつのまにか過ぎていたという体たらく・・・
今回はアナウンスを見つけてすぐにその場で申し込み

Read the rest of this entry »

Written by 黒川仁(文具堂)

3月 21st, 2010 at 12:21 pm

Posted in Ruby三昧

Tagged with

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

2 comments

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

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

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

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

Read the rest of this entry »

Written by 黒川仁(文具堂)

1月 9th, 2010 at 12:35 am

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

one comment

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

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

この場合URLの文字数は37文字

最初はまあ、bungu-doという文字も見えていいかなと思ったけど、
RT(Retweet)された場合などにURLがそのままだと結構文字数制限が
つらくなってくることに気づいた。

だから短縮URLなんだとようやく気づいた。

なので、文字数に足りる足りないに限らず、短縮URLにしておくことに決めた。

そこで、下記記事を参考に当然のごとくRubyでクラスにshortenメソッドを追加した。

参考記事:
bit.ly (短縮URL) API呼び出し (その1) m-kawato@hatena_diary

後はPOSTするところにshortenメソッドをかますだけでOK

  def shorten(long_url)
    id = 'USER_ID'
    api_key = 'API_KEY'
    version = '2.0.1'

    query = "version=#{version}&longUrl=#{long_url}&login=#{id}&apiKey=#{api_key}"
    result = JSON.parse(Net::HTTP.get("api.bit.ly", "/shorten?#{query}"))
    result['results'].each_pair {|long_url, value|
      return value['shortUrl']
    }
  end

bit.lyのアカウントを取得すればAPI KEYをもらえます。

通常URL
http://blog.bungu-do.jp/archives/1646 【37文字】

短縮URL
http://bit.ly/3OcFKj 【20文字】

37文字から20文字へとあんまり変わらないような気もするけど・・・・

もっと長いURLでも20文字になる。

たとえば

irb(main):001:0> 'http://japan.cnet.com/news/biz/story/0,2000056020,20403566,00.htm'.size
=> 65
irb(main):002:0> 'http://bit.ly/42A19r'.size
=> 20

65文字から20文字へと3分の1以下になる。

うまくいけばこの記事のPOSTもちゃんとツイートされるはず・・・

追記:
無事更新されましたとさ
bitly

Written by 黒川仁(文具堂)

11月 13th, 2009 at 7:01 pm

Posted in Ruby三昧,Web三昧

Tagged with ,

自分専用のTwitterクライアント クライアント名を自分で決める

2 comments

ひろゆきがTwitterを始めたようで

さっそくフォーローする。
今日はぽつぽつつぶやいている。

tw_hiroyuki

すぐにCNETの記事にもなっていた。

ひろゆき氏がTwitterを開始、その理由は……? CNET Japan Staff BLOG

西村氏によると、「今朝思いついて、そろそろやってみようかなと」とのこと。西村氏は過去に別のアカウントを作ってTwitterを使っていたが、最近はまったく使っていなかったそう。しかし、「今Twitterのクローンっぽいシステムを作っていて、そろそろちゃんと使わないと作り方がわからない」との理由でアカウントを再開設したとのことだ。ちなみにフォロワー数は11日21時時点で6000人超となっており、その数は急激に伸び続けている。

@hiroyuki_ni


自作ですー。 @koma_tz Twitterアプリは何を使っているんですか?><

ひろゆきがアプリを自作?
そして、クライアント名が「Paapeejpで」となっている。

Paapeejpってなんだ?聞かないクライアントだな。
と思ってたら自作ということはひろゆきが決めたアカウント名か。

そこでぴーん! ときた。
自分でクライアント名決められるのか。

Twitterの公式サイトからのツイートなら「webで」となるし
TweetDeckという専用クライアントでのツイートなら「TweetDeckで」となる

この「○○で」の○○の部分を決められるということだ。

RubyのクライアントでRSSからツイートするスクリプトをつくってcrontで回していたけど
「APIで」という素っ気ないものになっているのがなんとなく気になっていた。

しらべてみると、あるじゃないですか、自分でクライアント名を決める方法が。
何度かTwitterでみかけたOAuthという仕組みでできるようだ。

TwitterのbotをOAuthに対応させる しばそんノート

しかし実は、そういうセキュリティ的な事情以外にも、bot製作者的に「OAuthに移行したい!」と思わせる嬉しい利点がOAuthには用意されているのです。

それは投稿したTweetに表示される“クライアント名”を任意に設定できるということです。Web上でタイムラインを見たときに「webで」とか「Tweenで」とか表示されている部分ですね。

ありがたいことに、この参考記事もRubyで作成している。
gemのoauthというライブラリを利用する。

この通りで大体いけた。
じゃっかん、gemのjsonをインストールするのにつまずいたりしたけど大丈夫。
Ruby1.9を想定している記事みたいなので、パッチをあてるファイルをrequireしているけど
自分はRuby1.8系をつかっているので、逆にエラーがでてしまったのでコメントアウト。

require 'rubygems'
require 'oauth'
#require 'oauth-patch'
require 'json'

そしてテスト。

@krhitoshi

うまくTweetできるようになったみたいだ

tw_krhitoshi

めでたくクライアント名が「Terasonで」となった。
ちなみにTerasonは私のハンドルネームの一つです。

結局は自分で作ることになるんだね。

Written by 黒川仁(文具堂)

11月 12th, 2009 at 1:40 am

irbでTAB補完

leave a comment

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

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

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


プログラミングRuby 第2版 言語編
Dave Thomas Dave ThomasChad FowlerAndy Hunt
¥3,990
(2006/08/26発売)

あれ?そんなにirbって便利だったっけ?

irbはRubyのプログラミングの時にたまに利用しているけど
TAB補完ができればいいなとかヒストリー機能ができれば
良いなとおもっていたらどうやら出来るらしい。

早速試してみる

irb -r irb/completion
/usr/local/lib/ruby/1.8/irb/completion.rb:10:in `require': no such file to load -- readline (LoadError)
        from /usr/local/lib/ruby/1.8/irb/completion.rb:10
        from /usr/local/lib/ruby/1.8/irb/init.rb:252:in `require'
        from /usr/local/lib/ruby/1.8/irb/init.rb:252:in `load_modules'
        from /usr/local/lib/ruby/1.8/irb/init.rb:250:in `each'
        from /usr/local/lib/ruby/1.8/irb/init.rb:250:in `load_modules'
        from /usr/local/lib/ruby/1.8/irb/init.rb:21:in `setup'
        from /usr/local/lib/ruby/1.8/irb.rb:54:in `start'
        from /usr/local/bin/irb:13

どうやらモジュールの関係で駄目らしい。

こういう場合はたいていreadline-develをインストールして
Rubyを再コンパイルすればよいと相場が決まっている。

CentOSを利用しているのでyumでインストール

yum -y install readline-devel

再度、Rubyのソースをconfigureしてmakeしてインストール

cd /usr/local/src/ruby-1.8.7-p174
make clear
./configure
make
make install

あとはコマンドラインのオプションとしてテスト

 irb -r irb/completion
irb(main):001:0> a = 2
=> 2
irb(main):002:0> a.si(TABキーを押す)
a.singleton_method_added  a.singleton_methods       a.size

OKであれば~/.irbrcへrequire文を挿入しておけば実行時にirb/completionを指定しなくて良い。

require 'irb/completion'

これでbashライクな入力インターフェイスとなる。
Ctrl+p、Ctrl+n、↑キー、↓キーで履歴(ヒストリー)を表示できる。

そして、irbを使えるこなせるようになるとよいが・・・・。

Written by 黒川仁(文具堂)

8月 21st, 2009 at 10:37 pm

Posted in Ruby三昧

Tagged with , , ,

Ruby会議

leave a comment

Ruby会議調べてみたら、連休中にあったみたいだ。

日本Ruby会議2009

全然知らなかった残念。メーリングリスト取ってるのに。

国際会議の方はサンフランシスコ・・・・。

時期は実家に帰る予定。

RubyConf 2009

松本ゆきひろさんを見に行くのはまた今度だ。

Written by 黒川仁(文具堂)

7月 21st, 2009 at 10:21 pm

Posted in Ruby三昧

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

leave a comment


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

Written by 黒川仁(文具堂)

6月 28th, 2009 at 7:19 pm

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

4 comments

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に追加することで解決。

Written by 黒川仁(文具堂)

4月 26th, 2009 at 10:23 pm

Posted in Ruby三昧

Tagged with , ,

Redmine 通知メールのエンコードをUTF-8からiso-2022-jpにする

leave a comment

最近仕事でRemineを使って社内のやりとりをすることが

多くなりまして、メールがガンガン飛んでくるわけですが

Redmineから送られてくるメールはUTF-8のため
携帯でメールが見られないとか、文字化けするメーラーが
出てきたので、通常のエンコードiso-2022-jpへの変更を試みた。

参考にしたサイトはこちら
redmine 0.8でメール文字化けの対応しました: 猫派

ちなみにインストール方法は
Redmineインストール バグトラッキング プロジェクト管理システム: CentOSサーバ構築術 文具堂

/var/www/redmineにインストールしている場合の設定です。

gettextのインストール

gem install gettext

config/environment.rbの最後endの直前に

config.gem "gettext", :lib => "gettext/rails"

を追加する。

cd /var/www/redmine/config

vi environment.rb

----------------------------------------
  # Deliveries are disabled by default. Do NOT modify this section.
  # Define your email configuration in email.yml instead.
  # It will automatically turn deliveries on
  config.action_mailer.perform_deliveries = false
  config.gem "gettext", :lib => "gettext/rails"
end
----------------------------------------

models/mailer.rbに

GetText.locale ='ja'

をクラス宣言の前に追加する。

cd /var/www/redmine/app/models

vi mailer.rb
----------------------------------------
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
GetText.locale ='ja'

class Mailer < ActionMailer::Base
  helper :application
  helper :issues
  helper :custom_fields
----------------------------------------

PassengerでRedmineを動かしている場合は
tmp/restart.txtを作成してPassenger再起動。

touch /var/www/redmine/tmp/restart.txt

RedmineにアクセスするとPassengerが再起動して

tmp/restart.txtは削除されます。tmp/restart.txtが

削除されているかで再起動できたか確認できます。

Trackはプロジェクト毎に立ち上げなきゃいけない?とかインストールが面倒とか
Mantisはインストールが楽だけどwikiやバージョン管理などドキュメント系が不足気味
これはますますRedmineを使う理由が増えてくるな~。Passengerのインストールが楽になったおかげでRuby On RailとApacheの連携も気にならなくなった。mod_rubyとかFastCGIとかさわるだけでも何かややこしかったし。。。


入門Redmine Linux/Windows対応
前田 剛
¥2,100

Written by 黒川仁(文具堂)

3月 21st, 2009 at 4:25 pm