上で書いた「簡単な文法の知識と適切な語彙があれば」云々で何故か Magic: The Gathering を思い出しました。
ルールを知ったのは中学生頃でしたが、その当時の英語力でもルールと用語さえ解っていれば難なくカードの内容は読めましたね。どのエキスパンションか忘れましたけど、日本語版のカードに使われていたフォントが嫌で、英語版の方を使っていた記憶があります。
MtG は良くも悪くも洗練され過ぎてて、プレイして楽しめなかった気がします (つまりは対戦相手を選ぶ)。ルールや個々のカードのアイデアは楽しいですが。
しかし、今の基本セットは第 8 版か。何時廃れるんだこいつは。しかも最新のエキスパンションの名前が Champions of Kamigawa って。名前からして楽しそうじゃないか!
少し前に Ray Bradbury の Fahrenheit 451 を買いました。既に邦訳は持っているのですが、原文を読みたくなったので買ってしまいました。まだ少ししか読んでいないのですが、それでも色々と興味深いところがあります。
私が今まで読んだことのある英語は、ほとんど型が決まっている (簡単な文法の知識と適切な語彙があれば読める) ものばかりで、小説とは大きく違います。
また、翻訳の際に隠れたものも見えて面白いです。例えば、話の舞台となる世界では本を読むことが禁忌とされ、本は発見され次第燃やされます。そのため「焚書官」なる役人がいます。この「焚書官」が原文では「fireman」となっていて、これは普通なら「消防士」の意味です。邦訳を読んでいては解りませんよ (と思ったら、最初の方で Is it true that long ago firemen put fires out instead of going to start them?
と質問されるところがありました。邦訳でも解りますね)。
さっさと読み切ってしまいたいのですが、あまり集中して読めないので全然進みません。
bbLean 1.13b4 が出てます。変更点は以下の通り:
「ピン留め」は、メニューのタイトルをクリック/ドラッグすると、メニューが消えずに残るアレのこと。
個人的にはワークスペース絡みのところ以外どうでもいいですね。メニューなんて使わないことはないけど、マウスで使わないしなぁ。フォルダを開くのもピン留めするのもマウスを使わないと無理だし、第一メニューは一時的に設定を変えるときくらいしか使わないし、ピン留めに関しては、一時的だけど頻繁に設定を変えるとき (つまりはプラグインのデバッグの際) しか使わず、そういうときはコンソールで作業しているので BBKontroller を使う方が便利。
XHTML 2.0 の section / h のようなものを h1、h2 (以下略) に直す XSLT は以下の通り (所要時間 90 分。昼寝時間 60 分含む)。
もう少しスマートな方法はないのかな。たかがこれだけのことなのに仰々しく見えます。この程度のことなら既に誰かやってるだろうと思って探してみたけど全然見つかりませんでした。
section の入れ子が深すぎる場合の対策はしていませんが、その辺りは適当に補完してください。
<xsl:template match="xh2:section" name="section">
<xsl:param name="n" select="2" />
<div class="section">
<xsl:copy-of select="@*" />
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="local-name() = 'h'">
<xsl:call-template name="h">
<xsl:with-param name="n" select="$n" />
</xsl:call-template>
</xsl:when>
<xsl:when test="local-name() = 'section'">
<xsl:call-template name="section">
<xsl:with-param name="n" select="$n + 1" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</div>
</xsl:template>
<xsl:template match="xh2:h" name="h">
<xsl:param name="n" select="1" />
<xsl:element name="h{$n}">
<xsl:copy-of select="@*" />
<xsl:value-of select="." />
</xsl:element>
</xsl:template>bbLean ですが、plugins.rc に同名のプラグインが複数あると、メニューの Configuration -> Plugins -> Load/Unload の一覧にて、区別のためか /0 や /1 といった番号が付加されて表示されますね。1.13b3 で確認。何時ごろからあるのか解りませんが。
また、bbLean は 1.13 になってからワークスペース周りが結構変わっています。他のブランチでは、横長のスクリーンを左から順に 1、2、3 ……と分割し、ワークスペースの移動は実際に表示される部分を切り替える、という感じになっています (実際、適当なウィンドウをスクリーンの左右のどちらかにはみ出すように移動し、隣のワークスペースに切り替えると、はみ出た部分が見えます。この辺りのソースコードは見てないのでこの考えが当たっているかどうかは解りませんが)。
しかし 1.13 ではそのようなことはないので、*nix 上の blackbox 等のワークスペースとほぼ同様になっています。たかが見える見えないの違いですが、これがなかなか。
なお、extensions.rc の blackbox.tasks.currentOnly (メニューでは Configuration -> Misc. -> Workspaces -> Alternate Method) を true にしなければこの挙動にはなりません。false だと従来と同じ挙動になります。しかし、メニューのアイテム名と設定ファイルでのキー名の違いは何なんだ。
後、1.13b2 まではワークスペース絡みで色々とアレな点があったので、1.13b3 の方を使いましょう。
Opera、今更気付いたのだけれど、page bar の各タブも drag & drop できるのか。Page bar 上へ drop することでタブの位置を入れ替えられるのは解るのだけど、他にも思いもよらない場所へ drop できるので驚いた。「Bar」と名前が付いているものであればほとんどどこにでも drop できます (これは該当 URI へのリンクになる)。また、アドレスバーやページ内の編集フォームなどに drop した場合、該当 URI をペーストします。
他にも様々なものが drag & drop できます。この柔軟性は一体何なんだ。
Littlewitch より Flowers 到着。
毎回、Littlewitch のロゴが入った真っ白いダンボールに商品が入ってるのですが、今回は普通のダンボールでした。何でだろう。今まで「ダンボールからして違う!」と慄いていたのに。中身自体は相変わらず気合入ってますけどね。
Tres`ni さん (BB4W の開発者の一人) のサイトが何時の間にやら様変わりしてますね。以前、それっぽいことを聞いた覚えがありますが、こういうことでしたか。
BB4W 界隈は最近目立った動きはありませんね。ひっそりと bbLean のβ版のソースが公開されていることくらいですか。
何か面白いネタでもあればいいんですけど。まあ、どうでもいいのが一つ二つありますが、本当にどうでもいいし。第一今はファイラともう一つ別のことの作業をやっている方が楽しいし。
今日のピタゴラスイッチの要点。
しかしそんなことはどうでもいい。今日の「おとうさんスイッチ」では珍しく双子が出ていたのだけど、問題はその双子が幼女でしかも名前が詩織と佐織だということだ! (後者の名前の漢字はきちんと覚えてない)
ああ、脳味噌がアルファブレンドだな。
ああ、こんなにも違っていましたか。一応本放送は見ていたので、ちらほらと違いは気付いていましたが、こうして見てみると結構な量が違いますね。
このアニメの放送時間帯は (一局を除いて) どの局でも平日の 25 時前後。眠い目をこすりながら見ていたこと、それに当時は病んでいたこともあいまって、あの作画に対する耐性が付いていましたが、今見直してみると (省略)。
個人的に秀逸なのは第 5 話における DVD と TV との違い Part1 の可憐の作画の違い。あの目、あの目だよ! 細かい違いは忘れているけれど、あの目だけは忘れられない。
ああああああああああああああああああああ! 今年の夏のコミケ行けばよかったああああああああああああああああああ!
上のページを読んだら凄まじく後悔がしてきた。交通費、宿泊費、食費、宅配便代等の必要経費を考えても割りに合わない訳がないと確信させるような本を作らないでください。
……ああ、でもシスプリ熱が再燃 (あーあ、云い切っちまった) したのは一昨日からなので、仮に今回行く気だったとしてもスルーしてたでしょうね。
あーあ、もうこの勢いで持ってない Re Pure の DVD 全部買いそうだよ全く。大雑把に考えても計五万は下らないので本当に手を出すかどうかはアレだけど。
Pygame のインストールに失敗した模様 (1) の続き。
……昨日書いた Pygame インストールメモは相当寝ぼけてるな。SDL のバイナリは win32-dependencies.zip にあるじゃないか。別に SDL のバイナリパッケージをわざわざ入れる必要はない。
とはいえ、一応後者の方を利用するようにして、pygame の examples/aliens.py を実行してみると、
$ PATH=/usr/local/mingw32/bin:$PATH python aliens.py
Traceback (most recent call last):
File "aliens.py", line 324, in ?
if __name__ == '__main__': main()
File "aliens.py", line 253, in main
all.add(Score())
File "aliens.py", line 168, in __init__
self.font = pygame.font.Font(None, 20)
RuntimeError: Couldn't open /usr/lib/python2.3/site-packages
/pygame/freesansbold.ttfとなり、クラッシュはしません。前者を利用する場合はクラッシュします。取り敢えず前者は捨てて後者を取ることにしようか。
次は開こうとしている (デフォルトの) フォントのファイルが開けないというところ。パーミッションが変だということではないし、Windows 側からは正しく見ることができます。必要なライブラリがないということでもないし。何故だ。
Pygame 同梱のサンプルのいくつかが動かない。どれもフォント絡みの部分で Python インタプリタがコアを吐いてしまう。
>>> import pygame
>>> pygame.font.init()
>>> f = pygame.font.Font(file("gekimoe.font"), 12)
Pygame Parachute Traceback:
File "<stdin>", line 1, in ?
Fatal Python error: (pygame parachute) Segmentation Fault
Aborted (core dumped)どう考えてもフォント絡みで不味い部分を見逃したまま無事に pygame をインストールできたと勘違いしてたということだ。
Pygame のソースを parachute で grep してみたところ、src/base.c が引っかかったのですが、やっていることは致命的なシグナルをトラップして Py_FatalError() を呼び出しているだけ。何か不味いことが起きたのは解るけれど、「どこで」「何が」不味いのかは解る訳がない。
多分、pygame 側はフォント絡みのライブラリがあるものと仮定しているのに、それがなかったということでしょう。
……調べるの面倒だな。まあ、フォントが絡んでいないサンプルに関しては正しく動作しているのでいいか。
危うく忘れるところでした。急いで注文したものの、リングキーホルダーは既に売り切れ。
そういえば、前回の白詰草話のセットや Quartett! でも、今回と同様に注文受付開始から即座に在庫切れという勢いでしたからね。その前例からか、今回はさらに早く受付中止になるかも知れません。
いやまあ、キーホルダーの在庫が他に比べて少なかったという落ちかも知れませんが。
ああ! 今日の 20 時は Littlewitch のオンラインショップを要チェックだった!
取り敢えず Quartett! のサントラだけは欲しい。
最近、ようやく変愚蛮怒の流れが掴めたので、ちまちまとやってます。今年の頭くらいに手を出したのですが、今一感覚が掴めず、ほとんど手をつけずじまいでした。まあ、魔法のシステムを理解していないのにマインドフレアのスペルマスターとか選んでもろくなことにならないのは当然なのですが。
Roguelike は NetHack しかやったことがなかったので、変愚の広大さや何でもありの雰囲気に唖然とするやら何とやら。いやまあ NetHack だって色々と混じってるのですが、さすがに
例えば、「この階はガチャピンに守られている」のような表示です。
待て。いろりろと (訳注: 色々と) 待て。
こういったお茶目な部分もありますが、ゲームとしては面白いです。NetHack よりは長くじっくりやるタイプです。(職業と種族にもよりますが) 序盤でそうそう死なない分、NetHack よりはやる気が出ますが、先が長く寄り道できるところが多い分、NetHack より早くだれてきます。
今は人間の戦士で森の31階を探索中。最初のクエストで(吸血)ブロード・ソードが、次に全耐性の革製スケイル・メイルが手に入ったのでさくさくと進んでいます。吸血の回復量は微々たるものですが、回数が回数だけに結構役立っています。さらに先程30階で極寒のクロークと★ガントレット『パウラエゲン』を拾ったので、さらにさくさく。ここまで進んだことがないので、今一これらの装備の価値が解らないのですが、それなりにいいのでしょうか。取り敢えずアーティファクトが拝めたので今のところは十分です。NetHack だと入手どころか 15 階より深いところに辿り着いたことすらない。
Pygame のインストールに死ぬほど手間取った。四時間半くらい使った気がする。
Pygame が numpy と SDL を利用しているので、まずこの二つをインストールしなければなりません。さらに numpy が ATLAS というライブラリを使っているので、これもインストールしなければなりません。Windows 用のバイナリパッケージを使えば楽なんでしょうけど、Cygwin 上の Python で使いたいのでそれは駄目。で、SDL と ATLAS、この二つのビルドの相当手間取った。
SDL はバイナリパッケージを利用しました。最初は自力でコンパイルしようとしてたのですが以下略。
ATLAS は上記のページを見つけるまでに時間がかかりました。しかしまあ、何でこの作業を自動化できないかね。相当面倒でした。上記のページにはコンパイルに関してしか書かれていないので、その後は以下のようにしてヘッダファイルと作成したバイナリをコピーしましょう。
cd $ATLAS_SRC
cp lib/$ARCH/lib{atlas,*blas,*lapack}.a /usr/local/lib/atlas
cp -r include /usr/local/include/atlasPygame の方もややこしいと云えばややこしいのですが、まだましか。上記ページの *.dll からインポートライブラリを作成する部分は、pexports とやらを落とすのが面倒だったので下記のスクリプトで代用しました。win32-dependencies.zip に含まれている *.dll は nm が使えなかったので、*.lib の方から生成するようにしました。
なお、nm でシンボルがリストアップできるのであれば、*.dll や *.exe からでもインポートライブラリが生成できます (ちなみに BB4W のプラグイン用のインポートライブラリは、BB4W 本体の blackbox.exe や SDK に含まれる blackbox.lib から生成できます。一度、リンク周りの問題を解決するためにインポートライブラリを生成した覚えがあります)。
#!/bin/sh
for fn in "$@"
do
lib=${fn%%.lib};
echo "$fn ===> lib$lib.a";
echo EXPORTS >$lib.def;
nm $lib.lib | grep ' T _' | sed -e 's/[^ ]* T _//' >>$lib.def;
dlltool --def $lib.def --dllname $lib.dll --output-lib lib$lib.a;
rm $lib.def;
done無事 pygame はインストールできましたが、もう気力が残ってないので続きは次にします。
python-irclib という便利なものを発見したので、IRC 上でマインスイーパをする bot を作ってみた。
13:40 (kana ) ms: new 8 4 8 # 8*4 セル、地雷 8 個でゲーム開始 13:40 (ms ) Let's start a new game 13:40 (kana ) ms: t 7 3 # (7, 3) のセルを調べる 13:40 (ms ) 1 13:41 (kana ) ms: t 0 0 13:41 (ms ) 0 13:41 (kana ) ms: p # 現在の状態を表示 13:41 (ms ) -----1== 13:41 (ms ) 111122== 13:41 (ms ) ======== 13:41 (ms ) =======1 13:41 (kana ) ms: t 0 3 13:41 (ms ) 2 13:42 (kana ) ms: m 1 3 m # 地雷があると確定した場所をマーク 13:42 (ms ) Marked 13:42 (kana ) ms: t 2 2 13:42 (ms ) 3 13:42 (kana ) ms: p 13:42 (ms ) -----1== 13:42 (ms ) 111122== 13:42 (ms ) ==3===== 13:42 (ms ) 2P=====1 13:43 (kana ) ms: t 7 0 13:43 (ms ) BOMB! 13:43 (kana ) _no 13:43 (kana ) ms: p 13:43 (ms ) -----1** 13:43 (ms ) 111122== 13:43 (ms ) *=3*=*=* 13:43 (ms ) 2**====1
何が楽しいんだ!
何となく SolarWolf をやってみました。一通り終わらせましたが、良くも悪くも洋物の臭い。
面白いか面白くないかで判断するなら面白くはないな。Level が上がるにつれて「取り敢えず弾ばらまけばいいだろ」という雰囲気が強くなり、それが面白くないと感じる原因。もう少しパズル的な要素出して頭を使わせるとか、アクションならアクションでもっと弾のパターンを増やすとかしないと。どれも同じ速度で直進するだけでは芸がありません。
後、ゲーム開始前に自機の位置へ隕石が重なり、ゲーム開始と同時に即ミスになるのはどうにかならんか。
新山は黄色や赤のエサを取るのに同じところを何度も行ったりきたりすることが多いのだが、この隠れ爆弾のせいですっかりその戦略は変わってしまった。いまやひき返したとたんボガーンとなる。
あれは変化する最初の間なら当たっても問題ないので、さっさと引き返せば大丈夫です。
引き返してもその先に隕石があってボガーン。
BBTextClockを使用しているのですがタスクマネージャに表示されるので不便です。
タスクマネージャの「アプリケーション」タブに表示されるということですね。アップロードしたアーカイブの中身を確認したところ、確かにその通りでした。修正したものをアップロードしておいたので適当に持っていってください。
この問題は自分で気付いてすぐ修正していたのですが、アップロードはしてませんでした。他にも二つほど修正すべきものが残っていますが、誰も使わないようなものなので放っておきます。
Python 拡張モジュールの話 - マルチスレッド云々 (1) の続き。
結局、以下のようにしたら segmentation fault は起きなくなりました。
Py_BEGIN_ALLOW_THREADS
while (!0) {
BOOL b;
MSG msg;
b = GetMessage(&msg, NULL, 0, 0);
if (b == 0 || b == -1) break;
Py_BLOCK_THREADS
TranslateMessage(&msg);
DispatchMessage(&msg);
Py_UNBLOCK_THREADS
}
Py_END_ALLOW_THREADSPython for Windows extionsion には PumpMessages という関数があり、それがやっていることは上記のコードと同様です。違いは Py_BLOCK_THREADS と Py_UNBLOCK_THREADS がないこと。
これの有無で起きたり起きなかったりするということは、msg の中のデータが賞味期限付きで、他のスレッドの実行により GetMessage から DispatchMessage の間に時間が空き、結果として賞味期限切れのデータを配信していたということか。これなら特定のメッセージで落ちるのは解る。データの一部はポインタだからな。
ああもう解らんな。作っていたのはあるライブラリの Python 用ラッパー。そのライブラリのソースが公開されていれば別に悩みませんが。