ログ: 2008/04

W05K は接続確立までが遅い

2008/04/28 | ごみ | コメント (4)

winxp だとダイヤルアップに 30 秒くらいはかかる.

で,クソだなあと思っていたんだけど,linux から wvdial したら 2 秒で繋がるじゃないか.早くなったとかいうレベルじゃねーぞ.

改めてみてみると win だと,なんか期待してるレスポンスが返ってこなくてタイムアウト待ってる感じがする.俺が設定間違えてるだけ? しかしみんな接続おせーなって言ってる気がする.

気づけよ,そして直せよ au.

これだけで使い勝手劇的に向上するんだから…….

キーワードポップアップ

2008/04/28 | ごみ | コメント (0)

dvorak.jp に入れてるのと同等のキーワードポップアップを入れたいなぁと.まぁ,はてなダイアリーキーワードみたいなのともいう.

dvorak.jp のやつは自分で書いたもので, php が出力の前に置換かけてキーワード用のタグ埋め込んでる.さすがにキャッシュはしてるけど,2 バイト 3 バイト程度のキーワードが出現するごとに 200 バイトくらいの説明文がそれぞれに付いてて冗長.ソースみるといたたまれない気分になる.ちょこっとしたページでやるならいいけど,ここみたいなテキストの塊でそれをやるのは気が引ける.

WordPress 用のプラグインで似たようなものがあるだろ,と探したら IMM-Glossary というのがそれらしい.

できること

  • 単語と説明の組を登録するとポップアップ
  • 埋め込むのは単語の ID だけ.説明は非同期で取りに行く
  • 単語一覧ページの生成

できないっぽいこと

  • 複数の単語をひとつの説明に関連付け
  • 単語一覧のグルーピング

わからんこと(要調査なこと)

  • ポップアップ用タグの埋め込みはどの時点で行われるのか
  • 出力の時点でなら,結果のキャッシュはしているのか
  • 多言語対応しているのか.半角スペースで単語切らない言語でもキーワードにマッチするか
     -> 多分しないんだろうなぁ……英語だとしたら困るし
  • 投稿時に書くキーワード認識用の単語を,表示用の単語に置換できるか
     -> スペースで区切らないでもマッチするようにするとき,これができないと誤まってマッチしまくる

ということでテスト導入して調べてみよう.んで足りなさそうなら弄るしかあるまい.一から書いた方が早いんじゃねという妄想も頭をよぎるけど大抵ほんとにただの妄想だからおとなしく.

これがないとタイピング関連とかで濃い内容書く気にならないからなぁ.

全てが高速のようだ

周りが速いんじゃなくて自分が遅いだけなんてことは理解しているが.

「もう4月末だよ」 「ほんとだーはやーい」

みたいな振り返ってみたら時間が早く過ぎてました感ではなくて,リアルタイムに「うわっもう一時間経った!」とかいう風に速い.ほぼ常に.

そんなにぼーっとしているつもりはないんだけど,多分周りからみたらしているんだろうな.そうじゃないとこの時間経過はありえない.無能な人間になったものである.

とかいう自己規定がまずいんだろうけど.

とかいう自分に対する冷めた態度がまたまずいんだろうけど.

とかいう不毛な考えをとりあえず行けるとこまでいってみようとするのがまたまたまずいんだろうけど.

等々.そしてまた20分が過ぎたらしい.

東大生の英語力

一年生ばかりの英語二列Rと二年生ばかりの英語二列Cを同時に履修している俺だから確信できる.

一年生の英語力のほうが数段上である.

……って言ってしまうとまぁそうだろうなとしか思われないわけだけど,身をもってその実力差を思い知った俺であった.

大学受験期が人生で一番博学だよねとかよく言うけど,英語でこれはひどい.

ひどいと思いつつも俺も英語力ガタ落ちしているから困る. 俺に関して言えば,三年生相当だもんなぁ.ひどいわけだ.

QRコード書きませんか

2008/04/25 | つくる | コメント (8)

QRコードかいてる環境

急に工学っぽいことに目覚めたわけではないんだけど,ちょっと前に QR コードの仕様が気になって調べた.

といっても JIS とか ISO から規格書取り寄せると金がかかるので,こちらのサイトにお世話になって.別に規格の全容を把握してライブラリ作ろうとしてるとかそういうわけじゃないので十分.

そして何をどこで間違えたのか,QR コードを手で書けたらかっこよくね? という変態スキルの魅力に取り憑かれ,最近は専ら現実逃避の手段として QR コードを書こう*1としていた.

でかいのは無理そうだが,一番小さいバージョン 1 でならさくっと書き上げれるんじゃね?

……と思ったのだけど,結論から言うと,かなり無理です.

アライメントパターンも入らず,インターリーブ配置も必要ないこのサイズの QR コードの作り方は,ざっくり言えば,

(1) 表現するデータをビット列に直す -> (2) RS (Reed-Solomon) 符号をつける -> (3) 配置する -> (4) マスクをかける

という,まぁ当然そうなるわなっていう工程しかないんだけど,(2) がひたすらに鬼門.

符号の作り方なんて,コンピュータで処理するときに高速便利なようになってるわけで,人力計算に向かないのは当然すぎるんだが,それにしても大変だ.

0~255 の整数それぞれを,全く関係ないようにみえる*2 0~255 の整数に変換できなきゃだめだったり. ……まぁこれは対応を覚えればいいだけなんだけど,無機質な数を無機質な数に対応させる関係を暗記するのは半端ではない難度.

これ今のところ全然覚えれていないので,こちらの表に頼りながら変換してる.

