2012-02-18(土) [長年日記]
■ T-POINTを取得するスクリプトをGistから移動
かれこれ2年も前に書いたT-POINTを取得するスクリプト、さくらのレンタルサーバ上のcronで毎朝動かしていて、調子のいいときはちゃんとKayac経由で毎朝Gmailにメッセージが飛んきてるんだけど、なければないで困らないこともあり、何かトラブルがあって届かなくなっても気づかないんだな、これが。今日も、poppenさんがパッチを送ってくれてはじめて「そういえば最近見なかったなぁ」と気がつくしまつ。
で、ちゃんと継続的に使ってくれてメンテもできる人がいるならいっしょにやりやすくすればよかろう。スクレイピングのスクリプトは継続的にメンテできないとすぐに陳腐化するからな。ということで、他のポイントサービスのデータも合わせてスクレイピングできるように元のGistからpoints-scraperリポジトリに移動、ついでにGem化した:
% gem install points-scraper
まだpoints-tpointスクリプトしかないけど、たぶん今後、楽天やANA用のをpoppenさんが実装してくれるはず(笑)。なお、自前の環境(さくらのレンタルサーバ)では、どうしたことかOpenSSL::SSL::SSLErrorが出て動かないのであった。あそこはFreeBSDなのでよくわからん。Herokuに移植するかなぁ。
それにしても、こうしてGistから正式なプロジェクトに昇格させたい場面でいい感じに引っ越せるようにならんかな、GitHubは。というか本当に断片的なもの以外は最初からプロジェクト化しておけってことだよなぁ。
■ Bundlerを使ったGem作成メモ (自分用)
↑のgemを作るにあたって、(ほんの数カ月前にやったにもかかわらず)またgemの作り方をググって、「ああ、そういえばそうだった」みたいなことをやって馬鹿馬鹿しいので自分用にメモっておく。とにかくgemの作り方はここ数年でさまざまなツールが出ては消えていき、はっきりいってホビープログラマとしてはいちいち追いかけてなんていられない状況だったのだけど、最近はBundler一択っぽいのでこれでしばらく固定でいいやもうという感じ。
テンプレートの作成
Gitのリポジトリ作成からgemspecファイルの生成まで、ひととおりのテンプレートを作ってくれるbundle gemコマンドを使う:
% bundle gem hoge create hoge/Gemfile create hoge/Rakefile create hoge/.gitignore create hoge/hoge.gemspec create hoge/lib/hoge.rb create hoge/lib/hoge/version.rb Initializating git repo in /home/sho/src/hoge % cd hoge
もし既存のリポジトリを使う場合は……上で生成されたファイルをコピればいいのかな。ところで.gitignoreに「Gemfile.lock」が含まれている(つまりリポジトリには含めない)んだけど、これをリポジトリに含める場合と含めない場合の判断基準がよくわからん。tDiaryは含めてるようだが。
version.rb、gemspecなどの書き換え
ライブラリの場合はもう、libの下に必要なファイルが生成されているので、好きなように書き換えればよろしい。重要なのはlib/hoge/version.rbで、この中身がgemのバージョンになるので、アップデートのたびに適切なバージョン番号に書き換える:
% cat lib/hoge/version.rb module Hoge VERSION = "0.0.1" end
なお、コマンドの場合はbinの下に入れるが、それがそのまま実行されるわけではなく、gem installするとそのファイルへのruby的なラッパーが生成される点に注意が必要。つまり、バイナリのコマンドやシェルスクリプトを入れてもうまく実行されない。
それから*.gemspecを書き換え。最低限「TODO」と書かれているところは要修正。あと、同時にインストールさせたい依存gemなんかもs.add_runtime_dependencyを使って指定しておく。依存gemはGemfileに書くのも忘れずに。
あとはテストも書くといいですね(棒)。
gitへコミット
必要なものが揃ったら、commitできる:
% git commit -a -m 'first commit.' [master (root-commit) 8a106b1] first commit. 6 files changed, 41 insertions(+), 0 deletions(-) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Rakefile create mode 100644 hoge.gemspec create mode 100644 lib/hoge.rb create mode 100644 lib/hoge/version.rb
また、Bundlerがリモートリポジトリの扱いもうまくやってくれるので、GitHub上にリモートリポジトリも追加しておくべきである:
% git remote add origin git@github.com:tdtds/hoge.git
gemのビルド、インストール、リリース
BundlerがRakefileを生成してくれているので、それを使えばgemのビルド、インストール、リリースまでが行える。まずはビルド:
% rake build hoge 0.0.1 built to pkg/hoge-0.0.1.gem
それからインストール:
% rake install hoge 0.0.1 built to pkg/hoge-0.0.1.gem hoge (0.0.1) installed
ちゃんとインストールできて使えるかどうか確認したら、リリース:
% rake release : :
バージョン番号でタグを打ち、リモートリポジトリへpushをし、rubygems.orgへの公開まで一気にやってくれる(ので、利用する側はもう「gem install hoge」を実行するだけで良い)。以降、メンテのたびにversion.rbを書き換え、rake releaseをすれば更新作業はおわりである。楽チンになったもんだねぇ。
`bundle gem` コマンドだけ覚えておかないと忘れる。`rails create` みたいに `bundle create` とかになればいいんだけどなあ。
bundle createだと、何をcreateするのかわかんないぞ。と思ったけど、gemを管理するツールなんだから「gemをcreateする」という意味でも不自然ではないか……。
Gemfile.lock はライブラリなら含めない、アプリケーションなら含めるというのを wycats が何処かで言っていて、実際にその通りだと思います。
しかし開発者がの環境で生成したGemfile.lockが、ユーザの環境でも適切とは限らないよね、という話を先日Facebookでしたんだよね。開発はLinuxで運用がWindowsとかさ。依存するライブラリが異なる場合はlockを配布されても意味がないんじゃ?
>開発はLinuxで運用がWindowsとかさ。
で
>依存するライブラリが異なる場合
な場合は Gemfile で細かく pratform 指定して lock ファイルを作成しますねえ。
あと、lock ファイルは開発者がその状態で動作確認をしておるというだけの話なので、ユーザーの環境が大きく異なるのであれば、結局、ユーザー自身が再生成して頑張ることになるかなあ。
gem依存はGemfileに gemspec とだけ書くと、specから拾ってくれます。
> hsbt
ようするに「lock」という名前が本質にふさわしくないからこういう話になるんだと自分の中では結論づけた(笑)。
> さく
がーん、そうか、あのコメントはそういう意味だったんだ。これからは手抜きできます!
> OpenSSL::SSL::SSLError
Rubyが古くてSNI対応してないとかかな。http://bugs.ruby-lang.org/issues/4351
> Gemfile.lock はライブラリなら含めない、アプリケーションなら含めるというのを wycats が何処かで言っていて
http://langturn.com/translations/33?locale=ja ですね。
> naruse
いちおうこないだ出たばかりの1.9.3p125なんですよね。でも野良ビルドなので、たぶんOpenSSLに関するconfigが合ってないんだと思います(つまりおれのせい)。「read server certificate B: certificate verify failed」とか言ってるし。でも深追いする気力は当面なし。
あと、wycatsの文章、けんめいに英語で探したのにまさか翻訳があったとは(笑)。助かりました。いちおう理解したつもりだけど、ここで使われている「アプリケーション」の概念が読み手によって幅がある気がしますねぇ。アプリかGemかではない別のなにかを判断基準にするのがふさわしいような。
> いちおうこないだ出たばかりの1.9.3p125なんですよね
config は関係無いのでー、openssl のバージョンですね。
さくらのレンタルサーバが0.9.8eのところ、0.9.8f以降が必要だそうな。
http://seclan.dll.jp/dtdiary/2007/dt20071015.htm
> 「アプリケーション」の概念が読み手によって幅がある気がしますねぇ。
依存関係の終端かどうかなので、まぁ普通は「アプリケーション」じゃないですかねぇ。