hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
05/02/2005 ふむ [長年日記]
■ [日記] 昨日
R. A. K. U. - 「楽」で遊びに.今ぽこっと思いついて勝手に名付けた.
- じゃじゃ麺食いすぎた.
- 千葉を表現したニクイあんちきしょうに惚れ.
- とりあえず高いのと速いのはちょっと涙がちょちょ切れちゃうぜ.
- 見知らぬ人を何度祝ったことか.ハードロックカフェ恐るべし.
■ [日記] うーん
暇だったのでリファラスパムをどうにかできんかなと考えてみる.で,適当なスクリプト をでっちあげて cron で回してみることにしてみた.
……けど,結局 regex は手で更新しなきゃならんわけで,あんまり意味ないんじゃないかと思った次第.
つか
SetEnvIf Referer で弾いた方がスマートかつ処理も速いと気付いた.調べてみると皆さんやっぱりこっちでやってるみたいっすね.俺バカ丸出し.
ただ TCP Wrapper とか iptables とか,もっと下のレイヤで叩き落とすのにはそこそこ使えるかもしれん.
で
スパムを駆逐してリンク元公開の再開に踏み切る.
ついでに試してみたが相変わらず Trackback が動かない.何でかなー.
05/04/2005 ぶひ [長年日記]
■ [Py][日記] 今日の IRCMemoBot
前から気になってた memo 系コマンドをまとめる.具体的には memo,modify,tmemo の三つ.
もう少し各メソッドの引数に乗せるものを考えた方がいいかもしれんな.処理が進むにつれて,それらの過程で生まれた値を使いたくなる場合もあるだろう.スーパークラスの変数を直接使うのはあまり好きでない.
でもメソッドによって引数の数や意味が変わるのもややこしいんだよなあ.
それにしても汚いなあ.どうにか綺麗にしたい.
追記
更に抽象化を進めてどんな拡張でもできるようにしたら,とんでもないことになってしまった.ここまで来ると,スーパークラス側でどこまで用意するかが悩ましい.
しかしここまでする必要があったんだろか.いたずらにコードを読みにくくしただけかも.
05/05/2005 うむ [長年日記]
■ [戯言] こまんどができるまで
IRCMemoBot コマンドのつくりかた.仕様が変更される可能性は大いにあり得るけども.
- コマンド名を決めます.ここでは「!hoge <url> <description>」なコマンドを作ります.
- commands ディレクトリ以下に command_hoge.py を作ります.
- command_hoge.py の中に command_hoge クラスを定義します.
- command_hoge クラスは supercommand.SuperCommand を継承します.コンストラクタは config オブジェクトと rss オブジェクトを引数にとります.
- hoge コマンドは url を第一引数に,description を第二引数にとるので,SuperCommand の初期化では SuperCommand.__init__(self, config, rss, url=1, description=2) となります.
- 処理を書きます.
ここで SuperCommand のデフォルト処理フローを見てみます.例えばこの状態でコマンド「!hoge <url> <description>」が打たれると,analyze term → modify term と処理を行います.また,デフォルトで analyze では split,modify では load_rss_for_multi が実行されるようになっています.ここで split や load_rss_for_multi 等の,term 内で実行されるものを proc と呼びます.
split proc ではコマンド引数を解析,分割して保存します.ここで保存された引数は get_arg() メソッドで取得することができます.!hoge では url と description を引数にとっているので,get_arg('url') で第一引数を取得できます.
load_rss_for_multi proc は単純に RSS をリロードします.これは設計がダメダメなことによる苦肉の策なので気にしないで下さい.
さて,各 term に入るときには _before_TERMNAME_term,term から出るときには _after_TERMNAME_term というメソッドが呼ばれます.command_hoge クラスの中でこれを定義しておくと,term に入るとき,term から出るときに何をするかを記述することができます.デフォルトでは何もしません.また,_default メソッドをオーバーライドするとデフォルト動作を変更することができますが,よっぽどのことがない限りはやらない方がいいでしょう.デバッグ等に使うのは良いと思います.
また,proc も同様に,proc を実行する前に _before_PROCNAME,後に _after_PROCNAME を呼びます.デフォルト動作も同様です.
さて,term には proc を複数関連づけておくことができます.append_proc メソッドで,既存の term に proc を追加することができます.例えば self.append_proc('modify', 'hoge_proc') などとすると,modify term で呼ぶメソッドを追加できるということです.
hoge_proc を modify term に追加したので,hoge_proc の処理内容を定義します.メソッド名を _hoge_proc として処理を書きましょう.引数はコネクション,イベント,送信されたメッセージ全文,送信者のニックネーム,送信されたチャンネル名の 5 つです.お好みに応じて _before_hoge_proc や _after_hoge_proc を定義しても良いです.これらのメソッドは真偽値を返すものとします.偽が返った場合,そこで処理がストップします.
もちろん,term も追加することができます.append_term メソッドで write term を追加してみましょう.self.append_term('write', ['write_to_rss', 'write_to_html']) で,第二引数は proc のリストです.これで,処理フローは analyze → modify → write となりました.
write term の proc である write_to_rss, write_to_html ですが,これは実は SuperCommand で用意されています.つまり _write_to_rss,_write_to_html メソッドが定義済みです.RSS や HTML への書き出しをやってくれます.また,write term を出たときに実行される _after_write_term も定義されています.もちろんオーバーライドして処理を変更しても構いません.
他にも term や proc を削除することなどもできますが,そこらへんはめんどくさいのでコード読んで下さい.
さて,できたコードはというと,
from suppercommand import SuperCommand class command_hoge(SuperCommand): def __init__(self, config, rss): SuperCommand.__init__(self, config, rss, url=1, description=2) self.append_proc('modify', 'hoge_proc') self.append_term('write', ['write_to_rss', 'write_to_html']) def _hoge_proc(self, c, e, msg, nick, channel): self.get_arg('url') # 第一引数をゲット self.get_arg('description') # 第二引数をゲット ... return True # 処理が終了した時は真偽値を返す
これだけです.ここで処理フローをもう一度確認してみると,
- _before_analyze_term
- _before_split
- _split
- _after_split
- _after_analyze_term
- _before_modify_term
- _before_load_rss_for_multi
- _load_rss_for_multi
- _after_load_rss_for_multi
- _before_hoge_proc
- _hoge_proc
- _after_hoge_proc
- _after_modify_term
- _before_write_term
- _before_write_to_rss
- _write_to_rss
- _after_write_to_rss
- _before_write_to_html
- _write_to_html
- _after_write_to_html
- _after_write_term
という順番にメソッドが呼ばれるわけです.この内,定義されていて呼び出しが行われるものだけを抜き出すと,
- _split (SuperCommand でスケジュールされている)
- _load_rss_for_multi (SuperCommand でスケジュールされている)
- _hoge_proc
- _write_to_rss (SuperCommand で定義されたものを呼ぶようにした)
- _write_to_html (SuperCommand で定義されたものを呼ぶようにした)
- _after_write_term (SuperCommand で定義されたものを呼ぶようにした)
となります.
というわけで何かおもろいコマンド思いついたら作って下さい.主に俺が喜びます.
と
ここまで書いて,IRCMemoBot 特化でなく irclib にコマンドを送るためのライブラリとして抽象化した方が良かったんじゃないかと思った.
うーん,まぁいいや.
■ [小ネタ] 個人ニュースサイト管理人の就職活動 反応リンク集
む,反応リンク集が出来ていたとは.
05/06/2005 うむ [長年日記]
■ [日記] 風邪
治る気配を見せないっていうか,悪化してるような.まぁ,そんな状態にも関わらず研究室で Python Challenge なんかやってるから悪化するんだろうけど.しっかしむずい.
誰か俺のために卵酒を作ってくれ (多分飲んだことない).
■ [小ネタ] はてな 「転載が許可されている or 著作権を主張しない(事実上の著作権放棄)ウェブサイトやコンテンツ」をなるべくたくさんご紹介ください。
まさかこんなところで紹介されるとは.
■ [日記] LVM2
kawahara 氏 のマシンで LVM2 なボリュームが認識されないのを直す手伝い.NFS 使えなくなるのは困るので.;)
何だかよくワカランけど,LVM1 と LVM2 を共存させると LVM1 の方しか認識されない,というのが原因だったらしい.で LVM1 な方に vgconvert をかけることで直った模様.
05/07/2005 む [長年日記]
■ [Py][小ネタ] So-net blog:チベットとコンピュータな日々:Pythonを知らないなんて
via: しばたさんのメモ
俺の面接例:
- 俺「色々ツールとかアプリとか作って遊んでます」
- 官「使った言語は?」
- 俺「Perl,Python,Ruby,PHP,Java,C,Bash……」
- 官「……一番好きな言語は?」
- 俺「Python かなー」
- 官「うほ,Python!? めっずらし! Python の好きなとこって?」
- 俺「『一つのことをするためには一通りの方法しかない』思想ですかねー」
- 官「Python ってインデントが言語仕様とか,面白いよねー」
という流れで Python 談義突入.Python と聞いて喜んで Python 談義をしてくれたこの面接官の方が大好きです.
05/10/2005 むー [長年日記]
05/16/2005 むー [長年日記]
05/17/2005 む [長年日記]
■ [ソフト] Noiz2sa: Why is OpenGL necessary?
こんなところで引き合いに出されてもという気はするけども…….OpenGL を使うようになったのって rRootage からだったような?
そういえば本家 Portage ツリーに入ってる Noiz2sa も opengl に DEPEND してるなあ.うーん,抜いて試してみるか.
05/18/2005 むー [長年日記]
■ [小ネタ] んー
いつぞやの リアルモテ非モテ診断 がバージョンアップしてるのか何なのか,質問項目が変わった気がする.そうでもないんかな?
やってみたら こないだと全く逆 に.
「○○さん、彼女いないの?えー、なんで?いそうなのにー」と言いつつも、その人は彼女になりたくない。
あいたたた…….
つーか臆病なだけですって,多分.
05/20/2005 むー [長年日記]
05/21/2005 むむ [長年日記]
■ [日記] コメントキーフィルタ&プラグイン version 0.1.0 を使うと Trackback/Pingback を使えなくなるらしい
がびーん,原因はこれだったのか.
05/22/2005 うー [長年日記]
■ [日記] あー
すげー負荷率.ついでに激・腹痛.そろそろ死ぬかも.
まーまだ楽観でいられるくらいだから大丈夫だろう.多分.
まだまだやれる.何だか凄くやる気に満ち溢れてるぜ! 今なら空だって飛べるぜきっと!
※ 薬はやってません.
■ [小ネタ] 今日の気になるリンク元
- Google 検索: パンチラ atzm
- ……見たいのか?
追記
まぁそんなとこだろうと思ったけど,2 研人の仕業か.
追記2
あぁいかん,てかこのワード書いたらイカンがな.また引っかかってしまう.
05/23/2005 んー [長年日記]
■ [ダメ][小ネタ] 今日の気になるリンク元
- Google 検索: 裸の atzm
- ……身売りはしてないぞ.
■ [日記] むー
この 3 日間 Python で 1500 行ほどごにょる.一応形にはなったがまだまだ増えるなこの調子だと.
というか __import__ とか可変長引数とか lambda とか setattr,getattr などなどを使いまくる動的 (?) コードだらけ.コメントも殆どないし,一週間コードを読まずに過ごしたらわけ分かんなくなってそう.今の内にリファクタリングしてコメントも書いておかないと.
しかしフレームワークもどきを作るならまだまだ抽象化と切り分けが必要だろうな.更にパッと見意味不明なコードになるのかな.Python 的にどうなんだこれは.
そういえば assert 初めて使ったかも.
05/25/2005 うひ [長年日記]
■ [風博士][メモ] 風博士の UI でできない設定を Mozilla (Firefox) を使って設定する
クッキーをクリアしたい時とか証明書をインストールしたい時とか.
- Mozilla をレンダリングエンジンに使ってる場合
- 風博士のロケーションエントリに chrome://communicator/content/pref/pref.xul と打つ
- Firefox をレンダリングエンジンに使ってる場合
- 風博士のロケーションエントリに chrome://browser/content/pref/pref.xul と打つ
ブックマークしておくとそれなりに便利かもしれん.「編集/詳細設定」も「about:config」だし,組み込んでも良さそうなんだけど.
ただ,それでいいのかって気はする.
更にメモ
$MOZILLA_FIVE_HOME/chrome/*.jar の中を見れば設定ダイアログ以外のも使える.
風博士でなくとも多分 MozEmbed なブラウザなら使えるんじゃないかな,知らんけど.
05/27/2005 むう [長年日記]
05/28/2005 む [長年日記]
■ [Gentoo][ソフト] 「無効なフォント Kochi-Mincho が削除されました」
がうっとおしいなあと思って色々試してたら, /usr/bin/ps2pdf の中身を
exec ps2pdf14 "$@"
に変更することで直った模様.12 だとダメなのか.
しかしこれで pdf バージョン 1.3 以前はステということになってしまったが,過去は忘れゆくものなのだよ…….
ついでにメモ
/usr/share/ghostscript/7.07/lib/CIDFnmap*
を色々ごにょることでフォント変更したりできるらしい.さざなみとか IPA フォントとかに変更したいとかそういう場合に.
□ 萩原 [ん?僕のこと?>はげ ]
□ atzm [いえ,「ほげほがひげふが」は「げら」であるというお告げを得たため書き残しておいたのです. ]