さらに,8bit のビット列同士の xor を最低でも 150 回から計算しなきゃいけない.表面的には 0~255 な 10 進数になってるので, 「199 と 52 の xor は?」 みたいなのを 150 回以上.慣れればある高速化できそうだけど普通の人間には苦痛でしょうがない計算だ.

俺は,19 バイトのデータから 7 バイトの RS 符号を計算するのに 3 時間強かかった.アホである.

ちなみに (1) は ascii コード覚えてる人なら数分でできて,(3) と (4) はがんばれば 30 分くらいかな.*3

手書きQRコード

そんなわけで計 5 時間くらいはかかって書いたのがこの左の QR コードだ.手書きしたものをさらにデジカメで撮ってアップという多重劣化……でも多分,お手持ちのケータイで試してもらえば拾えると思う.

工程の最後の方,実際に 21×21 のセルを鉛筆で塗っていく部分はかなりエキサイティングな作業だったし,書き終えたものをケータイにかざして読み取れた瞬間の爽快感といったらないよ.

ただし,やはり RS 符号化を手計算するのは素人にはおすすめしない.10 年分のセンター数学で全て満点取れるくらいの計算力がないと,途中でダウンするか,途中で計算間違いして結果の符号がはちゃめちゃになってせっかく塗っても読み取れないかどっちかである.*4

ということで興味を持った人向けに,QR コードバージョン 1 のスケルトンおよび, RS 符号を求める部分だけを機械任せにできるプログラムを配布する.*5

  • matrix1.png
    21×21 の方眼線だけ引いた画像.上級者向け.200dpi くらいで印刷するとえんぴつで塗るのにちょうどいいサイズ.
  • matrix2.png
    matrix1.png に加え,7×7 ごとに太線.中級者向け.
  • matrix3.png
    matrix1.png に加え,固定パターンを塗り,形式情報を書く部分に薄く着色,さらに 2×4 の矩形を太線で.初心者向け.
  • rs.exe
    データをコマンドライン引数として与えると,RS 符号を出力するコンソールアプリケーション.
  • rs.d
    rs.exe のソースコード.

rs.exe の使い方.データコードを 10 進表記した列(ここの最下部にある 32 65 205 69 41 220 46 128 236 とか)を,コマンドライン引数として渡す.

C:\unko> rs.exe 32 65 205 69 41 220 46 128 236

すると

[42,159,74,221,244,169,239,150,138,70,237,85,224,96,74,219,61]

のように RS 符号部が出力される.

バージョン 1 のみ対応だけど,その範囲なら,与える引数の数から誤り訂正レベルを決定してくれます.上記では 9 個与えてるからレベル H だけど 19 個与えたらレベル L になる.*6

日本語話者の中に俺の他にあと一名でも QR コードを手で書いたら面白いんじゃねと思う変な人がいるのかは知らないけどね.

  1. 「描く」を使うべきなのかな.でも仮にも「コード」だし「書く」でも…… []
  2. 表面的にはの話.実際は GF(2^8) 使って一対一対応させているからめちゃ厳密な関係がある []
  3. 適切なマスク選択をすることをはなから諦め適当なマスクをかけるだけの場合.全マスクかけてみて点数計算し,最適なものを選ぶというステップを踏むなら,ここにも数時間かかる. []
  4. 俺は一段階ずつプログラムで求めた結果と照合し,確認しながら進めるというチート行為を使った.センター数学 10 年連続満点とか無理. []
  5. あとの部分の作り方はこのページを参考にどうぞ. []
  6. まぁ生成多項式がハードコーディングしてあったりするひどい手抜きだということはソースみれば一目瞭然なの. []

今更だが打鍵トレーナー

改造・再配布可になってたのね!

ライセンスってレベルじゃねーぞではあるけど*1 ,ふつうに嬉しい.知らなかった.

気になることがありまくってたのでこれを機に俺式カスタムしてみてもいいかも.やるっていうとやらないからやるとは言わない.

とか言いつつソースちぇきしてたら,

