2006-10-07
■ [ruby] Ruby勉強会@関西-12
行ってきた。
- 「すごいリファレンスマニュアル(仮題)」by 青木峰郎さん
- なんで「改善」でなく「全面刷新」なのか?というと、「デカいことやった方が面白いから」だそうな。アツイ。
- 「about nadoka」by 西山和広さん
- nadokaのbotってこんな簡単に作れるのか。NadokaWiki
- 「小波ゼミ卒研ネタから」by ゼミ生のみなさん
- 難しかったです(><)しかし他人の卒論なんて分からないもんかも。
- Ruby 初級者向けレッスン第9回「Rubyで学ぼうテスト駆動開発」
- 隣の方とペアプログラミングした。こんなに真面目にテスト書いたのは初めてかも知れんw
■ [vim] RRSV
RRSEのVim版が実装できそう。
obj.kind_of?(Array)
というコードの'd'あたりにカーソルを合わせると、メソッド名が"kind_of?"でレシーバが"obj"であることを表示する、というところ まではできた。
function s:FindBeginning(src, start) let p = a:start while strpart(a:src, p, 1) =~ "\\w" let p = p - 1 endwhile return p endfunction function s:GetReceiver(src, beg) let p = a:beg - 1 while strpart(a:src, p, 1) =~ "[A-Za-z0-9_@:]" let p = p - 1 endwhile return strpart(a:src, p+1, (a:beg-p-1)) endfunction function s:GetMethodName(src, start) let beg = s:FindBeginning(a:src, a:start) let receiver = "" if strpart(a:src, beg, 1) == "." let receiver = s:GetReceiver(a:src, beg) endif let method = matchstr(a:src, "\\w*\[!?]\\?", beg+1) return receiver . "の" . method endfunction function RRSV() let s = getline(line(".")) echo "`" . s:GetMethodName(s,col(".")-1) . "'" endfunction set updatetime=600 autocmd CursorHold *.vim call RRSV()
メソッド情報のデータベースはRRSEのをそのまま使わせてもらう予定。
2006-10-10
■ [ruby] Private Pockets
danさんが開発されている「Railsゲー」であるところの Private Pockets(プラポケ)にこっそり参加しています。
Grade 1に上がった。
2006-10-12
■ [prog] Senna
「組み込み型全文検索エンジン」Sennaを試し中。
なんか*.soの読み込みができなかったんだけど、/etc/ld.so.confに/usr/local/libを追加→/sbin/ldconfig とやれば良いと 教えてもらった。
■ [ruby] Senna(2)
Senna 0.8.1に標準添付されているRubyバインディングについて調査中。
def next size,_,score = Senna::sen_records_next(@handle, 0) if size > 0 _, res = Senna::sen_records_curr_key(@handle, size) else res = nil end return res end
こういう場合はいつもdummyという変数名を使うんですが、「_」という手があったか…。(ちょっとSchemeっぽい?)
■ [prog] Senna(3)
sen_records_next()の説明が難解すぎる件。成功した場合は、 keybufが指定され、bufsizeがkey長以上であれば、カレントレコードのkeyををkeybufにコピーし、 scoreにNULL以外の値が指定された場合はカレントレコードのスコアを*scoreにセットします。
Rubyのメソッド→SWIGによるラッパー関数→SennaのC API となっていてややこしい。
まぁSWIGによるラッパー関数そのままだと「C言語風にRubyを書く」はめになってしまうので、Rubyの皮が被せてあるのは嬉しいかも。
2006-10-14
■ [misc] CodeFest京都2006
です。
去年よりも参加者が減ったけど、スタッフが増えたので総人数はそう変わらないかな。
TracのWiki記法って、箇条書きもスペース1個分インデントしないと駄目なんですねぇ。変わってる。
■ [softs] irolog 1.1.0 リリース
irolog(IRCのログビューア)の新バージョンをリリースしました。
1.1.0では、各チャンネルの最新発言を一覧表示できるようになって、より少ない手間で発言をチェックできるようになりました。
画像はイメージです。
■ [web] JavaScriptでtableの一部分を消したり出したりしたい
そんなもんtrタグのスタイルをdisplay:none; と display:block;で切り替えたらいいだけじゃね? と思ったのですが、FireFoxではdisplay:blockでは表示が変になるのでdisplay:table-row;としないといけなかったり、 IEではgetElementByName()がうまく動かなかったり(divタグに name="hoge" としても駄目なのかな)、苦労しました。
<script> var show = (navigator.userAgent && navigator.userAgent.indexOf("Gecko/") != -1) ? "table-row" : "block"; function fold_open(n){ elms = document.getElementsByTagName("tr"); for(var i=0;i<elms.length;i++){ if(elms[i].className == "fold_"+n){ if(elms[i].style["display"] == "none") elms[i].style["display"] = show; else elms[i].style["display"] = "none"; } } } </script> ... <tr><td><a href="javascript:fold_open(1);">+</a></td><td></td><td></td></tr> <tr class="fold_1"><td></td><td></td><td></td></tr> <tr class="fold_1"><td></td><td></td><td></td></tr> ...
こんな感じでとりあえず動いています。
■ [python] Python 調査報告
via enbug diary
>>> from __future__ import with_statement # with を使うため(Python-2.6では不要になる) >>> with open('/etc/passwd', 'r') as f: ... for line in f: ... if len(line) < 30: ... raise Exception('too short line: ' + line) ... Traceback (most recent call last): File "<stdin>", line 4, in <module> Exception: too short line: bin:x:2:2:bin:/bin:/bin/sh >>> f # f は with 文によってクローズ済み <closed file '/etc/passwd', mode 'r' at 0xb7d02ad0>
みんPyにもあったけど、「from __future__」ってやっぱりカッコいいですねw
しかしPythonもだんだん複雑になってないか?とちょっと心配になる。
2006-10-15
■ [softs] Plaggerインストール中
依存ライブラリ多すぎwww(しかも一発で入らないのが結構ある)
なんかTemplateが中ボスでEncode::Detectがラスボスっぽい。
- 中ボスの倒し方は http://zeromemory.sblo.jp/article/1202817.html を参照
インストールっつーか新種のゲームっぽいです。「5面がどうしてもクリアできないんだけど!」みたいな。
■ [softs] Plagger(2) Encode::Detect
Encode::Detect入った。cc1plusが無いって言われると思ったらg++をapt-getし忘れてたみたい。
参考にしたのは以下
- http://d.hatena.ne.jp/nipotan/20060821/1156142353
- http://www.emaillab.org/spamassassin/patch/spamassassin-3.1.5-normalize-test6.txt
4. 文字エンコーディング検出器Encode::Detect 配布元: http://search.cpan.org/~jgmyers/Encode-Detect/ インストール時の注意事項: - バージョン0.01ではモジュールの依存関連の記述等がいい加減であるため ビルドやテストが失敗することがあります。 そのため、予め、次のモジュールをインストールしてください。 - Module::Build - ExtUtils::ParseXS - ExtUtils::CBuilder - Test::More - Data::Dump なお、Data::Dumpモジュールに関しては実際には利用されていないため、 手動でインストールする場合は、t/encoding.tというファイルから "use Data::Dump qw(dump);"の行を削除すればData::Dumpをインストール する必要はありません。 - CPANモジュールを使ってインストールする場合の注意事項 http://mm.apache.jp/pipermail/spamassassin-jp/2006-July/000318.html より cpan を使って install Bundle::CPAN でCPANモジュール&関連モジュールを最新版にする cpan の再設定(reload cpan では有効にならないモジュールがある模様) (上記で BuildやYAMLが入ります) install Module::Build install ExtUtils::CBuilder install Data::Dump そして最後に install Encode::Detect を実行してやると入りました
■ [softs]Plagger(3) できた
install Plagger通った。
なんとなくインストール作業が楽しくなってきたので(w、プラグイン用のライブラリも頑張ってインストール中。
Hatena::KeywordはtestにCache::Fileが必要らしい。Text::Hatenaはtestが通らない。
■ [vim] Vim6とVim7の:a,:i時のautoindentの挙動の違い
「:a!」を使えばインデントされないようだ(help :a より)。
2006-10-19
■ [event][Plagger] Kansai.pm第7回ミーティング "Plagger World Tour in 大阪" レポート
Plaggerの作者である宮川さんが関西にいらっしゃるということで、 せっかくだから行ってきた。 普段Rubyしか使わないのに行っていいのかなぁとも思ったけど、「初参加の方どれくらいいますか」という質問に 会場の半分くらいが挙手してたので、きっと僕だけじゃないはず(笑)。
出町柳から京阪に乗って京橋まで。環状線の大阪駅で降りたはいいけど、地図の距離感がわからなくて迷ったあげく 10分遅刻。ただ、実際の開始は18:30だったので講演には間に合いました。開始まで宮川さんのマシンの画面が スクリーンに映っていたので、それを見てるだけでも結構面白かったw PuTTY+Screen+svk使ってるとか、 2chのPlagger中級スレ見てるとか、IRCとか*1。
以下は講演のメモです。僕が面白いと思ったところが主なので、入門的な話は一部省略しています。詳しい内容はスライドの方をどうぞ。
自己紹介
- six apart社、サンフランシスコとか赤坂とか
- 最近の仕事はvox
- CPANに上げているモジュールが120個くらいあるらしい
- 2006/3のYAPC::Asiaに始まり、YAPC::NA, OSCON 06, YAPC::Europe 等で発表→Kansai.pm(まさにWorld Tour)
導入
- 人数については、「興味あるけど使ったことはない」の層が多くてプラグイン書いてる人が1人、コミッタは0人?でした。(ちょっと残念そうだった)
- 2002年のbaseball2rss(野球の試合日程をRSSにする)から始まり、bloglines2ipodとかbloglines2gmailとかフィードを扱うソフトをいくつも書いた
- この手のスクリプトは、フィードを具体的に扱う部分以外は同じように書ける→コピペして使いまわし
- でも、エラー処理とか、If-Modified-Sinceとか、Well-formedでないフィードも扱うとかやってるとコピペ部分がだんだん大きくなる
- 自作のもの以外にも、svn2rssとか似た系統のソフトがいっぱいある (それぞれ違う言語で書かれていて、それぞれ違うバグを持つ)
- じゃあフレームワーク化しよう (→一つのバグを直せば、たくさんのソフトのバグが直ったことになる)
- rss2gmailなど、<any>2<any> (anyのどっちかがフィード) なソフトを作るためのフレームワーク = Plagger
- (余談:ここでPlaggerの新しいロゴが発表される。現行のはMozillaのライブブックマークのアイコンが入ってるので駄目らしい)
- パーザ→フィルタ→ジェネレータとUnixのパイプのように、プラグインを繋ぎ合わせて処理を行う
- ピザPlaの意義:「google検索からピザを頼むソフト」を普通に作っても応用は難しいが、ピザPlaでは「ピザを注文する処理」がプラグインになっていることでさまざまなシチュエーションでピザを頼む(笑)ことが可能になる。(プラグインが1つ増えれば、何十通りもの使い方ができる)
- 「Plaggerはインターネットのピタゴラスイッチだ」by 名無しさん@Plagger中級スレ (意味が分からない人はYouTubeへ)
このあとPlaggerのフレームワークとしての(Core)機能の紹介があったのですが、そのへんはスライド参照で(手抜き)。
インストール
- CPANに登録されているモジュールで、使えるものはできるだけ使う方針 (車輪の再発明はしない)
- 逆に、Plaggerの機能もライブラリにできるものはしてCPANに上げる
- plagger インストールの検索結果:約 773,000 件
- aptとかyumとかportsとかppmとか使うのが簡単
- パッケージマネージャが嫌いな人は >cpan install Plagger で
- というかforce install Plagger で(笑) (インストール時のライブラリのtestをスキップするんだけど、テスト通らなくてもたいてい支障はない…らしい)
開発者としても、plaggerで検索してインストール記事ばっかり出てくるのはつまんないらしいです(笑)。パッケージマネージャでその状況も改善されるかな(あとはWin32用のインストーラがあれば…!)。
チュートリアル
- スライド参照。
- フィードをGmailから読む(rss2gmail)という例*2*3
- メールで読むと何が嬉しいか?→「自分の読んだ文章」を母集合に検索することができる。あとGmailだとグルーピングしてくれるとか、差分表示とか
- フィード追加するたびにyaml編集するのは面倒→Subscription::OPMLとか、Subscription::Text(1行1つフィードのURLを書いたもの)とか
- 1000フィードぐらい読んでるので、自分のマシンでクロールすると時間がかかる→Subscription::Bloglines (新着のものだけAPIで取ってこれる)
- メールで読むとはてブするのが面倒じゃね?→Widget::Simpleというモジュールを使うと、deliciousとかはてブ用のボタンを追加してくれる
HTMLメールってSPAM業者くらいしか有効に活用してない気がしてたんですが、これぞ「正しいHTMLメールの使い方」という感じでした。
あとBundle::PlanetでPlanetなんとかを生成する話*4 とか、Filter::EntryFullTextでRSSを「本文つき」にするなど、使い方の例がいくつか。
質問タイム
Publish::iCalやNotify::Pizzaみたいに「フィード以外を扱う」プラグインもたくさんあるけど、「フィードを扱う」のがPlaggerの本来の使い方だそうです。 フィードがいくつかあって、各フィードは複数のエントリを持っていて、エントリには日付と作者があって…という風に「決まったデータ形式があるからこそ、 いろんなプラグインを互いに組み合わせることができる」とのこと。なるほどなぁ。
プラグイン紹介
- (余談:この辺で「この話するのも飽きてきてるんですよね(笑)」という爆弾発言がw 世界各地で使いまわしているプレゼン資料なんだそうな。)
- プラグインは以下の種類に分けられている。*5
- Subscription
- フィードの購読。フィード一覧を読み込むことも可能(::OPML, ::File, ::XOXO, ::Bookmarks)。
- CustomFeed
- RSS/Atom以外のものからフィードを作る。HTMLのスクレイピングとか、::POP3とか、::FlickerSearchとか
- Filter
- フィードの加工。広告の除去、リダイレクトURLの処理(::TruePermalink)とか、mp3へのリンクをenclosure*6に変換するとか。(::FindEnclosures)
- Publish
- 出力(もしくはフォーマット変換)。::MTWidget(MTのサイドバー)とか、::iCalとか。「なんとか2rss」のときはPublish::Feedを使う。
- Search
- フィードを検索エンジンに登録。MACのSpotlightとか、Estraierとか
- Notify
- 通知。Windowsのバルーンとか、有名な::Ejectとか。
それPla
- それPlaggerでできるんじゃね?
- →Plaggerでどうやるかはきいてねーよ (類義語:Greasemonkeyで(略))*7
- →じゃあPla
- ドメインの更新期限が近づいたら警告(iCalを出力) (Bulknews::Subtech)
- ア○ール (ちょww)
- Publish::PipeからFAX送信
- RubyKaigiの音声がogg→ポッドキャストのフィードを作ってiTunesへ
- Google Mapsの画像に動きがあったらメール
プラグインの作り方
- ソース嫁
- ちょっとデモ
tools/plugin-start.plで雛形作ってくれたりするらしい。
0.7.14の新機能
- CustomFeed::Script:既存の「なんとか2rss」を入力にできる(Perlでなくても!)
- Publish::iCal
- Notify::OpenBrowser:URLを全部ブラウザで開く
- Filter::GuessTimeZoneByDomain:URLからタイムゾーンを推定(.comのときはIPアドレスから推定)
- Filter::Kansai:kansai.pmというライブラリがあるらしいw
今後の予定
- iTunes RSS
- enclosureを扱う機能(動画のフォーマット変換とか、iPodとのSyncとか)
- メディアフレームワーク(よく分からず。amazonへのリンクとか)
- データベース
- カレンダー(iCal)
- 日本語ドキュメントの整備
質問タイムその2(抜粋)
- 情報収集について。フィードは「とりあえずSubscribeして、つまんないと思ったら外していく」方針らしい
- Plaggerの開発は趣味でやっている
- 今後しきいが低くなって利用者が増えることで予想される問題→互換性のない変更をしにくくなるとか*8
- 今後やりたいのは、自前のUIを用意すること(→フィードのレーティングとかしたい) 参考:LivedoorReaderをフロントエンドに
Plaggerの概要については一応調べていたんだけど(インストールもしたし)まだ本格的に使い始めたわけではないので、 知らないことも結構あった。 あとやっぱり、開発者の思想(「なぜこういう仕様なのか」とか、「今後は〜したい」とか)的な話が聞けて面白かったです。ありがとうございました。
*1 楽しそうでしたw
*2 Publish::Gmailは別にhotmailのアドレスでも何でもいいらしい。誤解のない名前に変えたいとのこと
*3 Gmailの容量が溢れそうで、アカウントをもうひとつ取ったとか。…すげえ。
*4 Subscription::Planetを使えば、RSSフィードだけでなく「検索結果」をPlanetにすることもできる。「トピックベースのPlanet」というらしい。
*5 といっても厳密に分類されているわけではなく、プラグインの動作から「ゆるやかな規則」で種類を決めている。
*6 フィードにおける「添付ファイル」みたいなものらしい
*7 ブラウザはunDonutだった
*8 今でも互換性については気をつけているそうな。プラグイン命なソフトウェアだもんなぁ。
2006-10-22
■ [ruby] delegate.rbとfowardable.rbってどう違うの?
違いは、
- Forwardableは指定したメソッドのみを委譲する
- Delegateはぜんぶのメソッドを委譲する
です。(参考:るびま:標準添付ライブラリ紹介 【第 6 回】 委譲)
つーか、Forwardableってそもそもmethod_missing使ってないんですね*1。
*1 *_evalでメソッドをひとつずつ定義する
■ [ruby] はじめてのnadoka bot
nadokaのbotを書いてみたよ。
まず以下の内容で plugin/testbot.nb を保存する。(/somewhere/nadokabot/testbot.nbでもいい)
class TestBot < Nadoka::NDK_Bot def on_privmsg prefix, ch, msg if ch=="#example:*.jp" #チャンネル名が %example の場合 send_notice(ch, "#{prefix.inspect} ! #{ch.inspect} ! #{msg.inspect}") end end end
次に、nadokarcを以下のように書き換える。
BotFiles = [ 'testbot' ]
(testbot.nbをplugin/以外に置いた場合は、以下も)
Plugins_dir = ['./plugins', '/somewhere/nadokabot']
で、bot経由で「/nadoka reload」と発言する。"configuration reloaded"と帰ってきたら成功。
あとは、指定したチャンネルで適当になんか喋ると、botが
00:02 (yhara) #<Nadoka::NDK_Manager::PrefixObject:0x4039ca28 @user="yhara", @nick="yhara", @prefix="yhara!yhara@NadokaProgram", @host="NadokaProgram"> ! "#example:*.jp" ! "hoge"
みたいな感じで発言するはず。
あとは発言内容を変えるなりなんなり。
日本語を発言したいときは、
send_notice(ch, "こんにちは".tojis)
のようにjisコードに変換してやらないと文字化けすると思います。
2006-10-23
■ [ruby][python] いやなブログ:文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++
expandtabsはそんなに使わないので s.gsub(/\t/," ") でいいけど、String#starts_with?(other) はRubyにも欲しいなぁ。
■ [Ruby/SDL] プレイヤー情報をどうやって共有するか
唐突にゲームプログラミングについて書く。
前提。各キャラクターのオブジェクトはactとrenderというメソッドを持っていて、actで1フレーム分の動きを実行し、 renderでキャラを画面に描画する。
Rubyはオブジェクト指向言語なんで、プレイヤーキャラは多分 @player = Player.new(..) みたいな感じで書くと思う。 プレイヤーはゲーム中いろんなところから参照される。例えば「自機の方に歩いてくる敵キャラ」を実装しようと思ったら、 敵キャラがプレイヤーの位置を知ってないといけないわけで。
で、どうするか。
- グローバルに持つ($player)
- グローバルに持つ(Singleton)
- 引数で渡す
- 引数で渡す(構造体)
1はグローバル変数を使うという方法だけど…、Ruby的にグローバル変数はあんまりおすすめできない。 まぁプレイヤーだけならグローバルでも何とかなるけど、キー情報とか、Screenとか、スコアとか、共有したい情報はたくさん あるので、それ全部グローバル変数にするとソースが読みにくくなってしまう(どこで変更され得るか全く分からないので)。
2は添付ライブラリのsingleton.rbを使う方法。「Player.instance.x」 みたいな感じで書ける。 ただちょっと長いし、原理的に二人プレイが実装できない(笑)。「インスタンスが一つしか生成できない」ってのがSingletonだからね。 長さについては
class Player include Singleton def self.x; self.instance.x; end #← ... attr_reader :x
とかしとくと 「Player.x」 でアクセスできるようになるけど、ちょっと気持ち悪いかなぁと思う。
3は、敵の動作のときにenemy.act(@player) みたいな感じで渡してやる方法。昔はこれを使ってた。
でも、プログラムが複雑になってくるとactに渡す引数がだんだん増えてくるので、最近は構造体を作ってそれを渡すことにしてる。これが4。
def enemy.act(info) → info.player, info.key, info.screen, etc.
actとrenderで別の構造体を用意するべきかについてはちょっと考え中。
■ [tDiary] PluginList と docs.tdiary.org
小人さんしてみた。
- toc_hereを追加(どういう分類があるか分かりにくかったので)
- 全ての「プラグイン集に収録」という文字列に、docs.tdiary.org側のドキュメントへのリンクを付加
- tDiaryのHEADで添付されていて、載っていなかったものを追加
- 「→配布サイト」をddじゃなくdtの側に移した(解説へのリンクが全て上の段に来るようにした)
編集履歴が残るようなので、不都合があったらrevertしてくださいませ。
tDiaryについては、そもそもdocs.tdiary.orgとtdiary-users.sourceforge.jpにドキュメントが分散してるってのが何とかならんかなぁという感じだが…。
それぞれの特徴は以下。
- 設定画面でプラグイン名をクリックするとdocs.tdiary.orgに飛ぶ
- googleで「tdiary plugin」を検索すると、tdiary-users.sourceforge.jpが一番最初に出てくる
現状での使い分けは、
- 公式プラグインはdocs.tdiary.org
- 野良プラグインはtdiary-users.sourceforge.jp (公式プラグインはdocs.tdiary.orgにリンク)
という説明が一番近いと思うが、docs.tdiary.orgにも野良プラグインが結構載っている。
設定画面から手軽に見られる、という点ではdocs.tdiary.orgに項目を作る意義はあると思うんだけど、全てのプラグインが docs.tdiary.orgとtdiary-users.sourceforge.jpに載っているってのはちょっと二度手間っぽくて嫌だなぁ。
tdiary-users.sourceforge.jpに載っている野良プラグインを、docs.tdiary.orgから自動的にリンクするような仕組みがあれば良いのだが。
■ [Ruby/SDL] キーボード情報の扱い
現プロジェクトで使ってるやり方がなかなか便利なので紹介。
キーボードから発生する情報は、
- あるキーが押された(push) → SDL::Event2::KeyDown
- あるキーが押されている(press) → SDL::Key.press?()
という2種類。
基本的にゲームではpressを扱うことが多いのだが(「ボタンを押している間だけ移動する」とか)、 たまにpushだけを区別したい場合もある(ネームエントリーとか)。以下の方法はその両方に対応している。
まず、「Ruby/SDLのキー」と「ボタンの種類」を対応付けるデータを用意する。
KEY_MAP = { SDL::Key::UP => :up, SDL::Key::DOWN => :down, SDL::Key::LEFT => :left, SDL::Key::RIGHT => :right, SDL::Key::Z => :shot, SDL::Key::X => :bomb SDL::Key::ESCAPE => :exit, }
次に、メインループで以下のようなコードを実行する。
loop do #event key = {} while event = SDL::Event2.poll case event when SDL::Event2::Quit key[:exit] = :push when SDL::Event2::KeyDown sym = KEY_MAP[event.sym] key[sym] = :push if sym end end break if key[:exit] #scan SDL::Key.scan KEY_MAP.each do |k,v| key[v] = :press if SDL::Key.press?(k) && key[v].nil? end ...
と、ハッシュkeyに {:shot => :press} とか {:bomb => :push} のような感じで情報が入る。
単に「押されていたかどうか」を確かめる場合は
if key[:shot] #ショットを撃つ
のようにすれば良い。pushだけを扱いたいときは、
if key[:bomb] == :push #ボムを撃つ
のようにする。
2006-10-25
■ [Plagger] 「Debian sargeでもPlaggerしたい」
という記事を書きました。なんとなくsidでないと入らないのかと思ってたけど、sargeでも特に問題なかったよ!
yhara@meteor:~ % du -sh .cpan 38M .cpan yhara@meteor:~ % du -sh perl 36M perl
使用した容量はこんな感じです。
2006-10-26
■ [ruby] nadokaのbotからトピックをいじる
設定はできたんだけど、取得する方法がわかんねー。
send_msg Cmd.topic("#example:*.jp", "hoge") #チャンネル%exampleのトピックをhogeに変更
"/TOPIC (channel)" だから、send_msg Cmd.topic(ch) かな?と思ったんだが、send_msgは つまるところsocketにprintするだけなんで結果は取得できないようだ。
on_topicでトピックが変わった瞬間を捕捉するしかないんかなぁ。
■ [web] ブログ中のはてブされた記事の一覧
「http://r.hatena.ne.jp/feed/ + RSSのURL」で見られるらしい。→例
試しにoxy君の日記を入れてみたら、 8割がいつも読んでるブログだった(笑)。
2006-10-29
■ [softs] WindowsにもSubversion本体入れてみた
超簡単だった。
あとTortoiseSVNでsvn importはおろかリポジトリの作成(svnadmin create)までできることが判明。恐るべし。
■ [softs] 今週は大切なデータのバックアップを取りましょう週間でした
「10月はHDDが飛ぶ季節」という噂に合わせるように、2〜3年使ってきた外付けHDが死んだ。
仕方ないので電気屋に行って新しいのを買ってきた。しかし、同じ形なのに前のの半額で前のより容量1.5倍とか…。 嬉しいような悲しいような。
■ [softs] pdumpfs
バックアップついでにpdumpfsをセットアップしてみた。pdumpfsはバックアップツールの一種だが、 ファイルを単にコピーするだけでなく「任意の時点でのファイル」を取り出せるようになっている。
実装はRubyで書かれていて、Windowsで動かすときはvrubyによるGUIが使える。 特に設定ファイルもなくとても使いやすいのだが、少しだけ気になる点があったのでメモっておく。
- バックアップを始めるとキャンセル・中断する手段がない(「その日コピーした分を全部削除」でもいいので途中で止められると嬉しい。リジュームできれば最高だけど。)
- ディレクトリごとに「タスクスケジュールを追加」するのが面倒(まぁバッチファイルでも書けば良いんだけど)
2006-10-30
■ [prog] CVSって、checkoutしないとログ見れないもんなんでしょうか
とIRCで聞いたら「cvs rlog」というコマンドがあると教えてもらった。
しかしmanに書いてないとか罠すぎる!
■ [Plagger] PlaggerでSubvesionのコミットログをIRCに通知する
Notify::IRCを使ってみた。非常に簡単に使えて感動。
まず、IRC用にいくつかライブラリが必要。
cpan> install POE POE::Component::IRC POE::Component::IKC
次にsvnirc.yamlを書く。
plugins: - module: CustomFeed::SVNLog config: target: svn://somewhere/some/project title: proj reverse: 0 fetch_items: 10 #同じログが2回流れないようにする - module: Filter::Rule rule: - module: Deduped - module: Notify::IRC config: daemon_port: 9991 nickname: botname server_host: irc.tokyo.wide.ad.jp server_port: 6667 server_channels: - "#channel-name:*.jp" charset: iso-2022-jp announce: notice
で、IRC botを起動する。Plaggerにはplagger-ircbotという簡易ボットが付属しているので、それを使う。
plagger-ircbot -c svnirc.yaml &
あとは、
plagger -c svnirc.yaml
を実行するたびにコミットログがIRCに流れる。
デフォルトでは
02:45 (botname) proj: revision 36 (yhara) - svn://path/to/repository
みたいな感じで更新内容が表示されないので、assets/plugins/Notify-IRC/irc_notify.tt を編集して
[% IF entry.author %]<^C03[%entry.author%]^C[% END %]@[% IF feed.title %]^B[%feed.title_text %]^B>[% END %] [% entry.title_text %] - [% entry.body %]
のようにしてみた(^B等は色を変えるためのコントロールコード。vimなら^V^B, emacsならC-q C-b)。
(2007/2/15追記:直接編集するんじゃなくて、my-assets/plugins/Notify-IRC/irc_notify.tt にファイルを置いて
global: timezone: Asia/Tokyo assets_path: my-assets ...
みたいにすればいいようだ。)
これで
02:45 (botname) <yhara@proj> revision 36 - バグ修正
のように表示される。*1
参考:
- Bulknews::Subtech - [Plagger] Intranet blog to IRC
- example/irc.yaml
*1 コミットログを書く時は、何のバグを修正したのかを明記しましょう:-P
■ [web] 今気付いたんだが
「plagger trac」でgoogle検索→http://plagger.org/tracをクリック→「plagger」と「trac」がハイライトされる
リファラを見てるんだろうなぁ。trac恐るべし。
□ Ashizawa [僕も出町から向かったんですが、淀屋橋から徒歩10分ぐらいでした。]