2009-03-31(火) [長年日記]
■ gist上のforkをmergeする
こないだ適当に書いたスクリプトがno6vさんによってforkされた。せっかくなのでgitでのパッチの取り込みをやってみる。gistも普通のgitなリポジトリなので、操作は同じ。
リモートリポジトリを指定していきなりpullするのもいいのだけど、ちゃんと差分を確認してからmergeするなら、まずはremoteに加えてからfetchなんだろう。ということで、no6vという名前でremoteリポジトリを作成して、そこにfetch:
% cd src/mobile_supers % git remote add no6v git://gist.github.com/87620.git % git fetch no6v remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From git://gist.github.com/87620 * [new branch] master -> no6v/master
no6v/masterというブランチができて、gist上と同じ内容になった、ということ。これで手元で差分が見られる:
% git log -p master..no6v/master
ページャで差分が表示される。インデントがソフト2タブに変わってるので差分になってない! ><
……とはいうものの、内容に不満はない。というか、tapを使った配列の初期化とか、openのブロック引数の書き方とかカッケー。1.9スタイルをまざまざと見せ付けられたぜ。日ごろからちょっと古いrubyでも動くコードしか書かないだから新鮮だわ。
で、merge:
% git merge no6v/master Updating e3bfa90..562ee0f Fast forward mobile_supers.rb | 44 ++++++++++++++++++++------------------------ 1 files changed, 20 insertions(+), 24 deletions(-)
あとはcommitしてpushする:
% git commit -a -m "merged no6v's patch." Created commit 8529945: merged no6v's patch. 1 files changed, 30 insertions(+), 30 deletions(-) rewrite mobile_supers.rb (81%) % git push Counting objects: 8, done. Compressing objects: 100% (4/4), done. Writing objects: 100% (6/6), 1.19 KiB, done. Total 6 (delta 0), reused 0 (delta 0) To git@gist.github.com:87404.git e3bfa90..8529945 master -> master
と、gist上のコードも新しくなってる。ふむふむ。gitの良さがわかってきた。
ついでにgist.rbプラグインのテスト。なんで3タブで展開しないのかと小一時間(ry:
2009-03-30(月) [長年日記]
■ RubyKaigi'08タンブラーが寿命を迎える
昨年のRuby会議でノベルティにしたタンブラー、会社で使っていたんだけど、水漏れがひどくなってとうとう寿命に。まるで発表者の選考を待っていたかのようである。いや、水漏れは前からあったんだけど。
ノベルティが短命なのはしかたがないとはいえ、一昨年のバッグなんてまだ現役だしなー。せめて2009の本番くらいまでもって欲しかったぜ。
ちなみに後任は、以前かみさんがもらってきたAmazonのステンレス製タンブラーです。またノベルティか!
2009-03-29(日) [長年日記]
■ Jリーグの試合速報を携帯で見やすくする
スーパーサッカーの速報をスクレイピングして、シンプルなテキストを吐くスクリプトを書いただけなんだけど(ソース@gist→mobile_supers.rb)。相当シンプルにしてあるので、スタジアムの混雑した電波状態でも快適……なはず。来週の名古屋戦で試す。
自宅サーバが死ぬまでは別の(もっと泥臭い)スクリプトでやっていたんだけど、最近けっこうまともなHTMLになったようなので今回からちゃんとNokogiriを使った。
とはいえ、これを短間隔のcronで回すというのも芸がない。というか、試合やってないときまでアクセスさせたくない。かといって、CGIにして毎回動的に作らせるのも、相手サイトの負荷が高いときのレスポンスが気になる。で、
- 最短5分間隔で最新情報を見られるようにする
- それより短い間隔でアクセスしても静的ファイルが返るだけ
という運用方針のもと、実現するためにたつをさんのキャッシュ方式を参考にして.htaccessでmod_rewriteを設定した。まぁ、ほとんど丸写し:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/football/score\.txt$ /cgi-bin/update-score.cgi [L]
update-score.cgiはこんな感じ:
#!/usr/bin/ruby require 'nkf' require 'mobile_supers' text = NKF::nkf( '-s -Z1', Jleague.miniscore2mobile ) open( '../football/score.txt', 'w' ) {|f| f.write( text ) } print "Content-Type: text/plain; charset=Shift_JIS\n\n#{text}"
あとは5分間隔でcronを回して、score.txtを削除すればよろしい。あとやるとすれば、リンク先も同じように見られるように拡張するとか、そんなところか。
■ 単体ファイルのソース管理にGist + gistyを使う
上のような「プロジェクトにするほどでもない」プログラムを公開したり、ソース管理したいときにはGitHubのGistが便利なんだけど、gistyを入れるとさらに便利になる。
Gistの使い方やgistyのインストール方法はあちこちで書かれているので略。cloneされたGistのプロジェクト(?)は数字列で可読性が低いので、symlinkを張るといいね:
% echo $GISTY_DIR /home/sho/src/gists % cd ~/src % ln -s gists/87404 mobile_supers
いつものように、防火壁の内側からproxy経由のsshでGistを使うためには、~/.ssh/configに以下を追加すれば良いようだ:
Host gist.github.com HostName ssh.github.com Port 443 ProxyCommand corkscrew YOUR_PROXY_HOST YOUR_PROXY_PORT %h %p
GistのリポジトリはGitHubそのものとはホストが違うからsshサーバも別かと思ったら、これは共通でいいようだ。Corkscrewの設定など、その他のノウハウは以前の記事を参照:
◆ no6v [おぉ。gitの使い方とか勉強になります。 ソフト2タブなのはgit log -p -wで無視できると思います。]
◆ ただただし [ほんとだ! > -w あるとは思ってたけど、慌ててmergeしてしまったのでした。]