function setTYA(no){
    tya = no;
    setAllOption();
    if(tya == 1){
        stex[45][1]="cha";stex[45][2]="cya";stex[45][3]="tya"; stex[167][1]="cha";stex[167][2]="cya";stex[167][3]="tya"
        sttex[45][1]="ccha";sttex[45][2]="ccya";sttex[45][3]="ttya";sttex[45][4]="ltucha";sttex[45][5]="ltucya";sttex[45][6]="ltutya";
        sttex[162][1]="ccha";sttex[162][2]="ccya";sttex[162][3]="ttya";sttex[162][4]="ltucha";sttex[162][5]="ltucya";sttex[162][6]="ltutya";
        stnex[44][1]="nncha";stnex[44][2]="nncya";stnex[44][3]="nntya";stnex[44][4]="ncha";stnex[44][5]="ncya";stnex[44][6]="ntya";
        stnex[160][1]="nncha";stnex[160][2]="nncya";stnex[160][3]="nntya";stnex[160][4]="ncha";stnex[160][5]="ncya";stnex[160][6]="ntya";
        stex[46][1]="chu";stex[46][2]="cyu";stex[46][3]="tyu"; stex[168][1]="chu";stex[168][2]="cyu";stex[168][3]="tyu";
        sttex[46][1]="cchu";sttex[46][2]="ccyu";sttex[46][3]="ttyu";sttex[46][4]="ltuchu";sttex[46][5]="ltucyu";sttex[46][6]="ltutyu";
        sttex[163][1]="cchu";sttex[163][2]="ccyu";sttex[163][3]="ttyu";sttex[163][4]="ltuchu";sttex[163][5]="ltucyu";sttex[163][6]="ltutyu";
        stnex[45][1]="nnchu";stnex[45][2]="nncyu";stnex[45][3]="nntyu";stnex[45][4]="nchu";stnex[45][5]="ncyu";stnex[45][6]="ntyu";
        stnex[161][1]="nnchu";stnex[161][2]="nncyu";stnex[161][3]="nntyu";stnex[161][4]="nchu";stnex[161][5]="ncyu";stnex[161][6]="ntyu";
        stex[44][1]="che";stex[44][2]="cye";stex[44][3]="tye"; stex[166][1]="che";stex[166][2]="cye";stex[166][3]="tye";
        sttex[44][1]="cche";sttex[44][2]="ccye";sttex[44][3]="ttye";sttex[44][4]="ltuche";sttex[44][5]="ltucye";sttex[44][6]="ltutye";
        sttex[161][1]="cche";sttex[161][2]="ccye";sttex[161][3]="ttye";sttex[161][4]="ltuche";sttex[161][5]="ltucye";sttex[161][6]="ltutye";
        stnex[43][1]="nnche";stnex[43][2]="nncye";stnex[43][3]="nntye";stnex[43][4]="nche";stnex[43][5]="ncye";stnex[43][6]="ntye";
        stnex[159][1]="nnche";stnex[159][2]="nncye";stnex[159][3]="nntye";stnex[159][4]="nche";stnex[159][5]="ncye";stnex[159][6]="ntye";
        stex[47][1]="cho";stex[47][2]="cyo";stex[47][3]="tyo"; stex[169][1]="cho";stex[169][2]="cyo";stex[169][3]="tyo";
        sttex[47][1]="ccho";sttex[47][2]="ccyo";sttex[47][3]="ttyo";sttex[47][4]="ltucho";sttex[47][5]="ltucyo";sttex[47][6]="ltutyo";
        sttex[164][1]="ccho";sttex[164][2]="ccyo";sttex[164][3]="ttyo";sttex[164][4]="ltucho";sttex[164][5]="ltucyo";sttex[164][6]="ltutyo";
        stnex[46][1]="nncho";stnex[46][2]="nncyo";stnex[46][3]="nntyo";stnex[46][4]="ncho";stnex[46][5]="ncyo";stnex[46][6]="ntyo";
        stnex[162][1]="nncho";stnex[162][2]="nncyo";stnex[162][3]="nntyo";stnex[162][4]="ncho";stnex[162][5]="ncyo";stnex[162][6]="ntyo";
        if(nn == 1){
            stnex[44][1]="ncha";stnex[44][2]="ncya";stnex[44][3]="ntya";stnex[44][4]="nncha";stnex[44][5]="nncya";stnex[44][6]="nntya";
            stnex[160][1]="ncha";stnex[160][2]="ncya";stnex[160][3]="ntya";stnex[160][4]="nncha";stnex[160][5]="nncya";stnex[160][6]="nntya";
            stnex[45][1]="nchu";stnex[45][2]="ncyu";stnex[45][3]="ntyu";stnex[45][4]="nnchu";stnex[45][5]="nncyu";stnex[45][6]="nntyu";
            stnex[161][1]="nchu";stnex[161][2]="ncyu";stnex[161][3]="ntyu";stnex[161][4]="nnchu";stnex[161][5]="nncyu";stnex[161][6]="nntyu";
            stnex[43][1]="nche";stnex[43][2]="ncye";stnex[43][3]="ntye";stnex[43][4]="nnche";stnex[43][5]="nncye";stnex[43][6]="nntye";
            stnex[159][1]="nche";stnex[159][2]="ncye";stnex[159][3]="ntye";stnex[159][4]="nnche";stnex[159][5]="nncye";stnex[159][6]="nntye";
            stnex[46][1]="ncho";stnex[46][2]="ncyo";stnex[46][3]="ntyo";stnex[46][4]="nncho";stnex[46][5]="nncyo";stnex[46][6]="nntyo";
            stnex[162][1]="ncho";stnex[162][2]="ncyo";stnex[162][3]="ntyo";stnex[162][4]="nncho";stnex[162][5]="nncyo";stnex[162][6]="nntyo";
        }
    }else if(tya == 2){
        stex[45][1]="cya";stex[45][2]="tya";stex[45][3]="cha"; stex[167][1]="cya";stex[167][2]="tya";stex[167][3]="cha"
        sttex[45][1]="ccya";sttex[45][2]="ttya";sttex[45][3]="ccha";sttex[45][4]="ltucya";sttex[45][5]="ltutya";sttex[45][6]="ltucha";
        sttex[162][1]="ccya";sttex[162][2]="ttya";sttex[162][3]="ccha";sttex[162][4]="ltucya";sttex[162][5]="ltutya";sttex[162][6]="ltucha";
        stnex[44][1]="nncya";stnex[44][2]="nntya";stnex[44][3]="nncha";stnex[44][4]="ncya";stnex[44][5]="ntya";stnex[44][6]="ncha";
        stnex[160][1]="nncya";stnex[160][2]="nntya";stnex[160][3]="nncha";stnex[160][4]="ncya";stnex[160][5]="ntya";stnex[160][6]="ncha";
        stex[46][1]="cyu";stex[46][2]="tyu";stex[46][3]="chu"; stex[168][1]="cyu";stex[168][2]="tyu";stex[168][3]="chu";
        sttex[46][1]="ccyu";sttex[46][2]="ttyu";sttex[46][3]="cchu";sttex[46][4]="ltucyu";sttex[46][5]="ltutyu";sttex[46][6]="ltuchu";
        sttex[163][1]="ccyu";sttex[163][2]="ttyu";sttex[163][3]="cchu";sttex[163][4]="ltucyu";sttex[163][5]="ltutyu";sttex[163][6]="ltuchu";
        stnex[45][1]="nncyu";stnex[45][2]="nntyu";stnex[45][3]="nnchu";stnex[45][4]="ncyu";stnex[45][5]="ntyu";stnex[45][6]="nchu";
        stnex[161][1]="nncyu";stnex[161][2]="nntyu";stnex[161][3]="nnchu";stnex[161][4]="ncyu";stnex[161][5]="ntyu";stnex[161][6]="nchu";
        stex[44][1]="cye";stex[44][2]="tye";stex[44][3]="che"; stex[166][1]="cye";stex[166][2]="tye";stex[166][3]="che";
        sttex[44][1]="ccye";sttex[44][2]="ttye";sttex[44][3]="cche";sttex[44][4]="ltucye";sttex[44][5]="ltutye";sttex[44][6]="ltuche";
        sttex[161][1]="ccye";sttex[161][2]="ttye";sttex[161][3]="cche";sttex[161][4]="ltucye";sttex[161][5]="ltutye";sttex[161][6]="ltuche";
        stnex[43][1]="nncye";stnex[43][2]="nntye";stnex[43][3]="nnche";stnex[43][4]="ncye";stnex[43][5]="ntye";stnex[43][6]="nche";
        stnex[159][1]="nncye";stnex[159][2]="nntye";stnex[159][3]="nnche";stnex[159][4]="ncye";stnex[159][5]="ntye";stnex[159][6]="nche";
        stex[47][1]="cyo";stex[47][2]="tyo";stex[47][3]="cho"; stex[169][1]="cyo";stex[169][2]="tyo";stex[169][3]="cho";
        sttex[47][1]="ccyo";sttex[47][2]="ttyo";sttex[47][3]="ccho";sttex[47][4]="ltucyo";sttex[47][5]="ltutyo";sttex[47][6]="ltucho";
        sttex[164][1]="ccyo";sttex[164][2]="ttyo";sttex[164][3]="ccho";sttex[164][4]="ltucyo";sttex[164][5]="ltutyo";sttex[164][6]="ltucho";
        stnex[46][1]="nncyo";stnex[46][2]="nntyo";stnex[46][3]="nncho";stnex[46][4]="ncyo";stnex[46][5]="ntyo";stnex[46][6]="ncho";
        stnex[162][1]="nncyo";stnex[162][2]="nntyo";stnex[162][3]="nncho";stnex[162][4]="ncyo";stnex[162][5]="ntyo";stnex[162][6]="ncho";
        if(nn == 1){
            stnex[44][1]="ncya";stnex[44][2]="ntya";stnex[44][3]="ncha";stnex[44][4]="nncya";stnex[44][5]="nntya";stnex[44][6]="nncha";
            stnex[160][1]="ncya";stnex[160][2]="ntya";stnex[160][3]="ncha";stnex[160][4]="nncya";stnex[160][5]="nntya";stnex[160][6]="nncha";
            stnex[45][1]="ncyu";stnex[45][2]="ntyu";stnex[45][3]="nchu";stnex[45][4]="nncyu";stnex[45][5]="nntyu";stnex[45][6]="nnchu";
            stnex[161][1]="ncyu";stnex[161][2]="ntyu";stnex[161][3]="nchu";stnex[161][4]="nncyu";stnex[161][5]="nntyu";stnex[161][6]="nnchu";
            stnex[43][1]="ncye";stnex[43][2]="ntye";stnex[43][3]="nche";stnex[43][4]="nncye";stnex[43][5]="nntye";stnex[43][6]="nnche";
            stnex[159][1]="ncye";stnex[159][2]="ntye";stnex[159][3]="nche";stnex[159][4]="nncye";stnex[159][5]="nntye";stnex[159][6]="nnche";
            stnex[46][1]="ncyo";stnex[46][2]="ntyo";stnex[46][3]="ncho";stnex[46][4]="nncyo";stnex[46][5]="nntyo";stnex[46][6]="nncho";
            stnex[162][1]="ncyo";stnex[162][2]="ntyo";stnex[162][3]="ncho";stnex[162][4]="nncyo";stnex[162][5]="nntyo";stnex[162][6]="nncho";
        }
    }else{
        stex[45][1]="tya";stex[45][2]="cya";stex[45][3]="cha"; stex[167][1]="tya";stex[167][2]="cya";stex[167][3]="cha"
        sttex[45][1]="ttya";sttex[45][2]="ccya";sttex[45][3]="ccha";sttex[45][4]="ltutya";sttex[45][5]="ltucya";sttex[45][6]="ltucha";
        sttex[162][1]="ttya";sttex[162][2]="ccya";sttex[162][3]="ccha";sttex[162][4]="ltutya";sttex[162][5]="ltucya";sttex[162][6]="ltucha";
        stnex[44][1]="nntya";stnex[44][2]="nncya";stnex[44][3]="nncha";stnex[44][4]="ntya";stnex[44][5]="ncya";stnex[44][6]="ncha";
        stnex[160][1]="nntya";stnex[160][2]="nncya";stnex[160][3]="nncha";stnex[160][4]="ntya";stnex[160][5]="ncya";stnex[160][6]="ncha";
        stex[46][1]="tyu";stex[46][2]="cyu";stex[46][3]="chu"; stex[168][1]="tyu";stex[168][2]="cyu";stex[168][3]="chu";
        sttex[46][1]="ttyu";sttex[46][2]="ccyu";sttex[46][3]="cchu";sttex[46][4]="ltutyu";sttex[46][5]="ltucyu";sttex[46][6]="ltuchu";
        sttex[163][1]="ttyu";sttex[163][2]="ccyu";sttex[163][3]="cchu";sttex[163][4]="ltutyu";sttex[163][5]="ltucyu";sttex[163][6]="ltuchu";
        stnex[45][1]="nntyu";stnex[45][2]="nncyu";stnex[45][3]="nnchu";stnex[45][4]="ntyu";stnex[45][5]="ncyu";stnex[45][6]="nchu";
        stnex[161][1]="nntyu";stnex[161][2]="nncyu";stnex[161][3]="nnchu";stnex[161][4]="ntyu";stnex[161][5]="ncyu";stnex[161][6]="nchu";
        stex[44][1]="tye";stex[44][2]="cye";stex[44][3]="che"; stex[166][1]="tye";stex[166][2]="cye";stex[166][3]="che";
        sttex[44][1]="ttye";sttex[44][2]="ccye";sttex[44][3]="cche";sttex[44][4]="ltutye";sttex[44][5]="ltucye";sttex[44][6]="ltuche";
        sttex[161][1]="ttye";sttex[161][2]="ccye";sttex[161][3]="cche";sttex[161][4]="ltutye";sttex[161][5]="ltucye";sttex[161][6]="ltuche";
        stnex[43][1]="nntye";stnex[43][2]="nncye";stnex[43][3]="nnche";stnex[43][4]="ntye";stnex[43][5]="ncye";stnex[43][6]="nche";
        stnex[159][1]="nntye";stnex[159][2]="nncye";stnex[159][3]="nnche";stnex[159][4]="ntye";stnex[159][5]="ncye";stnex[159][6]="nche";
        stex[47][1]="tyo";stex[47][2]="cyo";stex[47][3]="cho"; stex[169][1]="tyo";stex[169][2]="cyo";stex[169][3]="cho";
        sttex[47][1]="ttyo";sttex[47][2]="ccyo";sttex[47][3]="ccho";sttex[47][4]="ltutyo";sttex[47][5]="ltucyo";sttex[47][6]="ltucho";
        sttex[164][1]="ttyo";sttex[164][2]="ccyo";sttex[164][3]="ccho";sttex[164][4]="ltutyo";sttex[164][5]="ltucyo";sttex[164][6]="ltucho";
        stnex[46][1]="nntyo";stnex[46][2]="nncyo";stnex[46][3]="nncho";stnex[46][4]="ntyo";stnex[46][5]="ncyo";stnex[46][6]="ncho";
        stnex[162][1]="nntyo";stnex[162][2]="nncyo";stnex[162][3]="nncho";stnex[162][4]="ntyo";stnex[162][5]="ncyo";stnex[162][6]="ncho";
        if(nn == 1){
            stnex[44][1]="ntya";stnex[44][2]="ncya";stnex[44][3]="ncha";stnex[44][4]="nntya";stnex[44][5]="nncya";stnex[44][6]="nncha";
            stnex[160][1]="ntya";stnex[160][2]="ncya";stnex[160][3]="ncha";stnex[160][4]="nntya";stnex[160][5]="nncya";stnex[160][6]="nncha";
            stnex[45][1]="ntyu";stnex[45][2]="ncyu";stnex[45][3]="nchu";stnex[45][4]="nntyu";stnex[45][5]="nncyu";stnex[45][6]="nnchu";
            stnex[161][1]="ntyu";stnex[161][2]="ncyu";stnex[161][3]="nchu";stnex[161][4]="nntyu";stnex[161][5]="nncyu";stnex[161][6]="nnchu";
            stnex[43][1]="ntye";stnex[43][2]="ncye";stnex[43][3]="nche";stnex[43][4]="nntye";stnex[43][5]="nncye";stnex[43][6]="nnche";
            stnex[159][1]="ntye";stnex[159][2]="ncye";stnex[159][3]="nche";stnex[159][4]="nntye";stnex[159][5]="nncye";stnex[159][6]="nnche";
            stnex[46][1]="ntyo";stnex[46][2]="ncyo";stnex[46][3]="ncho";stnex[46][4]="nntyo";stnex[46][5]="nncyo";stnex[46][6]="nncho";
            stnex[162][1]="ntyo";stnex[162][2]="ncyo";stnex[162][3]="ncho";stnex[162][4]="nntyo";stnex[162][5]="nncyo";stnex[162][6]="nncho";
        }
    }
}

