そもそもメッセージのパラメーターとして任意のオブジェクトを渡すことは不可能だ。当然といえば当然の話なのだけれど、せめて同一プロセス内でだけでもどうにかできないものか。
同一プロセス内であればオブジェクトへのポインタを渡すだけですむのだけど、これはこれで渡したいオブジェクトのリファレンスカウントをどうするかというややこしい話が出てくる。それに、Python 内でオブジェクトへのポインタなど取得できないし (一応、現時点の実装では id() の戻り値がオブジェクトのアドレスと等価であるため、これを利用できなくはないが、かなりアレ)、取得できたとしてもどうやってオブジェクトを引っ張ってくるのか。
先ずは win32all と ctypes をインストールする。これがないと話にならない。
win32all は Python から Windows の API を叩いたり、各種定数を利用するために使う。ctypes は C のデータ型を Python で扱ったり、DLL に含まれる関数を呼び出すために使う。
大抵のことは win32all で事足りるが、一部のことは ctypes でないとできない。ctypes があれば win32all は必ずしも必要ではないが、あまりにも煩雑なので両者を併用する。
いくつかの注意点:
CreateWindow した場合、WM_CREATE を受け取れない。私の場合、Ctrl-Alt-F10 が押されると終了するだけのプログラムを作ろうとして、WM_CREATE で RegisterHotKey し、WM_HOTKEY で DestroyWindow し、WM_DESTROY で UnregisterHotKey をするようなウィンドウを書いて大いにはまりました。
設定したはずのホットキーが利かないので何故かと思ったら、WM_CREATE は受信できないので RegisterHotKey は処理されず、さらに RegisterHotKey は win32all でインターフェースが用意されていないという落ち。
ああ、どうしたもんだか。AVG 6.0 Free Edition を最低限の保障として使っていましたが、打ち切りとなると困った。
Grisoft announces the end of support for AVG version 6.0 effective on December 31, 2004 for technical reasons. This version has been available since 1999. It's structure does not allow for further improvements planned for version 7 nor improvements of detection techniques expected to come in the future.
End of support means we will no longer provide program updates or Virus Database updates for version 6.0 and therefore, within days, this version will not protect against new virus outbreaks!
Current AVG 6.0 users should upgrade to AVG 7.0. Information on upgrading to version 7.0 can be found at http://www.grisoft.com/us/us_upgrade.php.
(適当訳) Grisoft は技術的な理由から 2004 年 12 月 31 日に AVG 6.0 のサポートを打ち切ることにしました。このバージョンは 1999 年から利用されてきました。その構造はバージョン 7 で予定されているような改良や将来実装されるであろう検出技術の改良ができるようなものではありません。
サポートの打ち切りは、バージョン 6.0 用のウィルスデータベースの更新やプログラムの更新が行われることはないということですから、近いうちにこのバージョンは新たなウィルスの出現に対して何の効力も持たないということになります!
AVG 6.0 のユーザーは AVG 7.0 へアップグレードしてください。バージョン 7.0 へのアップグレードに関する情報は (以下略)
例えば slit 非対応の BBsysState を無理矢理 slit に入れるなら、以下のように書きます。なお、BBLoSlitta は他のプラグインよりも前、BBSlit よりも後にロードした方がいいでしょう (説明は面倒なので省略)。
i dont know how to use ur bbloslitta how to load plugins?
For example, if you want to load BBsysState (an unslittable plugin) into the slit, you have to write like the followings:
! plugins.rc <Path-to-BBSlit>\BBSlit.dll &<Path-to-BBLoSlitta>\BBLoSlitta.dll <Path-to-BBsysState>\bbsstate.dll
# BBLoSlitta.rc :BBsysState
It would be better to load BBLoSlitta before other plugins except BBSlit.
取り敢えず全部 slit に入れてみた。5 秒で止めた。
BBLoSlitta 0.0.0 をリリースしました。他のプラグインを、それが slit 非対応でも slit に入れます。
BBLoSlitta 0.0.0 has been released. It puts other plugins in the slit even if they are not slittable.
BBPlayer 0.0.2 をリリースしました。再生中の曲の情報を bro@m として送信するようにしました。
例えば、これを利用することで BBPlayer を BBInterface のフレームの中に「入れる」ことができます。
BBPlayer 0.0.2 has been released. Modified to send bro@m on changing information of the current playing track.
For example, BBPlayer can be ``put in'' a frame of BBInterface.
BBBloglines 0.0.0 をリリースしました。Bloglines の未読記事数をチェックします。私は Bloglines 使ってないけどな!
BBBloglines 0.0.0 has been released. It checks the number of unread items of Bloglines.
とある方からメールをいただいたので、BBmuse (Winamp で再生中の曲のタイトルを表示する BB4W のプラグイン) について少し調べてみましたが、なかなか面白いことをしてますね。
Bro@m から Winamp の操作ができるのはいいのですが、その結果を bro@m として配信しています。何に使うかはさておいて、アイデアとしてはなかなかいいですね。
それで、最近 box.cm.us にアップロードされているスクリーンショットのいくつかに BBInterface の中に BBmuse を入れている (ように見える) ものがあります。あれは BBmuse が BBInterface に入っているのではなく、BBInterface のラベルです。Winamp のタイトルが変わると BBmuse がある bro@m を送るので、それを利用してラベルのキャプションを変更しているのです。
送る bro@m が固定な点が少々アレですが、まあ普通に使う分には問題ないのでしょうね。
BBPlayer 0.0.1 をリリースしました。
タスクマネージャに表示されていたことを修正しました。これも直したはずだと思っていたのですが、確認してみたら修正したものをアップロードしてませんでした。
BBPlayer 0.0.1 has been released.
Fixed the bug that BBPlayer appears in the applications tab in task manager.
2ch BB4W スレで出た各種質問とその答えをまとめてみました。一部 FAQ と被っているところもありますが、FAQ にないものもあるので、適当に参考にしてください。
qwilk さんが何かやってますね。xoblite.net WAP trial
とありましたが、そもそも WAP って何でしょうかというレベルなので今一。
title="d*" id="d*"をtitle="dn" id="dn"(n=連番)にでも置換してくれるツールがあれば一気にいけるのだけれども。
作るのはともかく、そんな (使い捨ての) ものを公開する人などいないと思いますよ。自分でテキスト処理について勉強するとかしないと。こういうことは後々役に立つけれど、普通の人はこんなこと興味ないよな。
後、別に過去の分のアンカー等を振りなおす必要はないと思いますよ。他所からリンクされていた場合、アンカーが変わっていると閲覧者側からすればほとんどリンク切れと同じです。
……といいつつ触ってみる。ざっとソースを見たところ、 h3 が不要で、h4 の分だけ連番に置き換えればよさそうですね。という訳で以下のものを適当な名前で保存し、python をインストールして (この時点で駄目臭い)、コマンドプロンプトから python xxx.py <log.html >log.html.filterd のように実行する。
import re
import sys
def main():
n = [0]
garbage = re.compile(r'.*<h3.*\n')
pattern = re.compile( r'^(.*<h4[^<>]*)'
+ r'title="d[^"]*"'
+ r'([^<>]*)'
+ r'id="d[^"]*"'
+ r'([^<>]*>.*)$' )
def repl(m):
n[0] = n[0] + 1
result = ( m.group(1)
+ 'title="d%d"' % n[0]
+ m.group(2)
+ 'id="d%d"' % n[0]
+ m.group(3) )
return result
for line in sys.stdin:
if garbage.match(line):
continue;
sys.stdout.write(pattern.sub(repl, line))
return
if __name__ == "__main__":
main()
# __END__あるいは以下のものを適当な名前で保存して、sed をインストールし (これもアレだ)、コマンドプロンプトから sed -f xxx.sed <log.html >log.html.filterd のように実行する。
1{
h
s/.*/ /
x
}
/<h3/d
/<h4 title="d[^"]*" id="d[^"]*"/{
x
H
y/ 0123456789/11234567890/
G
s/.*\([^0]0*\)\n\(.*\)\n\(.*\)[^9]9*/\3\1\n\2/
h
# 1 2 3 4
s/ *\(.*\)\n\(.*<h4 title="\)[^"]*\(" id="\)[^"]*\(".*\)/\2d\1\3d\1\4/
x
s/\(.*\)\n.*/\1/
x
}(やっぱり sed で連番振るのは無茶があるな……)
サイトの再構成前と後で少しディレクトリ構造を変えていて、その違いを吸収するために mod_rewrite を使っているのですが、一部の書き換えルールが上手くいかなくて苦労したのでメモ。
RewriteRule で書き換えられる文字列はローカルなパスなので、リクエストが拡張子なしの URI であっても拡張子が付加されている場合がある。RewriteRule で書き換えられる文字列はローカルディレクトリを接頭辞とする部分が取り除かれている。RewriteCond でファイルの存在をチェックするときは、(色々と面倒なので) RewriteCond /home/who/XXX -f のように絶対パスで行うこと。特に RewriteRule 周りで躓きました。ディレクトリ云々はドキュメントにもきちんと書いてあったのだけど読み飛ばしてましたよ。
BBMouseGesture 0.1.6 をリリースしました。
ドキュメントの書き直しが一番疲れました。あのままじゃ誰も読まないと思ったので書き直しましたが、書き直しても(ザー
BBMouseGesture 0.1.6 has been released.
先日からの移行作業で一旦中止していた RSS の提供を再開しました。以前と同様に /rss.rdf にて最近の日記の更新状況を公開しています。
元々ジョーク (というか何と云うか) で生成していて、移行作業中でも優先順位は低かったのですが、思ったよりも利用している方が多くなっていたこと、それに RSS 提供中止に関して問い合わせがいくつかあったので、急いで再開しました。
i wasnt getting any news from your blog so i entered to check and it seems rss.rdf isnt being updated. is there any other feed i can use from your blog?
It was intended. I had stopped providing RSS for some days. Now I've resumed providing RSS. Sorry for the inconvenience.
半年ほど前からやろうと思っていたのですが、ようやくジャンル別の一覧を生成するようにしました。結構面倒でしたね。特に XSLT は出力を複数のファイルにすることができないので、どうやったらいいか考え込んでました。生成するだけなら楽ですが、Makefile にどう依存関係を書くかなど、色々と悩まされました。
一応、XSLT でも出力を複数のファイルにできるような仕様が XSLT 1.1 や XSLT 2.0 で定められていたのですが、まだ working draft ですからね。それに、両者でこれに関する仕様が大分異なっているので、どちらを使うにしても少々アレです。
なお、各一覧は大体月に一度のペースでしか更新されないので注意。特に最新の月の分の見出しは含まれません。今はまだ色々とアレなので含まれたりすることもありますが。また、まだ移行していないログの分は含まれていません。
info.vim がそれなりに便利です。滅多に info は使わないのだけど、いざ使うとなると Emacs-like なキーバインドしか使えないので不便で。
導入したところで滅多に使わないことには変わりないのですが、あるとないとでは大違い。
基本的な部分は完了しました。後はいくつかの足りない部分を埋めて、従来のデータをちまちまと移行するだけです。
結構前から移行しようかとは考えていましたが、実際に手を付け始めたのは二ヶ月前からで、本格的にやり始めたのはつい最近でした。
XML/XSLT 化のついでに GNU arch を試そうかと思いましたが、まだ使いこなせる段階ではないし、XML/XSLT 化だけでも結構な手間なので止めました。
XML/XSLT 化すると、簡単に色々できて便利な反面、XSLT 自体の記述量が多く見通しが悪いことが欠点です。基本的なところはいいんですけど、単純な文字列の扱いに弱いのは不便。XSLT 2.0 では正規表現が使えるようですが、まだワーキングドラフトだし、そもそもまだろくに読んでません。処理系独自の拡張を使えばどうにかなるかも知れませんが、面倒なことになりそうなので手を出せません。
CVS 等と同じ類のソースコード管理ツール。ざっと見た感じでは CVS よりもいくつかの点で優れているので、CVS から乗り換えようかと検討中。色々ととっつきにくいところもあるけれど、CVS を導入するときも似たようなものだったし。
取り敢えず練習として Hellow world を作っていたのですが、どうにも以下の二点だけは好きになれない。
Project 名がやたらと長いのは、設計思想云々があるから許せるのだけど、変態的なファイル名は勘弁してほしいな。
また、project 名の長さに比例して、内部で用いるディレクトリ構造もやたらと深い。深いのは別に構わないのだけど、名前が冗長すぎる。category/category--branch/category--branch--version (以下略) はいくらなんでも長すぎる。category/branch/version では駄目なのか?
この深さと長さのせいで、練習用に作ったディレクトリを削除 (rm -r) する際に「ファイル名が長すぎて削除できません」というエラーが出ました。これは OS レベルの制限だったらしく、explorer からでも削除できませんでした (ディレクトリ名を短くすることで削除できました)。