2006-11-01
■ [Plagger] PlaggerでCVSのコミットログをIRCに通知する
さて、SVNが出来たらCVSもやりたくなるのが人の常。というか、サークル内のプロジェクトでまだCVS使ってるものも結構あるので。
ところが、CustomFeed::CVSLogってのは今のところ存在しないようだ。CPANならCVSを扱うライブラリくらいあるんじゃないの? と思ったが、なんと $cvs->log() だけ実装されていない。がーん。
仕方が無いので、cvs rlog の出力結果からフィードを生成することにする。 PlaggerのプラグインはPerlで書く人が圧倒的だったけど、Rubyで書かせてもらいます。サイレントマジョリティ(ry
- ダウンロード : customfeed-cvslog.rb
リポジトリのアドレスを渡すと、コミットログをyaml形式(utf-8)で標準出力に出力します。 Plaggerから使うときは以下のような感じで。
plugins: - module: Subscription::Config config: feed: - url: "script:/somewhere/customfeed-cvslog.rb /cvs/yhara proj -t 'cvs log of proj'" - module: CustomFeed::Script ...
詳細
usage: ./customfeed-cvslog.rb cvsroot repository [options]
cvsrootにはCVSROOTのあるディレクトリを、repositoryにはモジュールを指定します。
オプション:
- -r, --reverse
- コミットを新しい順に表示します。
- -t "hoge", --title "hoge"
- フィードのタイトルを指定します。
- -d 7, --days 7
- 何日前のコミットまで表示するかを指定します。デフォルトは2です。2より小さい値は指定できません。
例:
./customfeed-cvslog.rb /cvs/yhara proj -t 'cvs log of proj' -r ./customfeed-cvslog.rb :pserver:anonymous@rubyforge.org:/var/cvs/rrb rrb -d 1000
仕様
基本的にはcvs rlogして、ファイルごとに切って、さらにリビジョンごとに切って、それらをコミットごとに分類している だけです(CVSは複数ファイルのコミットに対して同じログが各ファイルごとに表示されるので、ユーザー名・時刻・メッセージが 同じものを一つにまとめる)。Perlへの移植も別に難しくないと思われます。
(11/3 追記:yamlの例に「url:」が抜けていたのを修正)
■ [ruby] いやあ
こんなこと(customfeed-cvslog.rb)してるうちに、OptionParserにえらい詳しくなってしまったw usageの表示をカスタマイズできるとか知らなかったよ。
webには載ってないんだけど、 optparse.rbのソースにはもっと長い使用例が書いてあります。OpenStructの便利さに目覚めてしまいそう。
2006-11-05
■ [ruby] p strってやると日本語が読めなくてうぜえ!という時に
class String def inspect '"' + self + '"' end end p(:message => "ほげほげ")
before:
{:message=>"\202\331\202\260\202\331\202\260"}
after:
{:message=>"ほげほげ"}
(11/7追記:$KCODEを設定しておけば同等の効果があるらしい! 知らんかった!)
yhara@meteor:~ % ruby -Ke -e 'p(:message => "ほげほげ")' {:message=>"ほげほげ"}
2006-11-08
■ [softs] 暇だからPuTTYを256色にしてみる
いや暇じゃないけど。
参考:
- http://subtech.g.hatena.ne.jp/secondlife/20060313/1142237563
- http://qootas.org/blog/archives/2006/03/256_colors_putt.html
- http://unknownplace.org/memo/2006/03/20#e002
- http://frexx.de/xterm-256-notes/
準備
Debianの場合はとりあえずncurses-termを入れれば良いらしい。
PuTTYの設定
3.putty の xterm-256 を使うのチェックを入れる
4. putty の端末タイプの文字列を xterm-256color に
[ピンク ブロッサム ダイアリーより引用]
試してみる
なんという256色… 画面を見ただけで感動してしまった
screenの設定
aptで入れると256色がONになってないらしいので、上の記事に従ってdebuildするか、ソースを取ってきてコンパイルする。 僕は後者で。
% ./configure --prefix=/home/yhara/bin/screen --enable-colors256 % make % make install
で、.screenrcに追記。
## http://frexx.de/xterm-256-notes/
# erase background with current bg color
defbce "on"
# do not use 'screen-bce'
term xterm-256color
[qootas.org/blogより引用]
screen内で256colors2.plを実行して綺麗に見えればOK。
ちなみに失敗するとこうなるw
■ [misc] 朝がしんどいのだが
「予定の1時間前に目が覚めてしまった」ときは、二度寝するより起きてしまった方が (多少、睡眠時間が減るとしても)楽らしい。
人間の睡眠は90分周期なので、二度寝すると深い眠りのときに起こされることになって云々。
確かにそうかもなぁ。
■ [softs] ファイラ
GUI(ツリー&リストビュー)とCUI(コマンドライン)が合体したようなファイラーとか作れないかな。
いつもはまめFileを愛用してるのだが、たまに cd / とか rm *~ とかやりたくなる。
2006-11-09
■ [kmc] KMC部員のオープンソース貢献度
こういうので分かると田畑さんに教えてもらった。
もうちょっと昔のはこちら。
もっとyhara@..を増やしたい…と思ったが、ソースはどっから取ってきてるのかな。sourceforge、CPANあたりは 確実そうだが。
2006-11-10
■ [ruby] RedGreenでTest::Unitを色つきにする
RedGreenは、RubyのTest::Unitの出力に色をつけるソフトウェアです。
ruby test_hoge.rb とする代わりに、 rg test_hoge.rb とします。
画像はエラーのときの例です。テストが全て通ると、最後の7 tests, 6 assertions...の行が緑色になります。
インストールはRubyGemsで。
gem install redgreen --source require.errtheblog.com
公式サイトは… http://errtheblog.com/post/15 でいいのかな。
(参考:http://subtech.g.hatena.ne.jp/secondlife/20061106/1162823696)
■ [ruby] ZenTestまとめ
最近あちこちで名前を目にするZenTestについてちょっと調べてみた。
一言でいうと、「Test::Unitをもっと楽に使うためのソフトウェア」。
Rails用のソフトなのかと思ってたが、どうもRails以外でも便利に使えるらしい。
2006-11-14
■ [softs] Livedoor Reader を使い始めました
はてなRSSからLivedoor Readerに乗り換え。前者は「お気に入りのフィードだけ読む」のに適してて、 後者は「とりあえず突っ込んどいて流し読みする」のに適していると思う。
本当に数十分で1000未読捌けるのか挑戦しようと思ったんだけど、頻繁に「更新」ボタン押すので1000件も溜まらない罠。 この暇人め!>俺
2006-11-20
■ [ruby] Ruby関係のMLまとめ
まとめてみた。
■ [Ruby/SDL] Ruby/SDLで枠がないウィンドウを作る
■ Ruby/SDL
でウィンドウ枠がない描画ってできるのかなぁ。できたら偽 IRCV も作れる気がする気がする。
大林さんに聞いてみたら、SDL::NOFRAMEという定数を使うと ウィンドウ枠なしが指定できるそうで。
require 'sdl' module SDL; NOFRAME = 0x20; end # 注:現バージョンのRuby/SDL 1.2.0ではSDL::NOFRAMEが定義されてないというバグが # あるので、自分で0x20と置いています^^; 次のリリースでは直るそうです。 SDL.init( SDL::INIT_VIDEO ) screen = SDL.set_video_mode( 300, 200, 16, SDL::NOFRAME ) loop do while event = SDL::Event2.poll exit if event.is_a? SDL::Event2::KeyDown end 10.times do |i| col = (i%2==0) ? [0,255,255] : [255,255,0] screen.fill_rect(0,i*20,300,200/10, col) end screen.flip end
実行結果はこんな感じになります。
が、ウィンドウの表示位置を指定することができないし、ウィンドウの透過とかもできないので *1、結論は「Ruby/SDLでウィンドウ枠がない描画はできるが、偽IRCVは難しそう」ということで。
*1 そもそもSDL(libsdl.org)のターゲットはフルスクリーンで表示するようなアプリケーションなので
□ znz [http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name..]
2006-11-21
■ [Ruby/SDL] Test::UnitでFPSTimerのバグを調査してみた
1秒間のフレーム数を一定にするために Ruby/SDLのチュートリアルにあるfpstimer.rbを使っていたのだが、 なんか描画が重いときに実FPS(描画FPSじゃなく)が60切ってる気がしたので、Test::Unitを使って調べてみた。
require 'test/unit' require 'fpstimer.rb' class TestDebugMessage < Test::Unit::TestCase #描画が十分軽いときに、実FPS = 描画FPS = 60 となることを確認 def test_fpstimer @timer = FPSTimer.new(60) fr, dfr = do_task_1sec() assert_equal 60, dfr assert_equal 60, fr end #描画が重いときも、実FPSは60くらいになることを確認 def test_fpstimer_heavy @timer = FPSTimer.new(60) fr, dfr = do_task_1sec(proc{sleep 0.02}) skipped = @timer.total_skip puts "drawed #{dfr} frames of #{fr} (#{skipped} skipped)" assert_equal fr, dfr+skipped assert_in_delta 60, fr, 2 #58〜62 end #1秒間の実フレーム数と描画フレーム数を計測する def do_task_1sec(draw = proc{}) @timer.reset frames = 0 drawed_frames = 0 start = Time.now while (Time.now - start < 1) frames += 1 @timer.wait_frame do draw.call drawed_frames += 1 end end [frames, drawed_frames] end end
実行してみると「60 wanted but was 47」となったので、やっぱり実FPSが落ちているらしい。sleep 0.7とかで試してみて、 どうも「1回描画をスキップしただけでは足らない」というケースにバグがあるらしいことが分かった。
とIRCで報告したところで、大林さんが何か気付いた模様。現在チュートリアル|[[Ruby/SDLのチュートリアルに 上がっているバージョンでは上のバグは直っています。
何が言いたいかって?えーと……、ゲーム開発でもテストが役立つことはあるよってことで。
■ [memo] プライベートなリファラ
メモ。
ブクマ
%r<\Ahttp://b.hatena.ne.jp/add\?>, %r<\Ahttp://b.hatena.ne.jp/[^/]+/add\?>, %r<\Ahttp://bookmark.fc2.com/user/post\?>, %r<\Ahttp://clip.livedoor.com/clip/add\?> %r<\Ahttp://del.icio.us/[^\?]+\?(.*)url=>,
RSSリーダ
%r<(freshreader|fr)(.*)feedshow(cat|all)?.php\?>, %r<\Ahttp://feedbringer.net/feed>, %r<\Ahttp://feedpath.jp/feedreader/>, %r<\Ahttp://reader.livedoor.com/subscribe/>, %r<\Ahttp://www.bloglines.com/myblogs_display\?>, %r<\Ahttp://www.google.com/reader/view/>,
プライベートアドレス
%r<\Ahttp://localhost>, %r<\Ahttp://[^\./]+/>, # http://マシン名/ みたいな
「.」をエスケープしてないのは仕様。
2006-11-23
2006-11-24
■ [Ruby/SDL] 普通のオブジェクトへの特異メソッド定義とか
いつ使うんだよwと思ってたが、簡単なMockを作るときに使えそうだ。
Ruby/SDLでジョイスティックを扱うときは SDl::Joystick のインスタンスを使う。
if SDL::Joystick.num > 0 @joystick = SDL::Joystick.open(0) #1つめのパッド(1コン)を初期化 end
で、@joystick.axisや@joystick.hatで十字キーの情報が得られる*1。
が、上のコードだとパッドが刺さってないときに@joystickがnilになり、@joystick.axisが呼ばれた瞬間にNameErrorで落ちてしまう。
そこで下のようなコードを書くと、「axisとhatというメソッドを持つオブジェクト」を3行で簡単に作れる。
if SDL::Joystick.num > 0 @joystick = SDL::Joystick.open(0) else @joystick = nil #ダミーのジョイスティックをつくる def @joystick.axis(i) ; 0 ; end def @joystick.hat(i) ; nil ; end def @joystick.button(i); false; end end
なんとなく気持ち悪い気がしないでもないが(笑)
*1 axisとhatのどっちを使うかはパッドによるが、axisを使うものが多いようだ
2006-11-28
■ [kmc] NFお疲れ様でした
NFというよりコーディング合宿だったんだが…w
個人的には打ち上げで新勧の話が出ていたのが嬉しかった。 KMCの新勧がまだまだヘボいのは事実なので*1、 若い人から改善案が出るのは非常に良いことだと思う。
まぁ、酒の席で終わらせずに、実際に頑張ってくださいということで(^^; 期待しています。 一年で一番盛り上がるイベントはNFだけど、一番重要なイベントは新勧なので。 *2 声かけが苦手な人でも、外部ページを更新するとか、魅力的なビラを描くとか、他人に催促して働かせるとかw、 それぞれの得意なやり方で新勧に貢献してくれればと思います。
そろそろ僕もOBになるんかなぁ。
■ [kmc][Ruby/SDL] Rubyのプロジェクトやってる人は
Rubyコーディング規約に一度目を通しておくと良いと思います。 「文法上はどっちでも書ける」ようなことを「こっちにしましょう」というのが羅列してあります。
あくまでも一例なんでどっちでもいいものまで定義されていますが、「ふつうのRubyプログラム」が どんな風に書かれているのかを知るには手っ取り早いんじゃないでしょうか。
あとは青木さんスタイルとか。
■ [softs] 後輩に薦めるべきエディタが分からない
Unixならとりあえずemacsっつーか、emacs使えるならWindowsでもxyzzy薦めときゃいいんだけど。*1 普段gvim使ってるから自分のエディタが薦められない。(^^; *2
最低条件としては
- euc-jpおよび改行LFに対応している
- シンタックスハイライト(予約語とかを色付けしてくれる)
- オートインデント(自分でスペース連打しなくて良い)
- それらがRubyに対応している
くらいで。(C++/C#の人はVisualStudio使うよね)
まぁオートインデントにもいろいろあって、強いやつなら
- if のあとに改行すると自動的にスペース2個分下げてくれる
- end[ENTER]って打つと自動的にスペース2個分左にやってくれる
- 指定範囲を一気にインデントしてくれる
とかあるんだけど、「改行したら自動的に前の行とインデントをあわせてくれる」くらいあればまずまず快適でしょう。
ていうか指定範囲をインデントってWindows系のエディタでできるやつあるんかなぁ。
□ ohai [-K or $KCODE で]