こういう,あうあうしちゃいますなものが,ものすごい勢いで押し寄せてきた.*2

関数名が setTYA って……末恐ろしい.

鎚鏡とか,一段落したあとにかな打ち対応等しようとすると限界があるなぁということに気づきまくって全然だめでしたごめんなさいな気分になってたけど,こういう頑張りよりは幾分マシだなと思い直した,という自画自賛.

 

ちなみに以上が,シンタックスハイライタのテストでした.配色が非常に気に食わん.そのうち直そう.

  1. 人のことは言えない []
  2. typing.cgi の行数が 2700 オーバー,130 KB []

久しぶりにアーケード TOD でも……

と思って下北沢のゲーセン覗いたらなくなっていた.そのうちなくなるだろうなと思ってたけど実際なくなっているとかなり悲しい.

都内にあとどれくらい残ってるんだろう.探せばありそうな探してもあんまりなさそうな.

あーあ,アキバの東京レジャーランドの通路際においてあってギャラリー集めることができた時代がなつかしすぎる.

お忍びで K-1 タイピング

実は行ったことすらなかった.*1

最近無駄にたくさん Fedora 8 な環境ができたのでそっちから行ったらすんなりと.ただしキーボードは HHK でスピードには期待できない.打鍵がやたら正確にはなるんだけどねぇ.

