Diary?::2009-11

2009-11-01
Sun

(23:36)

昨日の日記のちょっとした補足説明。テンプレートエンジンでのエスケープ処理を「テンプレート内でフィルターを使って行う」以外に「タグ付けを使って行い、テンプレートを書く側が HTML エスケープについて意識せずに済ませる」というやり方の可能性について書いたが、これら二つを同時に提供するつもりはない。何故なら前者はデザイナーが最終的な責任を負うやり方なのだが、後者はスーパーバイザーが責任を負うやり方だからだ。全く同じ事を目的とするのに別々のロールで別々のやり方があるというのは、どう考えても Caty の原理原則にはそぐわない。

いっちゃあ何だが、「A というやり方と B というやり方があります」みたいにオプションを用意して、それら二つがまったく同じ結果をもたらすというのは、想像以上に学習コストを上げる結果になる。なので Caty スクリプトの do 記法についても最初はかなり抵抗したんだが、「まあ檜山さんしか使わないだろうし、正式なチュートリアルからは外させよう」ということでギリギリ採用となった経緯がある。

インラインスクリプトとアウトオブラインスクリプトもかなりギリギリの判断で、インラインスクリプトが書けないとデザイナーだけでテンプレートの表示確認がやり難いだろうという事と、はっきりとした用途とワークフローを提示すればこれら二つがこんがらがる事はないだろうという仮説の元に導入していたりする(少なくとも俺は悩んだ)。

ちなみにそのうちリリースされる Caty プロトタイプのバージョン2では、以下のようなディレクトリ構成に固定して動作させるようにしている。ここで $CATY_HOME は Caty のアーカイブを展開した先で、 sites は個々のサイトを配置する先である。

$CATY_HOME/
           /python
           /common
           /sites
                 /<YOUR_SITE>

当初は $CATY_HOME 下以外のディレクトリにサイトやサイトの一部を配置させてもいいという仕様だったが、そういう事をやると弊害しかないのでユーザにとっては欠片たりとも嬉しくない。というか、前の会社で元々そういうディレクトリ構造の(アーカイブを展開した先に全データがある)某 ERP パッケージについて R&D していたときに、上司の趣味でディレクトリ構造に手を入れさせられた結果として開発したパッケージを配布するのが著しく困難になったという苦い経験があるので、この手のサイトの構造を野放図なレベルで柔軟にさせることには断固として反対だったりする。

このオプションを可能な限り制限するアプローチの例外の一つが複数テンプレート構文のサポートであり、これはそれぞれのテンプレート構文に(といっても Smarty 的文法と Kid 的文法で十分な気がするが)実用上のはっきりしたメリット/デメリットがあるし、既に知っているテンプレートの構文が使えるのは非常に大きなメリットなので採用する価値のあるオプションだ。

2009-11-03
Tue

(23:34)

Caty の開発の副産物である構文解析ライブラリだが、実戦投入で多少はこなれてきたのでこれもそのうち正式に配布ページ作ってリリースしようかな。ドキュメント書くのが恐ろしく面倒なんで、近いうちにやるのは無理だけど。でも年内にはバージョン1.0をリリースしたいところ。

2009-11-06
Fri

(09:35)

インフルエンザに罹りました。

2009-11-07
Sat

(17:11)

とりあえず熱は平熱に落ち着いて危機は脱したところ。

2009-11-08
Sun

(02:40)

昼間寝すぎたせいか全然寝付けねーから数日ぶりに RSS リーダーのチェックしてたら、何か俺の知らない間にリリースされてた事を知った。ってちょっと待て、多分このバージョンは既知のバグが残りっぱなしだ。それもテンプレートエンジンのバグなんで、 Web 部分全般に関わる極めてヤバいバグだ(テスト漏れしてやがった)。ってか多分今の状態だと Wiki が動かないぞ。

あとどうでもいいけど、間違えて Caty のバージョンを prototype-1.0.0 じゃなくて 2.0.0 とかフッタに出してる。ダメじゃん、俺。

というわけで、今回は来週早々にバグフィックスリリースをすることになりそうだ。

2009-11-09
Mon

(20:42)

