トップ 最新 追記

Route 477



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のをそのまま使わせてもらう予定。

[vim] Vim Scriptって

思ったよりLLだわ。


2006-10-09

[vim] RRSV(2)

メソッド名からクラス名を引くためのテーブルがあるんだけど、これをどうやってvimに読みこんだらいいのか 分からん。

vim7だとreadfile()とかあるらしいんだが…。


2006-10-10

[ruby] Private Pockets

danさんが開発されている「Railsゲー」であるところの Private Pockets(プラポケ)にこっそり参加しています。

Grade 1に上がった。


2006-10-11

[prog] auで勝手アプリ復活

via 航海日誌

キター。

これで心置きなくWINケータイが買えそう。


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)

成功した場合は、 keybufが指定され、bufsizeがkey長以上であれば、カレントレコードのkeyををkeybufにコピーし、 scoreにNULL以外の値が指定された場合はカレントレコードのスコアを*scoreにセットします。

sen_records_next()の説明が難解すぎる件。

Rubyのメソッド→SWIGによるラッパー関数→SennaのC API となっていてややこしい。

まぁSWIGによるラッパー関数そのままだと「C言語風にRubyを書く」はめになってしまうので、Rubyの皮が被せてあるのは嬉しいかも。

[prog] Senna(4)

使用方法の調査がてらに、Rubyバインディングのドキュメントを書き中。*1

optarg回りのインターフェイスをもうちょっと何とかした方が良い気がするなぁ。

*1 といってもC APIのを書き換えてるだけだが

[prog] Senna(5)

http://mono.kmc.gr.jp/~yhara/w/?RubySenna

とりあえず今日はここまで。

[web] プチ改装

文字を小さくしてみた。

なんとなく心理的に、文字が大きいとどうでもいいことを書きにくいような気がする。


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もだんだん複雑になってないか?とちょっと心配になる。

[ruby] File.write

File.readみたいにFile.writeも欲しいなぁ。

File.write("hoge.txt",string)とか。バイナリモードは第3引数に"wb"とか渡す感じで。

File.open("hoge.txt","w"){|f| f.write string}

長い。

[ruby] 60*60*24

って書くのもいい加減飽きてきたな。

last_month = Time.now - 30.days とかしたい。

class Integer
  def days
    60*60*24*self
  end
end

これだとyesterday = Time.now - 1.days とかなっちゃうけど、まあいいか。1連鎖みたいなもんですよね(違うか)。

でもやっぱりちょっと抵抗があるので穏便にdays(30)という形式にしておいた。

def days(n)
  60*60*24*n
end

Pythonには「時間の差」を表現するクラスとかあるらしいね。


2006-10-15

[misc] CodeFest京都2006 無事終了

参加者の皆様、スタッフの皆様どうもお疲れ様でした。

[softs] Plaggerインストール中

依存ライブラリ多すぎwww(しかも一発で入らないのが結構ある)

なんかTemplateが中ボスでEncode::Detectがラスボスっぽい。

インストールっつーか新種のゲームっぽいです。「5面がどうしてもクリアできないんだけど!」みたいな。

[softs] Plagger(2) Encode::Detect

Encode::Detect入った。cc1plusが無いって言われると思ったらg++をapt-getし忘れてたみたい。

参考にしたのは以下

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 より)。

[softs] Plagger(4) assets

このへんのサンプルを試そうとしたが、gmail_notify.ttがないと言われる。

どうやらassetsというものが必要らしい。 公式サイトのアドレスからsvnで取ってきた。

[softs] Plagger(5)

メールきたー


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 今でも互換性については気をつけているそうな。プラグイン命なソフトウェアだもんなぁ。

本日のツッコミ(全1件) [ツッコミを入れる]

Ashizawa [僕も出町から向かったんですが、淀屋橋から徒歩10分ぐらいでした。]


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(..) みたいな感じで書くと思う。 プレイヤーはゲーム中いろんなところから参照される。例えば「自機の方に歩いてくる敵キャラ」を実装しようと思ったら、 敵キャラがプレイヤーの位置を知ってないといけないわけで。

で、どうするか。

  1. グローバルに持つ($player)
  2. グローバルに持つ(Singleton)
  3. 引数で渡す
  4. 引数で渡す(構造体)

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] PluginListdocs.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から自動的にリンクするような仕組みがあれば良いのだが。

[tDiary] plugin.tdiary.org?

もしくはRAAみたいに、プラグイン集のサイトがあれば良いのかも。

vim.orgのscriptsのコーナーみたいな。

[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
  #ボムを撃つ

のようにする。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

yhara [おお、詳しい人からのコメントが!ありがとうございます。 5>なるほど、それは思いつきませんでした。オブジェクト指向に..]

ohai [インスタンス変数経由で渡す、とか]

yhara [newするときに渡しておくってことすか。いろんな方法があるなぁ。]


2006-10-24

[vim] Chaliceすごい

vim用の2chブラウザ、Chaliceを使ってみた。

chalice

インストールが簡単なのが良いです。

[junk] Cujo

っていう差出人のspamがきた(ゴゴゴゴ)


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-27

[ruby] nadokaメモ

  • トピック取得したい
  • 「このチャンネルはログを取らない」という指定がしたい
  • privのログはパーミッションを600にしたい

できるかどうかは未調査。


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

参考:

*1 コミットログを書く時は、何のバグを修正したのかを明記しましょう:-P

[web] 今気付いたんだが

「plagger trac」でgoogle検索→http://plagger.org/tracをクリック→「plagger」と「trac」がハイライトされる

リファラを見てるんだろうなぁ。trac恐るべし。

本日のツッコミ(全2件) [ツッコミを入れる]

kzgs [認証のあるsvnでも使えますか?]

yhara [うーん、ちょっと分かりません。すみません。 今のところ認証は実装されて無さそうですが。 http://plagger..]