タイピングみたいな時間にシビアなゲームでネット対戦,さらにサーバーを介すモデルとなると抵抗感ありまくりだったんだけど,そんなに気にならないものなんだなぁ,と思った.凝視してるのは主に自分の打鍵列で,そっちはローカルでほぼラグなく更新されていくから別に気にならないという感じかな.

手元での表示では自分が先に打ち切っていても,サーバの仲裁で実は自分の方が遅かったとわかるケースはやはりあって気になるけど,しょうがないし.

てか,両クライアントはローカルでのスタート時刻を事前にサーバに通知されてスタートし,そこからローカルでの経過時間とどこまで打ったかをセットにして随時サーバに報告,打ち切り報告が来たらその時間を比較してサーバが判定下す……って実装してるって認識であってるのかな?

この手のリアルタイム対戦の実現手法についてはそれらしき学士論文読んでふーんって思ったことがあるくらいで詳しくないんだけど,実際問題,ネット対戦くらいできるようにしないとタイピングゲーム作ろうと見向きもされないでしょうと思ってるから地味に勉強しておくか.さすがにいきなりはやらない気がするが.

WT くらいの単純な対戦だったら意外とずさんな実装でも大丈夫そうだけど*2,もっと細かく色々な情報共有し出すと整合性取るの大変になる気がするなあ.気がするだけで意識すればいいことは単純な気もするけど……やってみないことにはわからない.