一時期「服用すると見えない大名行列の後を付いて行って飛び降り自殺する」などと騒がれた気がしなくもないタミフルだが、当然そんなことはなくインフルエンザは順調に治ってる。どうも副作用としてやたら眠くなって体温が平熱よりも下がるようだが、そんぐらいは仕方がない。

まあそんな事はどうでもいい。それよりみんなは Befunge というプログラミング言語を知っているか?

簡単に言ってしまえばソースコードの読み取られる向きがコロコロ変わる言語なんだが、もうとにかく凶悪極まりない。こいつで書かれたライフゲームのコードがこれだ。

v>>31g> ::51gg:2v++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9p BXY|-+<v3*89<%+ *                                                      *   +
21 >98 *7^>+\-0|<+ *                                                     *    +
*5 ^:+ 1pg15\,:< + *                                                     ***  +
10^  <>$25*,51g1v+                                                            +
-^ p<| -*46p15:+<+                                                            +
> 31^> 151p>92*4v+                                                            +
 ^_ ".",   ^ vp1<+                                                            +
>v >41p      >0 v+                                                            +
:5! vg-1g15-1g14<+                                                            +
+1-+>+41g1-51gg+v+                                                            +
1p-1vg+1g15-1g14<+                                                            +
g61g>+41g51g1-g+v+                                                            +
14*1v4+g+1g15g14<+                           * *                              +
5>^4>1g1+51g1-g+v+                           * *                              +
^ _^v4+gg15+1g14<+                           ***                              +
>v! >1g1+51g1+g+v+                                                            +
g8-v14/*25-*4*88<+                                                            +
19+>g51gg" "- v  +                                                            +
4*5  v<   v-2:_3v+                                                            +
 >^   |!-3_$  v<-+                                                            +
^    < <      <|<+                                                         ***+
>g51gp ^ >51gp^>v+                                                            +
^14"+"<  ^g14"!"<++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

一体何が何だかさっぱりわからない。本気で恐怖と狂気を感じる。というわけで(どういうわけだ) Befunge 93 のインタープリタを実装してみた。

上記のライフゲームの他に robots.bf とかボトルを数える奴、 quine.bf あたりが動いたので多分大丈夫だとは思う。問題点は死ぬほどすっとろいという事なんだが、これで実用コードを書く機会は永久に訪れないだろうからどうでもいい。

あとこの言語は Funge 98 というのが最新の仕様らしいが、そっちはさらに狂気の度合いが加速しており真剣に頭を抱えている。ソースコードが二次元の Befunge だけでなく、ソースコードが一次元になった Unifunge とソースコードが三次元空間内に存在し、当然読み取りの向きも三軸という Trefunge を仕様として定義しているのだからたまらない。ってかどうやって三次元のソースコードとか書くんだ。とてもじゃないが実装する気にならなかったので放置してる(恐らく未来永劫ならないであろう)。

2009-11-10
Tue

(11:55)

……メモ化使え、以上(ってコメントでも突っ込まれてるか)。ま、とりあえずシンプルな実装例でも出しておくか。

class memoize(object):
    def __init__(self, f):
        self.__function = f
        self.__cache = {}
    
    def __call__(self, *args):
        if args in self.__cache:
            return self.__cache[args]
        else:
            self.__cache[args] = self.__function(*args)
            return self.__cache[args]
    
    def clear(self):
        self.__cache.clear()
    
@memoize
def get():
    data = open('config.yaml').read().decode('utf8')
    config = yaml.load(data)
    return config

俺がこちらの方が望ましい理由と考える理由を以下に述べる。

  • 一般的に global 宣言を使うのは好ましいプログラミングスタイルではない
  • こんな大したことない処理に対してプロファイル取らずに最適化かけるのはバカらしい
    • if 文の実行コストが気になるような状況では、そもそも関数呼び出しのコストが先に問題になるので、いちいち気にしてたらキリがない
      • あるいは設定ファイルの内容なんてものが彼方此方から何度も参照されるのはおかしい
  • 「config.yaml が実行中に変化しない」という前提がそもそも怪しく、キャッシュのクリアがあった方が後々楽になる

しかしクロージャの使用の有無に関わらず global が出てくる時点で何か変とは思わんかったのか。

2009-11-11
Wed

(21:31)

最終局面で放置してた幻ノ塔ト剣ノ掟をようやくクリア。最後の方は完全に惰性になっていたので攻略 Wiki 大活躍だったが。序盤にちょっと感想書いたんだが、結局最後まで UI の悪さとバランスの無茶苦茶さ加減が付いて回るゲームだった。とりあえず UI は前に書いた通りなので、戦闘バランスの方を書いてみる。

このゲームは敵が最大で9体×4グループぐらいの編隊で出現することもあって、普通に殴ってるとキリがない。全8階構成(地上7階+地下1階)のうち、戦士が殴ってどうにかなる階はせいぜい3階までで、残りは魔術師必須。しかも魔術師一人じゃ到底捌ききれないので、大体4階に進む辺りからはメイン魔術師以外にも魔術師技能を覚えさせておく必要がある。装備品の関係上、称号技能を持っていない限りは魔術師の装備できる防具はローブとかその辺だが、どうせ前衛には戦士を一人だけ立たせておけばいいのでそこは問題ない。

大体5階にあがるあたりで敵の数と強さが暴力的に跳ね上がるので、そこで誰も破砕の核撃(ティルトウェイトみたいなもんだ)を使えないとまずい。特に6階以降は最初のターンに破砕の核撃を叩き込んで終了させるのがほぼ唯一の解となる。あまりにもこの辺のバランスが極端なんで、逆に緊張感が無くなってしまっている(プレイヤーがいろいろ諦めて開き直るので)。

エンカウント率も不可思議で、6歩ぐらい歩く間に4回エンカウントしてそのうち2回は敵の先制攻撃などのふざけた事態が実際に起こり得る。先制攻撃時には魔法が使えないので一気に全滅はないかと思いきや、ブレス系の攻撃は平気で使われるので「デスのブレスで即死」「ドラゴンのブレスで全滅」などが極普通に起こってしまう。そのため、6階以降は戦闘が終わる度にセーブ(どこでもセーブ可能)というチキン戦略を使うことになる。

序盤の感想で書いた通り、ヒントが極端に少ないもののダンジョンの謎解きはなかなかのもので、その部分の出来は割とよかったと思う。ただどうも迷宮内のショートカットの類が些か少なすぎで、目的地にたどり着くまでやたらと歩き回る必要があるのが大きなマイナス。一つのダンジョンにアタックをかける都合上仕方ない部分もあるかもしれないが、それでももうちょっとどうにかならなかったか。

他にもいろいろと不満点があるが(開錠がランダムで、失敗すると街に戻らないと再挑戦できないとか、武器防具の性能が表示されないとか)、主要な不満点は「戦闘バランスが悪い」「エンカウント率などがおかしい」「UI が悪い」「深刻なバグがある」あたりか。確かこれファミ通で4点付けたレビュアーがいたらしいけど、その気持ちはわからなくもない。

先に述べた通り、ダンジョンギミックはいろいろ用意されてるし、洋物ファンタジーっぽい画風や愉快なテキストなど雰囲気も良い。それだけに、 UI や戦闘バランスの調整が投げやり過ぎるのが惜しい。

2009-11-13
Fri

(23:20)

辛うじて今週中に proto-1.1.0 まで漕ぎ着けたので、そのうち Caty を使ってのアプリケーション開発のサンプルを書きたいところ。

2009-11-16
Mon

(11:53)

事業仕分けで科研費の見直しをする事それ自体は別にいいと思っていたが、あの削り方はどうなんだろ。どうも「基礎研究とか役に立たないから削ろうぜ」な雰囲気を感じてしまって、それはとてもヤバいと思う。仕分けで予算を縮小されたり凍結されたりした研究の中には、まあ確かに問題を抱えてるものもあったのかもしれないけど、でも単に研究内容についての広報が不十分だっただけってのもありうる話だろうしなあ。

基礎研究ってすぐに金になるかどうかまったく不明の純粋研究なわけで、そういった研究の費用を継続的に出す事を約束できるパトロンって国ぐらいしかない。応用研究やその上での技術・製品開発には基礎研究の成果が必須で、仮に日本が基礎研究を怠ってしまったらそれこそ諸外国の研究成果のおこぼれを頂戴するしかないんだけど、それは先進国としてどうなんだ。俺が他の先進国の住人だったら日本にキレるぞ。

そもそもパソコンに電源を入れてインターネットに接続するだけでも無数の基礎研究の成果を享受してるんだから、そういった研究に対して税金を払ってサポートするのはむしろ当たり前に思える。もちろん研究者側も一定の説明責任があるだろうし、予算は限られてるんだから研究成果や途中経過をみて予算の見直しをするのも当たり前といえばそうだ。

でも今回の削り方からは、そういったニュアンスが受け取れなかった。マジでこの先どうなるんだ。

2009-11-18
Wed

(22:14)

さてそろそろ Caty でのアプリケーション開発のチュートリアルというかサンプルを書いた方がいいとは思うのだが、次期リリースで良くなる部分が多々あるのも事実で、それを踏まえて書きたいなーとか思ってしまうと全然進まない。ってかそういうドキュメントも含めてリリースしろよって話なんだが。

2009-11-22
Sun

(00:05)

層・圏・トポス寄せ鍋に行ってきた。疲れてるので感想は箇条書きにて。

  • 寄せ鍋の如くみんなで持ち寄ったお題を発表する会だった
  • 最初は圏論入門の講義(圏論の公理群、圏の例をいっぱい、関手の定義)。初参加の人が何人かいたし、やんないとマズかった
  • 次は首謀者の hiroki_f さんの米田埋め込みやら米田の補題やらについてのなんやかんや。というか、途中から乱入した檜山さんの講義が始まったというかなんというか
  • 次は俺のカロウビ展開圏とデカルト閉圏における不動点についての二本立て。ってか前者に絞ってもっといろいろ調べるべきだった。後者はグダグダになって消化不良
    • もっとも前者もその真の核心部分は檜山さんが講義をおっ始めたが
    • カロウビ展開圏のあれやこれやについては、 Caty の開発に伴ってネタをポツポツと出すかも
  • ラストは hiratara さんの圏のシミュレーションライブラリのデモンストレーション
    • まだまだトイプログラミングの域らしいけど、何か面白い発見がありそうなライブラリだった
  • 恒例の飲み会というか食事会は本当に寄せ鍋

いつも通りの事ながら、大変に疲れたというか参加者のみなさんお疲れさまでした。泊まりがけの学会から直で会場にやってきた bonotake さんは特に。

2009-11-23
Mon

(20:16)

最近買った漫画とか音楽の話。

施川ユウキの漫画は基本的にデビュー作の「がんばれ酢めし疑獄!!」から変わってなくて、適度な皮肉とブラックジョークを交えて言葉遊びとインパクト重視の突発ネタと斜め上からのツッコミを延々と続けるという代物で、後の作品も

サナギさん
舞台が中学校になって固定の主人公+レギュラーキャラが出来ただけ
もずく、ウォーキング!
サナギさんが四コマじゃなくなっただけ
ツモっ子どうぶつの森
疑獄に近いっちゃ近いが、「雀卓を囲んだところからスタート」というシチュエーション固定になってる
12月生まれの少年
基本はサナギさんで主人公が小学生の男の子になっただけ
森のテグー
メルヘンっぽい舞台になっただけ。あと4コマじゃなくて15コマ漫画(何じゃそりゃ)にもなったか

とまあ本当に芸風は一貫して変わってないんだけど、毎度毎度面白い漫画をコンスタントに描けるのは凄い。特にサナギさん以降はキャラクターがやたら立っていてキャラクターものの日常4コマとしても読めることもあってか、酢めし疑獄の時にあったエクストリームさ加減がいい具合に中和されてる。そういう意味じゃ、今となってはサナギさんが基本的なスタイルと言えるか。

というわけでいつも通り大変面白い。

で、その作者のエッセイ漫画も発売されてた。こっちはエッセイ漫画であってギャグ漫画じゃないよ。というか普段の芸風の着眼点でエッセイ漫画やられると自虐漫画になるんだなあ。で、そこに対して入る作者の解説(ってかこれもエッセイか)がまた何とも言えない味わい。


ヴィジュアル系の始祖である Dead End がなんと 20 年ぶりに再結成しての新作。俺は別に V 系が嫌いではないというか V 系とゴシックロックを区別する必然性ってあんまりないよなあと思ってる。ので、こういう作品を聴きたくなるときもある。あと Dead End は元々はメタル畑の出身なので、そのメタルな素養がメタル耳にも聞きやすい音にしてるのかも知れん。

Princess の PV に何か感じるものがあったら買いだ。

2009-11-25
Wed

(13:22)

気がついたら全然料理日記を書いていなかったので久しぶりに書く。

今日の料理はカレー炒飯。面倒くさいんでレシピは省略というか、こんなもん適当にやってもそこそこ食えるものになる。スープの方はいつも通りの野菜スープ。ちなみにこのスープはヘマをしてメインの料理が塩辛い代物になったときは薄味に、逆の場合は若干濃い目に作ることで全体としてはまあ食えるというバランスを保つのにも使ってる。

2009-11-26
Thu

(13:41)

今日のご飯は久しぶりに肉じゃが。えーと、他に特に書く事なし。

2009-11-27
Fri

(22:17)

既に海外では「天才的」「忘れられないゲーム」「(新たなゲームジャンルの)起源」と大変な絶賛を浴びているのがこの Scribblenauts だ。開発元はドローン・トゥ・ライフやロックス・クエストを手がけた 5th Cell で、ロックス・クエストが良作だっただけにこれにもかなり期待していたのだが、その期待を遥に上回るものだった。とりあえず Challenge の Level 1 をクリアしたのでファーストインプレッションを兼ねてこのゲームの紹介をしてみる。

ゲームの流れは大きく分けて二つ。一方は最初に出たヒントに従い、ステージ中の人物にアイテムを渡したりオブジェクトを移動/破壊し、条件を満たすとクリアアイテム(Starite)入手となる Puzzle モード。これはその Puzzle の最初のステージで、手持ち無沙汰な四人のうち二人に何かしらふさわしいアイテムを渡すとクリアとなる。

普通のゲームならステージ内を探し回ってアイテムを見つけるとなるところだが、信じがたいことに Scribblenauts ではソフトウェアキーボード or 手書き入力で英単語/熟語を入力するとそれが実際のオブジェクトとして画面内に出現し、それを用いてステージをクリアしていく。例えばこのステージだと……

常識的に考えればこの場に足りないのはゾンビ(Zombie)だと思うので、試しにゾンビを呼び出してみる。

おい、本当に出てきたぞ。

ギャース、ゾンビが他のキャラを襲って感染した!

当然、ミッション失敗。一事が万事こんな調子で、各ステージ毎に攻略手段が無数に存在するだけでなく、ゲームオーバーの仕方も無数に存在する。何でもこのゲームで使えるオブジェクトは 20,000 種類以上だとか、オブジェクトと単語のデータベースを半年かけて作り込んだとか、とにかく作り込みが半端ない。

というわけで今度は真面目にやってみる。ゾンビは人を襲うから危険なので、ほんのジョークとして核兵器を出してみよう。

って出した途端に消防士の野郎が核兵器を危険物とみなして解体しようとしやがった……ってオイ、お前何やってんだ、お前の仕事は違うだろ。消防士は核兵器の解体とかしねえだろ。第一その核兵器を作動させるのは俺の役目だろ。

これはひどい。というわけで、思わぬオブジェクト間の相互作用で驚愕の展開が待ち受けていることも多々あるのが Scribblenauts の魅力だ。

いい加減本当に真面目にやると、例えば警察官には手錠(Handcuff)を渡して、シェフにはフライパン(Pan)を渡す。すると

見事クリア。こうやってヒントに従って適切なオブジェクトを出現させ、それでステージを解いていくわけだ。

また Puzzle の他に Action と呼ばれるステージもある。こちらはクリアのためのアイテムの場所が最初に提示され、そのアイテムをどうにかして手に入れればクリアだ。こちらはよりアクションパズル寄りなゲームになってる。

このステージはとにかく Starite を手に入れればいいのだが、木に引っかかっているのでやはり何かしらのオブジェクトを出して手に入れなければいけない。写真ではブーメラン(Boomerang)を投げつけて落としているが、他にも

  • ロック鳥(Roc)に乗って取る
  • 斧(Axe)やチェーンソー(Chainsaw)で木を切り倒す
  • バネ(Spring)でジャンプして取る

など解き方は山ほどある。

最後に俺が見つけたときに大爆笑した解き方を紹介しよう。

これは Puzzle の 1-8。公園のゴミを片付け、ハエを退治すればクリアとなる。普通にやるならゴミを全部ゴミ箱に突っ込んで、適当なアイテムでハエを叩き殺せばいいのだが、実はこのステージ、ゴミを全部叩き壊してハエを退治してもクリアとなる。ということはだな。

核兵器の出番だ。クリア条件達成時に Starite が出現する位置は常に同じなので、その出現位置で待ち構えつつ。核兵器を近くにセットする。あとは核兵器をタッチして作動させて、

爆発の時を待つのみ。

やっぱりダメに見えるかもしれないが……

きっちり Starite を手にして死んでいる。自分でやっといてなんだが、核兵器使ってスピードクリアができるとは思わなかった。一体どうなってるんだ、このゲームは。


というわけで、何かもう今年の俺的ベストゲームは早くも Scribblenauts に決定した感がある。これまでも複数の解き方が用意されているゲームというのはそれこそ無数に作られてきたが、ここまで与えられたミッションをプレイヤーが自由に解いていいゲームというのは存在しただろうか。ぶっちゃけ普通のゲームって算数の問題で言うと「X+1=10 のとき X の値は何」というもので、それが Scribblenauts だと「X+Y=10 になるように好きな X と Y を当てはめなさい」になったような印象だ。

こういう挑戦的なゲームには是非とも売れてほしいので皆買えよといいたいのだが、いかんせんこれ日本語にローカライズされてないし、そもそもゲームをクリアするのに英語の語彙力が多少なりとも必要という、ゲームデザインの時点でハードルが高い代物なんだよな。そこが残念だ。

それにしてもここまで「その手があったか!」「それやるか普通?」「正気か開発者」と衝撃を受けたゲームは本当に久しぶりだ。こういうゲームを遊ぶとまだまだゲームのネタは切れてないじゃんと思えるな。

追記:なんかやたらアクセスあるなと思ってたら、はてブでホットエントリに入ってた。それははあどうでもいいんだが、

fukken game カオス館行ってみるか。DSi以降はリージョンコントロールされてるから残念でした

Scribblenauts は DSi 専用じゃないんでリージョンコードは設定されてないよ。リージョンコードが設定されるのは DSi 専用ソフトと DSi ウェアのみ。

2009-11-29
Sun

(23:25)

昨日は層・圏・トポス勉強会とコパスタを食べる余会(意味不明)に行ってきた。

層・圏・トポスは層の章に入り、そこで位相の基礎が必要なのは数学科出身でない俺にはちと厳しい。あくまでも最低限必要なのは位相の常識的な演算らしいので、これは適当な本で勉強することにしよう。

コパスタを食べる余会は事前に告知されていた通り双対性がキーワード。大域変数やストレージの参照と例外処理が双対になってるんじゃーとか、そういうお話だった。最後の方はシーケント計算で例外処理を扱う話で、これはCatyスクリプトの例外処理にも関わってくる話。

あんまり説明してないけど Caty のコマンドって入出力の型宣言の他に例外宣言もできて、既に Caty のテスト機構のために例外処理機構も作ってある。とはいっても檜山さんの記事の通りのものではないんだが。一方でまだ内部的な処理が全然不十分で(ストレージやセッションへの書き込みにトランザクションがない)、そこら辺もちゃんと実装しないとなあ。言い方を変えれば、そういった部分を実装さえすればより実践的かつパスタの会でやった内容に忠実な処理系になるということでもあるんだが。

2009-11-30
Mon

(13:37)

ビーフシチュー作った。作り方? 大抵の市販のビーフシチューのルウのパッケージ裏には書いてあるだろ。