ひげろぐ

技術者として仕事人としての思うところや覚え書きやらです
Home      Profile      Works     
2010-08-29

RubyKaigi2010の感想

2日目だけ行って来ました。

実はRubyKaigiには今回初めて行ってみたのだけれど、お祭りみたいで楽しかった。
これは来年もまた是非行きたいなあと思いました。

以下とりとめもなく。

超絶技巧 Ruby プログラミング

アホなことをまじめにやっている姿が感動的。
最初の参加セッションでいきなりエンドロールを見せられてしまった。(個人スポンサーだったので自分の名前も出た!)

ニコ動に上がっていたので暇な時間に是非見てみて欲しい。息抜きの時間に最適です。

Vim

セッションをやっている201-Aに行ったら超満員御礼状態。
入り口から人があふれていて立ち見状態だった。
というわけで入るのは断念。

隣でやっていたEmacsの方はだいぶ余裕があるようだった。
RubyistはVim使いが多いのかな?

Cucumberハンズオン

一番楽しみにしていたセッションだったのだけれど、環境構築が出来ていなくて\(^o^)/

当日出発前にいろいろ入れて大丈夫と思っていたら、Ruby自体がopensslやらいろいろと無効な状態でのインストールになっていて、いざ動かそうとしたらRailsがまともに動かなかったという。
これは必要なgemが入らないとかそんなチャチなもんじゃねえ(ry

Cucumberを動かすための環境構築のサポートもしてくれていたけれど、なんというそういうサポート以前の問題だこれは。
そんなわけで動かすのはあきらめて、コードの書き写しだけひっそりとやってました。

apt-getで必要なパッケージを入れてRubyの再構築というのも並行してやっていたのだけれど、会場のWifiも熾烈な帯域の奪い合いが実感されるほどのつながったりつながらなかったりっぷりで、終わったのがちょうどセッション終了と同時でしたとさ。どっどはらい。

ライトニングトークス

制限時間内に終えるとKY呼ばわりされるおかしなLTでした。
何が言いたいかというと、ドラ娘かわいかったです。

ネタ的にはGoogleWave本の人が全部持って行ったかんじ。
本が刷り上がった日に開発終了のお知らせとか涙なしには聞けない。
X-Ruby、O-Ruby、F-Rubyも最高でしたw

そのほかで個人的に刺さったのはMessagePack、Almanac for Ruby、Lingoあたり。
折を見て追いかけてみようかと。

それから達人出版会の今後には期待。
売り上げの配分とか金銭的な面が難しそうだけれど、うまいことできれば相当面白いことになりそう。

懇親会

人見知り的にはある意味大変な場所ではあるが何人かと話せてそこそこ有意義な時間を過ごせた。

会ってみたい人の名前を書く、というのはいきなり振られたのですでにMatzと書きました。
すみません。すでに帰途についていること承知でした。
でも生Matzを見たことがないのでいつか実際会ってみたいです。

トートバッグ

思いもかけずもらえたのでうれしかった。
作りもしっかりしていて便利そうなので常用させてもらいます!

交通アクセス

横浜の片田舎からだとつくばまで片道3時間というのはさすがに遠かった。
これは連日参加するなら泊まり必須ですねー。

来年はどこでやるのか分からないけれど宿泊も要検討事項としておく。

iRubyKaigi

出発直前に入れてみたが、自分の参加したいセッションを整理するのにとても便利だった。
作者様ありがとうございます。

すてきな会場の雰囲気

心浮き立つような祭りの空気があった。
と言っても別に騒がしいわけではないんだけど、なんか良い雰囲気だった。

廊下にいくつか机といすが並べられていて、作業スペースとしてもいいかんじに見えた。
参加したいセッションがなくても、思い思いに作業しつつ時間をつぶせるかんじ。

ぶらっと好きなときにやってきて、ぶらっと好きなときに帰れるような気楽な空気でもありました。
文化祭とかが感覚としては近い?

スタッフさんたちの対応も気持ちよくてよかったです。
運営ほんとうにお疲れ様でした。

2010-07-08

RubyのoauthでSignature検証

なんかサンプルコードが見つからなかったので書いておく。

OAuth::Signitureというクラスが利用できる。

require 'oauth'

def verify(request)
  consumer = OAuth::Consumer.new(
    'SOME CONSUMER KEY', 'SOME CONSUMER SECRET',
    :site => 'http://api.example.com'
  )

  headers = oauth_headers(request)
  signature = OAuth::Signature.build(request) do
    [headers['oauth_token_secret'], consumer.secret]
  end

  signature.verify
end

def oauth_headers
  headers = {}
  request.env['HTTP_AUTHORIZATION'].split(',').each{|item| k, v = item.split('='); headers[k.strip] = v.gsub(/"/, '')}
  headers
end

OAuth::Signature.buildの部分は

signature = OAuth::Signature.build(request) 

だったり

signature = OAuth::Signature.build(request) do
  [nil, consumer.secret]
end

でよかったりすることもあると思いますよ。

コード解説

requestって何者

requestはRailsのコントローラ内で使えるものをそのまま渡せる。

Sinatraなどの場合もrequestという名前で定義されているものを基本そのまま渡せるが、以下のrequireが必要。

require 'oauth/request_proxy/rack_request'

requestは内部的にOAuth::RequestProxy::Baseのサブクラスに適宜変換される模様。

oauth_headersメソッド

oauth_headersメソッドはoauth_token_secretが取れなかったので作ったメソッド。

他のoauth_tokenなどの値はOAuth::RequestProxyを使うと取得できる。

request_proxy = OAuth::RequestProxy.proxy(request)
request_proxy.oauth_token
request_proxy.signature

などで取れるんだけど、なんでかoauth_token_secretは取れず。

自前でSignatureを求める

ついでにSignature Base Stringから自分で求めてみる方法も。

Signatureがどうしても一致しない場合の原因究明をする場合などに、自前でやる方法は把握しておくと役に立つ。
# というかRubyのoauthのドキュメントが整備不足なのでこのあたり自前実装している人が多いような気がする。

require 'openssl'
require 'oauth'

def my_signature(consumer, request)
  headers = oauth_headers(request)
  signature = OAuth::Signature.build(request) do
    [headers['oauth_token_secret'], consumer.secret]
  end

  digest = OpenSSL::Digest::Digest.new("sha1")
  secret = "#{escape(consumer.secret)}&#{escape(headers['oauth_token_secret'])}"
  signature_string = Base64.encode64(OpenSSL::HMAC.digest(digest, secret, signature.signature_base_string)).chomp.gsub(/\n/, "")
end

def escape(value)
  URI.escape(value.to_s, /[^a-zA-Z0-9\-\.\_\~]/) # Unreserved characters -- must not be encoded
end 

# oauth_headersは略

上記コードの自前Signatureを求めるあたりはroauthから拝借した。

Signature Base String求めるとこは手抜きして既存のOAuth::Signatureを使ったもので。
まあSignature Base Stringがおかしい場合は目視でわかるので、自分でSignature計算する前にまずはそこを見てみればいいのかも。

2010-05-27

RubyKaigi 2010 個人スポンサー募集開始

日本Ruby会議2010

http://rubykaigi.org/2010/ja/

つい先ほどから個人スポンサーの募集が始まりました。
「参加登録する」のボタンから遷移するという難易度の高い募集となっております。
自分は知人のついったから直で行きましたが。

で、小一時間個人スポンサーになるか悩んだ後、悩むのがめんどくさくなってえいやと登録しました。
日頃お世話になってるRubyにせめてもの恩返しと考えればまあ高くはない。そう高くはないんだ。高くないはずだ。

当日いくかどうかは実はまだ決めてません。
筑波に行きたしと思へども筑波はあまりに遠し。

ついでにPaypalのアカウントを登録してしまったので、Vimperatorの作者に10ドル寄付してみたりしようと思います。

追記

なんかスポンサーのところに名前が載ってるのをみるとニヤニヤするw

2009-02-02

RubyGems 1.3.1への更新

気がついたらいろんな環境で繰り返しやっているのでメモ。

いつのまにやらrubygems本体が昔の方法(gem update –system)では最新版に更新できなくなっていて

$ update_rubygems

なるコマンドで更新するようになっている。
このコマンドは以下のようにしてインストールする必要がある。

$ gem install rubygems-update
2008-04-09

CentOS 5.1でGruffのインストール

Railsでグラフを書いてみようと思った。

棒グラフ限定ならCSS Graphsというプラグインがあって、これは他のライブラリのインストール等なくすぐ使えるのでお手軽。

しかし折れ線グラフを書きたいのです。
そこでちょいと調べてみるとGruffというのがスタンダードっぽい。

Gruffを使うにはRMagickが必要で、RMagickにはImageMagickが必要なので、まずはそれらのライブラリの準備から。
さらに途中でTrueTypeフォントを入れる必要もあったのでそこらへんも。

ImageMagickを入れる

$ sudo yum install ImageMagick ImageMagick-devel

ImageMagick自体はこれでさっくり入った。
RMagickを入れるときにヘッダファイルも必要なのでImageMagick-develも入れてある。

RMagickを入れる

続いてRMagick。gemが用意されているので簡単。

$ sudo gem install rmagick

と、思いきやパッケージで入れたImageMagickのバージョンが6.2.8なのでうまく入らないという罠が隠されていた。
上の方法でRMagickを入れようとするとVer.2系が入るので、Ver.2が要求するImageMagick6.3.0以降が必要になる。

ImageMagickを入れたときの依存するライブラリの多さからして、ImageMagickのバージョンを上げるというのは茨の道に思われたので、それは却下。
RMagickをなんとか入れる方法をさぐることにする。

しかしパッケージのバージョンが古いせいでこういう面倒が起きたりするとDebianとかがうらやましくなるね。

Rmagick 1.15.3を入れようとしてまた罠

以下のページを参考に。

次のようにするとVer.1系が入るという。

sudo gem install rmagick -v 1.15.3

しかしなにやら入らない。情報が古いのだろうか。
とりあえず単にgemが見つからないというエラーだったのでgemファイルを落としてきて入れる。

$ wget http://rubyforge.org/frs/download.php/32328/rmagick-1.15.13.gem
$ sudo gem install rmagick-1.15.13.gem

しかしまたしてもインストールできない。エラーが出てしまう。
エラーメッセージの内容を読むにTrueTypeフォントが入ってないせいらしい。

やれやれだぜ。

フォントを入れる

とりあえずまずはフォント関連のパッケージを見てみたが、何が何やらよくわからない。フォントのことはよくわからんな。
そこで以下のページを参考にMSの配布しているMicrosoft’s TrueType core fontsを入れることにした。

Personal Fedora Core 6 Installation Guide

ここで配布されているRPMを落としてきて

$ sudo rpm -ivh msttcorefonts-2.0-1.noarch.rpm

インストールすると/usr/share/fonts/msttcorefonts以下にフォントファイルができるので、これをRMagickのgemが要求する/usr/share/fonts/defaults/TrueType以下にコピーする。
それから再び

$ sudo gem install rmagick-1.15.13.gem

これでようやくRMagickが入った。

Microsoft’s TrueType core fontsのライセンスについて

ところでこれって合法的なの?と気になったのでちょっと調べてみる。

bitWalk’s: Smart package of Microsoft’s core fonts

フォントを何かに組み込んで再配布しなければ問題ないようだ。よかったよかった。

Gruffを入れる

RMagickが入ってしまえばあとは難しいことはなし。

$ sudo gem install gruff

サンプルコードを試すとさくっと使えた。ヤター。

参考

2008-03-19

RubyでXML-RPCを使ってweblogUpdates Pingを送る

ブログの更新通知などに使われているweblogUpdates PingをRubyで送ることを試してみた。
特に目新しいことはないけど自分用メモ。

XMLRPC::Clientを使えば簡単に送ることができるようだ。

Pingサーバ

とりあえず以下のPingサーバに送ってみる。

  • http://rpc.technorati.jp/rpc/ping
  • http://api.my.yahoo.co.jp/RPC2
  • http://blogsearch.google.co.jp/ping/RPC2
  • http://blog.goo.ne.jp/XMLRPC

コード

以下が全コード。

require 'xmlrpc/client'

ping_servers = [
  "http://rpc.technorati.jp/rpc/ping",
  "http://api.my.yahoo.co.jp/RPC2",
  "http://blogsearch.google.co.jp/ping/RPC2",
  "http://blog.goo.ne.jp/XMLRPC",
]

ping_servers.each do |ping_server|
  client = XMLRPC::Client.new2(ping_server)
  begin
    res = client.call("weblogUpdates.ping", 'ひげろぐ', 'http://brass.to/blog/')
  rescue Exception => e
    res = {"message" => "#{e.class}: #{e.message}", "flerror" => nil}
  end
  p ping_server
  p res["message"]
end

XMLRPC::Client.new2でインスタンスを作って、callでリクエストを送る。
引数は見ての通り。

例外補足はPingサーバにつながらなくてソケットエラーとかもあるのでざっくり実装した。

レスポンスの見方

結果は以下のようなハッシュで返ってくる。

キー 内容
“message” ThanksとかOKとかInvalidとか人が読める結果
“flerror” 成功したら true 失敗したら false

XML的にはこんなのらしい。

<methodResponse>
<params>
<param>
<value><struct>
<member><name>flerror</name>
<value><boolean>0</boolean></value>
</member>
<member><name>message</name>
<value><string>Thanks for the ping.</string></value>
</member>
</struct></value>
</param>
</params>
</methodResponse>

実際はバックグラウンドで動かす処理だろうからこの内容をログに書いとけばいいだろうね。
Railsだったら

logger.info res["message"]

とか。

参考

2008-01-23

rubygems 1.0.1でrequire_gemが終了してた

新しく環境を作ってrubygemsの最新バージョンを入れて既存のRailsアプリを動かしてみたらエラー発生。

かなり前からアナウンスされていたように「require_gem」が使えなくなって「gem」一本になった模様。
本番環境で適当にrubygemsのバージョンをあげると大変なことになるかもですな。

ちなみにエラーを起こしたのはフィードのパースに使っていたfeedtools。
メンテされているライブラリならほぼ対応されていると思われるけれども、このライブラリは製作者がメンテを投げているので(引継ぎ募集とかしてたような)こういう事態に。
問題あるのが1ファイルだけだったので手でさくっと修正しときました。

rubygemsのバージョンをあげる前には自作のコードでも「require_gem」使ってないか要注意だなぁ。

copyright brass.to | powered by WordPress ME