それに加えてクライアントの虚偽申告,要するに不正対策とかまで考え出すとたまらんな.

気づいたら全然タイピングの話してないし.K-1 タイピングの話だっけ.

とりあえず伝え聞いていた通り,J が使えず Z で打たなきゃいけないのが死ねた.グラフィック演出等はさすが.タイピングゲームとしてのシステム自体は工夫のくの字もなく,面白くない.*3でも観客システムとかはいいな.

それと,ダウンロードもアーカイブ解凍もインストールも設定も不要でしかもマルチプラットフォームでインタラクティブなこともできるわ演出も得意だわ通信も気軽だわな Flash ゲームはやっぱ強いなぁとも.イマドキの人には特に受けそうである.

インプット周りとかクソみたいな制限があったりすると聞くしやっぱ所詮 Flash だしマイナス面というか限界もあるべ,とは思うけど,使えて損もないなぁ.個人的には Flash に虫酸が走るんだけど,ただの僻みじゃね,とも.

  1. というか,メイン機からだと Flash Player のバージョンの問題かロード途中で進まなくなるって現象に出くわして入れなかった. []
  2. いや WT がどういう実装してるのか知らないからこんなこと言っちゃ失礼なんだけど []
  3. 対人対戦だからそれだけでけっこう遊べてしまうけど. []

12RIVEN (5)

まずは,公式ページにある意味深な文面たちから見ていこう.

(Introduction -> 1 ページ目)

物語は錬丸視点、鳴海視点で展開し、それぞれの視点の問題を解決する事で、ミュウを守り第弐エクリプス計画を阻止する事ができる。

まず、錬丸視点では、ミュウを守りながら時の止まった世界からの脱出を模索し、鳴海視点では第弐エクリプス計画を阻止すべく奮闘努力する。

そして、それらの視点で一通り問題を解決すると……各キャラクターが何者で、どんな仕掛けで事件が起こり……などなど、謎が解決していく「∫ルート」が開放される。

その、「∫ルート」をすすめると晴れて、ミュウを守り第弐エクリプス計画を阻止できるのだが、それはハッピーエンドか。それともバッドエンドか……

公式ページに堂々と「錬丸視点」「鳴海視点」それぞれをクリアすると「∫ルート」が開いて,そこで「各キャラクターが何者で」「どんな仕掛けで事件が起こ」っているのかなどの「謎が解決していく」という情報が筒抜けになっている.

さらにそれぞれのルートの具体的な中身も,かなり的確に表現してある.序盤中盤の本文なんかよりはよほど的確だ.

まぁここまではそこまで怪しくないとしても,「∫ルートをすすめると」「ミュウを守り第弐エクリプス計画を阻止できる」 という完全な結末まで明記してある.さも重要ではないかのようにだ.

そこに書いてある内容にとどまらない大どんでん返し展開があるかというと,ない.構造的な謎解きが絡んでいるため上記の文面からストーリーの全容がわかるわけではないが,「お話」 としての 12RIVEN の結末は完全に公式ページに記載されていると言える.つけ加えるなら,構造的な謎解き要素についても,「どんな仕掛けで事件が起こり」 という形でその存在が示されていて,「解決していく」と,本文中で解決することまで明記してある.

以上のことから 「確かに『お話』としても読めるし完結してるように書いたけど,そこはさして重要ではないのだよ」 という作り手のメッセージが汲み取れる.

お話としての展開は明らかに Remember11 よりも Ever11 よりもリズムがあって面白かった.で,そこから 「次にどうなるのかな,わくわく」 みたいな面白さを意図した部分が大きい作品だろという見方が出てくるわけだが,そういう方針ならこの公式ページの記述に説明がつかない.そういう普通の小説的な「結末がどうなるのか」を面白さの核にする作品なら,公式ページにこんなネタバレをすることはありえないからだ.やはり,作り手の側にメタった読み方を推奨するという意図があることをほのめかして感じられる.

さらにダメ押しすれば,「ミュウを守り第弐エクリプス計画を阻止できる」 とまで書いておいて 「それはハッピーエンドか。それともバッドエンドか……」 なんて書いてあるじゃないか.ヒロインは助かり計画も阻止.誰がどう読んでもハッピーエンドのはずである. なのに,なのに,「それはハッピーエンドか。」 と続く.そして本文でも,特にひっかかる点は(一応第三の話とか出てるけど)なく,キスして綺麗にハッピーエンド.

おかしい話である.こういう作品はある意味で展開の意外性をウリにしてるはずなのに,まったくそれがない.そこから,この文の真意は,「上の次元から考えたとき,『それは』本当に『ハッピーエンドか』?」 なのではないかと読める.

続いて

(Production Notes)

integral ~新しいエンターテイメントへの挑戦~

というこのページ.メタフィクションという単語があからさまに出現し,普通に Introduction の中の 1 ページとして存在してもいいはずなのにわざわざ 1 メニュー項目を使ってまで integral という単語について解説している.やけにクサいではないか.ただ意味深な内容を置いて期待感を持たせているだけだろう,というような現実的解答は拒否する.考えるというか,妄想するのである.それが楽しむコツ.

まずはここ.

本作ではゲーム世界の次元から現実世界の次元への、その次元を越える操作に『インテグラル』という言葉をあてている。そしてこれが、我々が『インテグラル』に込めた想いである。

前エントリでも書いたけど,こんなこと言っている割に作中で「インテグラル」という単語が「次元を越える」ようなものとして使われることは,(調べてないけどたぶん)一度もない.出てくるのは,「∫ルート」という解答編の名前としてと,インテグラルという(実は二つの)建物の名前として.

前者についてはなぜどうしてその名前なのかということは一切説明がない.錬丸ルートと鳴海ルートに対して突然「∫ルート」.インテグラルというのが今回のテーマに絡んでいるようだ,という認識はしつこすぎるくらいに(インテグラル記号を二つ重ねたマークをリミナリティのマークにするとかして)プレイヤーにすり込んであるからなんとなく 「解答編ってことだな」 という認識になるが,よく考えてみると,いや,よく妄想してみると,「∫ルート」 という名前に説明がなにもついていない.クリアした人でも,二つの視点が交互に書かれるからそれが「インテグラル」なのかな,とか,構造的な種明かしがあるからそれが「インテグラル」なのかな,とか適当な理解にそれぞれ勝手に至るだけ.結局最後まで謎の「∫」である.

で,後者の建物のインテグラルだが,片方はホテル「ル・グランティス」(であってる?)が正式な名前で,アナグラムにすると(s を∫と見立てて) ∫integral になり,錬丸とミュウの間でだけ使われていた呼び方だった,という設定で,もう片方はタワーの名前がインテグラル.しかしこれは比較的どうでもいい設定で,序盤中盤だませればいいかなって程度のもの.本質的なトリックにはなっていない.だというのにわざわざ回想シーンまで用意して,インテグラルとル・グランティスを結びつけたりしている.これにより序盤でやたら意味深に出てきた「インテグラル」なる名前は,本当に「ただの名前」に過ぎないことに.そう,そこでの「インテグラル」はただの名前,意味はもたない.だって,とてもではないがただのアナグラムが「次元を越える操作」に関連するとは思えない.なにがいいたいのかというと,ダミーだろうということ.

結局,「インテグラル」って単語がそれ自体で意味を持って出てくる部分というのは,本文中に存在しない.

たくさん出てきていると見せかけて,実は意味ありげなものは,「∫ルート」という名前にしか現れていない.

これは果たして,制作者側が中途半端な状態で発売に踏み切ってしまった等の事情による不慮の事態だろうか?

こういう解説ページによれば,そういうことになっている.言っておきながらできなかったのだ,だから駄作だ,と.

それは「お話に出てきた中でものを考えましょう」というルールに則るなら正しい理解というか,当然行きつくべき地点だし,間違ってるという気はしない.ただそれではつまらないから,俺は,いや本文中に登場せずともやはりインテグラルは鍵なのだ,と言ってみることにしよう.

そう思う理由リスト:

  • インテグラルを執拗に強調している
    ロゴのバック,サブタイトル,「∫ルート」,リミナリティのバッジ,公式ページに設けられた単語「integral」を解説するためだけのページ.まったく「次元を越える操作」を埋め込まないのだったら,そもそもこんなに強調しなくていい.製作の途中で影を薄くしていって,誤魔化してしまえばいいのである.
  • 本文に出てこない.出てきた「インテグラル」は名前で,ダミー
    作ってる側は馬鹿じゃないという前提条件からいくと,この 「作品外部で強調」 「作品内部ではダミーが登場するだけ」 という矛盾はいろいろ意味をもって感じられる.上記とかぶるが,本当に間に合わず「インテグラル」という仕掛けが盛り込めなかったなら,もうちょっとそれらしい「惜しい」ものになっていてもいいようなもので,名前であるところの「インテグラル」だけが本文中に登場する唯一の「インテグラル」であるなどという極端な事態は普通考えられない.もうちょっと意味のある「インテグラル」が顔を覗かせるか,ダミーの「インテグラル」も廃されていて本文中に全く出てこないか,どっちかのはずである.
  • 公式ページの記述
    以下.

ここまで触れていなかった公式ページからの引用にも,大きなヒントがあるように思う.

本作ではゲーム世界の次元から現実世界の次元への、その次元を越える操作に『インテグラル』という言葉をあてている。

明言している.鍵っぽいのに本文中で「インテグラル」がまったく出てこず,結局なにがインテグラルだったのかわからないという人も安心だ.だって,ここにこうやって書いてある:「インテグラルはゲーム世界の次元から現実世界の次元へ,次元を越える操作」.

つまりこうだ.パッケージや「∫ルート」の「∫」はつまりその記号単体で,プレイヤーに 「次元を越えろ!」 すなわち 「ゲーム内での解釈に終始せず,現実世界の次元で考えろ!」 とメッセージを送り続けているのではないか?

とっぴな解釈.そもそも妄想である.だが,こう考えると続く次の一文もうまく説明できる.

そしてこれが、我々が『インテグラル』に込めた想いである。

この文は一見すると,「インテグラルというものをテーマに,我々はそういう信念で作品を作りました.想いがこもってます」 みたいなどうでもいい文である.だが,実は先に書いたような解釈を後押しする文にもなっているのだ.

すなわち,一文目「インテグラルとは,次元を越える操作である」 -> 二文目「そしてそれこそが,我々が『インテグラル』を使っている意図である」  という具合だ.

これならば,本文中に「インテグラル」らしきものが登場しないのは当然だ.インテグラルとは作中に登場する要素・単語なのではなく,この作品自体に付くタグのようなものと考えられるのだから.

Production Notes というページ名は 「作品の能書き」 のような意味ではなく,字面通り,「作品に関する注意書き」の意だったのだ.

ではタグというのはどういうタグか.全てそのページの中に書いてある.

次元を越える操作に「インテグラル」という言葉をあてている

プレイヤーもゲーム世界のシステムの一つであり、ゲーム全体を構成するのに欠くことができない(中略)そのシステムを本作では「インテグラル」と名付けた

ゲーム世界からより高次へ向かう仕掛けを用意し,物語世界・開発者・プレイヤーをトータルに結びつけ「全体」を作り上げるシステム、それが「インテグラル」

すなわち,「次元を越えて良く」 「プレイヤーが独自解釈を加えてもよく」 「物語のみならず開発者やプレイヤー達含めた『全体』で考えねばならない」 ようなゲームに付くタグである.

特にふたつめ,みっつめについて,なんでそうなるんだ? と思う人は上記引用文を単語レベルに分解して精読してみてほしい.

「プレイヤーもシステムの一つ」 であり 「プレイヤーもゲーム全体を構成するのに欠くことができない」 とある.E17 や R11 という前例があるから,ああいう形でプレイヤーが一方的に作品に「組み込まれる」のだと勘違いしがちだが,どこにもそうは書いていない.プレイヤーは「システム」であり,「構成する」のだ,と書いてある.これとひとつめの「次元を越える」を考えあわせると,要するにプレイヤーはそれ単体では矛盾に満ちあふれてみえる 12R の世界に「システム」として干渉し「構成」していい.これは言い換えれば独自解釈,後付け設定を許容するという宣言ではないか.

三つ目も同様だ.「(ゲーム)全体」は何によって作り上げられるかというと,「物語世界」すなわちゲーム自体に加え,「開発者」と「プレイヤー」であると書いてある.つまり,そういうことである.12R が作品それ単体では矛盾で満ち満ちていることをより一層擁護したいなら,この文の主語を意識すればいい.我々開発者は 「仕掛けを用意し」 「物語世界・開発者・プレイヤー」は「全体を作り上げる」.そう,「物語世界」で完結するように作者は作っていないのだ.作者が汗水垂らして作ったのは,プレイヤーまでもが協力してはじめて「全体」になるような「仕掛け」だ.

その「仕掛け」ってのはたとえば,公式ページというさりげない場に「インテグラル」を読み解く重大なヒントを隠しておくとかである.

だとするならば,今まで俺が繰り広げてきた妄想はまさに意図通りというわけだ.

まあ,誤った仮定からスタートしてその誤り自体を正しいと証明できたところで最初の仮定がやっぱ真でしたということにはならないことくらいは記号論理学不可った俺でもわかるので,「だから俺の考えていることは正しい」というつもりは依然ないが,

こういう風に考えるのもほら,なかなか面白いでしょうということで.

12RIVEN (4)

もうそろそろ売りそうだ.今ならまだ買い取り価格 4k 弱. プレイ料 1k ならお得だわ.

今までのエントリはなんとなくネタバレ回避してたけど今後はそこそこネタバレ.別にこれ読んでも本質的な楽しみが損なわれることは全くないけど,一応書いておく.

 

あれから本文は一度も読んでない.けど,2ch スレ精読したりしてたら識域下錬丸=プレイヤー,とまではいかなくとも,なんらかの識域下錬丸にプレイヤーの干渉,という方向で考えてなんとなく納得がいってきたような気がしてきたようなしてきていないような.完全解にはほど遠いにしろ,頭の中の雲はだんだん晴れてきて気分的にはよくなった.

きっとこの理解がもうちょっと進むと,矛盾点がどんどん気になりだして再び脳内に暗雲が立ちこめるのであろう.

そこにたどり着いてなんだこのクソゲーと言い放ってしまう事態が怖いので,今のうちにメタった楽しみ方をしておくことに.

どこまでが作者の意図かって考察は,難しいというより不毛なのでしない.とりあえず俺は 「作者の知能は無限大,どこまで意図があってもおかしくない」 という立場で妄想を繰り広げるのが個人的に好き(それが正しい読み方と主張するつもりは毛頭ない)なので,この立場を明言した上で,以降,「こういう方向で 12RIVEN をしゃぶってみたらどういう姿が見えてきそうか」 という考察というか深読みというかをする.