日記

8月 1日 (火)

1. 黒

出来がよいとの評判を聞き、買ってしまいました。Fateはゲームもアニメもノータッチですが。

例によって置く場所がないので、他のフィギュアと一緒に段ボール箱行き。広い家に移りたいなあ。

2. 503

Webサーバのアクセスログに、ステータスコード503(Service Unavailable)がいくつか残っているのを見つけました。サーバメンテがあったという話は聞いていないので、原因はおそらく過負荷でしょう。うちのサイトで503を食らうようなものといえば…アレか。アクセスログを調べてみました。

select w3cdtf, request_line 
from access_log base 
inner join access_log_time tm using (access_id)
where status=503;

アクセスログをRDBに突っ込んでおくと、こういうときに便利ですね。SQL一発で大抵のことは出来ますから。

見ると、案の定全て例のゲーム動画ファイルでした。一つ一つのサイズは動画にしては小さめだと思いますが、数が多いのでの負荷もそれなりに。

8月 2日 (水)

1. 傘

某「穴」で某CD-ROM版カタログを買ったら、折りたたみ傘をくれました。傘生地が安っぽいナイロンで折りたたみにくいのが欠点ですが、オタクオタクした柄もなく、カバーの絵にさえ目を瞑れば実用範囲内だと思われます。割と軽いし。

8月 3日 (木)

1. 要らない(?)子

自分で作っておいて、存在そのものを忘れてしまっていたHTML2XHTMLを手直しして公開しました。今更役に立つのか、なぜXHTMLに変換する必要があるのか、などとツッコミたいところではあります。

8月 4日 (金)

1. 比アロヨ大統領、命助ける「スーパーメイド」育成に意欲

「ただのメイドじゃない。トレーニングを受けており、勤務先の家庭で誰かけが人が出れば手当てをし、高層ビルで火災に遭ったら、どのように脱出できるかを知っているメイドたちだ」

良く訓練されたメイド。勤務先の家庭で襲撃を受ければ応戦し、高層ビルでテロに遭ったら、どのようにテロリストを抹殺できるかを知っている、そんな素敵なメイドが欲しい。というか、メイドに何を求めているのでしょうか。

THE メイド服と機関銃の発売がとても楽しみですね。

8月 5日 (土)

1. 地球防衛軍2

久々にINFERNO「灼熱」で二時間ほど放置稼ぎをしていたら、SG-100を入手できました。SG-99の完全上位ですが、元のSG-99の射程が微妙なだけに、攻撃力とリロード性能だけが向上したSG-100もやはり微妙な位置づけ。

8月 6日 (日)

1. 冒険野郎

古き良き2Dアクションに、若干のシューティング要素で味付けしたようなゲームです。七時間弱でクリアしました。食らい判定がやたら大きいと感じるのは気のせいでしょうか。

8月 7日 (月)

1. 711 Can't obedient.

近所のセブンイレブン、レジの店員(割とかわいい姉ちゃん)が妙に不機嫌でした。

  1. 「○○円ね。」
  2. 「はい、お釣り!」
  3. 「何、あんたも欲しいの?」
  4. 「点数数えるの面倒なんだからね!」

さすがに声には出していませんでしたが、表情と態度がそんな科白を語っていました。この後

  1. 「もう来なくていいからね!」
  2. 「…えっ、ちょっと、本当に来ないつもり?」

となれば「ツンデレコンビニ」になるわけですが、生憎そのような展開はありませんでした。えー、私は何を残念がっているのでしょうか。

2. HDD死亡

ARAID99 1000Lに搭載したHDDの片方が死亡した模様。LEDがプライマリ側だけ点滅していたので、もしやと思って見守っていると、インジケータがOK からFail に(記念撮影)。ブザーを切っていたので、音は鳴りませんでした。このディスクはSVNリポジトリとか…SVNにしか使っていないわけですが、両方死ぬと泣きたくなるので早めに交換しましょう。

ちなみに、バックアップは取っていません。リストア方法を考えてませんから。リストアするつもりがない/できないならバックアップなどしない、それが俺のジャスティス。リストアできないバックアップデータなんてゴミ以下ですよ。

8月 8日 (火)

1. HDD復旧

アキバでHDDを補充してきました。大容量、RAIDが珍しくない昨今、故障したときの損害の大きさを考えると、HDDは消耗品と考えて、常に予備を用意しておくべきですね。

さて昨日逝ってしまったHDDを取り出して、新HDDに換装、簡単ホットスワップ完了。かと思いきや、新HDDがFAIL状態。自動リビルドが開始されません。なぜ。プライマリとセカンダリを入れ替えたり、シングルモードにしてみたり、あれこれ試してみましたが、ちっとも認識されません。

このARAID99が繋がっている四号機を再起動してみようと一旦電源を切り、再び投入。電源オンですぐ起動、マウス一つで楽々操作…のはずが、火を入れた直後に沈黙しました。その後、電源スイッチを何度押してもうんともすんとも言いません。

四号機は死にました。南無。二年間お疲れ様でした…いや、まだ死なせない。電源が逝っただけであれば、電源を取り替えるだけで蘇生できます。この子はPC-M6000(通称Be Silent)という、ファンレスCPU搭載の小型ベアボーンPCで、SFX電源あたりを繋げば生き返るでしょう。が、その手術は後日にして、ストレージ復旧が優先。

六号機にARAID99を繋ぎ直して再起動すると、自動リビルドが始まりました。どうやら四号機側が原因だったようです。

問題は、もともと四号機で動いていたSVNサーバをどうするか。この際、六号機に移管してしまいましょうかね。でもその場合は、チェックアウト中の作業コピーはどこにコミットすればいいんだろう?svn switchで切り替えられるのかな?

8月 9日 (水)

1. HDD復旧

自動リビルド完了。それはいいとして、四号機が死んだということは、SVNサーバがいなくなってしまったわけで、困った。SVNサーバの再構築を考えないと。

8月 12日 (土)

1. だらだら

雷うるさい。静かにしてくれ。

一日中だらだらとFF3(FC版)をやったり、だらだらとサークルチェックをしたり。NDS版のFF3は周囲の評判を見てからにしましょうかね。たまねぎ剣士が隠しジョブ扱いなのが妙に気になりますが。

それよりSVNサーバの再構築をさっさとやれよ、と。

8月 13日 (日)

1. C70

1.1. 戦地

有明まんが祭り三日目。今回は珍しく11時過ぎに現地に到着した(個人的にはこれでも早い方)ので、東から攻めてみました。まあ、目的はTRASHBOX#15と知人への挨拶だけですけどね。目的を達成した後は早々に西へ退却し、適当に物色したり、旅人さんと駄弁っていたり。いくつか予想外の収穫があったのと、音楽系が私のニーズとほとんどマッチせずに大ハズレだったのとで、戦績はまずまず、といったところでしょうか。

暑いのと荷物が重いのとで、私は二時半過ぎに一旦戦線を離脱しました。

1.2. 404 Maid Not Found.

離脱先がアキバなのが少々アレです。目的はただ一つ、THE メイド服と機関銃なんですが、量販店はどこも売り切れ。これは一体どうしたことか。そんなに売れているのか。某ファミ通や某巨大匿名掲示板での評価はいまいちだったのに。

そういえば、「ひぐらしナントカ」が目当てなのか、同人ショップ数店の前が人の列で埋まっていました。もちろん、本日の有明に比べれば大したことはありませんが、通行の邪魔ですねあの群れ。

1.3. 鍋

一旦帰宅し、シャワーを浴びてサッパリしてから再出撃。戦場から引き上げ途中の旅人さん達と上野で合流し、Hiroshi氏宅でまったり休憩してから、わたる氏も加わって鍋打ち上げへ。ごちそうさまでした。

ところで、Hiroshi氏宅には山のようにゲームと本が積まれており、その量はうちよりも遥かに多いはずなんですが、なぜか整然としています。うちは無造作に積まれているせいか、雑然としています。積み方にコツがあるんでしょうかね。

8月 14日 (月)

1. 停電

普通に出勤ですよ?

朝から電車が遅れていて、何事かと思えば大規模な停電だったようです。今回は落雷などの天災ではなく、どちらかと言えば人災に近い事故ですね。東京広域でと報じられていたので、うちのサーバは大丈夫かいなと心配になりましたが、Webサーバにアクセスできたので大丈夫 *1 と判断してひと安心。

  • *1: 自動起動ではないので、フリーズ、シャットダウン、リブートなどされると接続できなくなる。

2. 一撃必殺!エクセリオンバスターA.C.S!!

レイジングハート A.C.S.展開モード。所持者の顔が何か違うような気がするんですが、何だろう。白い服を着た「なのはさん」は、やることが何かと「黒い」ので、いっそ悪者顔にしてしまうというのも一興かと思います。

黒と言えば、先日買った黒セイバー、上半身を持ち上げると、毎回下半身とスカートがゴトっと落ちて「胴部絶交・黄泉送り」状態。パーツがしっかりはまらないんですよね。せめてスカートだけでも残れば「脚なんて飾りです!」と開き直れるんですが。

8月 17日 (木)

1. Subversion復旧メモ

Apache2とSubversionインストール完了。Apache2は枯れている2.0系にしました。

さて、リポジトリそのものはマウントするだけで使い回せるから良いものの、チェックアウト中の作業コピーは?チェックアウトした作業コピーを別のブランチに切り替えるには、svn switchを使います。当然URLも変わりますから、これを利用できないかと考えたわけですが、今回はスイッチ元のサーバがすでにいない(死亡した)ため、スイッチできません。ではどうしましょうか、という問題。

以前のSVNサーバのホスト名をoldserver 、新SVNサーバをnewserver とします。また、リポジトリのURLはそれぞれ http://oldserver/svn/hoge 、http://newserver/svn/hoge とします。まず、hostsを書き換えて、旧サーバ名を新サーバのIPアドレスに紐付けます。

192.168.1.1  newserver  oldserver

現在の作業コピーを(oldserverに対して)コミットします。ホスト名 oldserver のIPアドレスは新サーバと同じですから、正常にコミットできます。ちなみに、この状態でもスイッチはできません。なぜなら、スイッチ元とスイッチ先の実体が同じだからです。

コミットしたら、その作業コピーを破棄し、新たに newserver からチェックアウトします。これで作業コピーは新サーバと対応したことになりました。

とはいえ、あちこちにチェックアウトしている作業コピーについてこれをやるのは面倒ですね。

8月 18日 (金)

1. ActivePerlのPerlScriptで日本語

1.1. 概要と基礎知識

ActivePerlのPerlScriptで、ソースコード中に日本語文字を使用すると謎のエラーに悩まされるというのは、その筋では有名かもしれません。バージョン5.8系でuse utf8プラグマを使用し、ソースコードをUTF-8で符号化しても解決しません。要するに、マルチバイト文字に対応していないということでしょう。この辺の状況を調べてみました。

実証は次の条件下で行いました。

  • 改行コードはCRLF(0x0D 0x0A)
  • タブ文字(0x09)は使わない

まずはUS-ASCII。所謂「半角英数等」だけで書かれたソースコードです。

use utf8;
# UTF-8 encoded
MsgBox(&j0);

sub j0()
{
  return 'j0';
}

1;

このソースコードをcscriptコマンドで実行させると、期待通りの結果が得られます。つまり、j0 というメッセージ付きのダイアログが表示されます。しかし、次のソースコードを実行させると、妙な文法エラーが発生します。おそらく皆が指摘しているとおり、内部で文字数とオクテット数をごちゃ混ぜにして処理しているのが原因でしょう。なお、ソースコード中の改行の数や空白文字の数、コメントの内容等が僅かに違うだけで、エラーの内容は変化します。

use utf8;
# UTF-8で符号化したソースファイル
MsgBox(&j1);

sub j1()
{
  return 'j1';
}

1;
>cscript j1.pls
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

j1.pls(7, 0) PerlScript Error:
       (in cleanup) Can't find string terminator "'" anywhere before EOF

このバグが何年も放置されていることを考えると、ActiveStateが真面目に対応するのは期待できませんし、対応したところで現バージョンのActivePerlが動作しないことには変りありません。では、この問題をどうやって回避するか。アプローチとしては四つあります。

  1. マルチバイト文字を使わない
  2. ファイル全体の文字数 > スクリプト部分のオクテット数となるように詰め物をする
  3. 実行時に動的コンパイルする
  4. エラーにならないような符号化方法を探す

これらを一つずつ見ていきましょう。

1.2. マルチバイト文字を使わない

最も単純で、それでいて最も難しい解決方法です。確実な回避方法ではありますが、コメントに日本語文字を使いたいという要求は満たせません。もちろん、「ローマ字で書く」など論外です。

1.3. 詰め物をしてごまかす

ファイル全体の文字数 > スクリプト部分のオクテット数となるように、ファイル末尾に__DATA__などを書いて詰め物をすれば、回避できることがあるようです。ただし、確実ではありませんし、どれだけ詰めればよいのかがわかりづらいため、実用的とは言い難いでしょう。

1.4. 実行時に動的コンパイルする

下記のスクリプトを使用して、実行したいファイルを動的にコンパイルさせると期待通りに動作します。

use utf8;
require 'j1.pls';

useで静的に呼び出しても動作します。このやり方では、呼び出すファイルの拡張子をpmに変更する必要があります。

use utf8;
use lib qw(.);
use j1;

つまり、requireやuseで呼び出してやれば、期待通りに動作するということでしょう。静的か動的かは関係ないようです。

1.5. 符号化方法で回避

patch for PerlScript 5.8.7.813での解析結果を見ると、ActivePerl内部でwcslen(3)やWindows API WideCharToMultiByteの利用法を誤っていることがわかります。つまり、大方の予想通り、文字数とオクテット数をごっちゃにしている、と。では、日本語を扱える符号化方法の中で、wcslen(3)やWideCharToMultiByteを騙せる(US-ASCIIと思いこませる)ようなものはないでしょうか。US-ASCIIと思わせられれば、文字数とオクテット数が一致するので、期待通りに動作するはずです。そのような符号化方法が一つあります。ISO-2022-JPです。

#use utf8;
# ISO-2022-JPで符号化したソースファイル
MsgBox(&j2);

sub j2()
{
  return 'j2';
}

1;

このソースコード(もちろんISO-2022-JPで符号化した)をcscriptで実行すれば、期待通りの結果になります。ソースコードをおもむろにバイナリダンプしてみます。

0000000  23 75 73 65 20 75 74 66 38 3b 0d 0a 23 20 49 53
0000020  4f 2d 32 30 32 32 2d 4a 50 1b 24 42 24 47 49 64
0000040  39 66 32 3d 24 37 24 3f 25 3d 21 3c 25 39 25 55
0000060  25 21 25 24 25 6b 1b 28 42 0d 0a 70 72 69 6e 74
0000100  20 4d 73 67 42 6f 78 28 26 6a 32 29 3b 0d 0a 0d
0000120  0a 73 75 62 20 6a 32 28 29 0d 0a 7b 0d 0a 20 20
0000140  72 65 74 75 72 6e 20 27 6a 32 27 3b 0d 0a 7d 0d
0000160  0a 0d 0a 31 3b 0d 0a

日本語文字の部分だけピックアップしてみましょう。

1b 24 42 24 47 49 64 39 66 32 3d 24 37 24 3f 25 3d 21 3c 25 39 25 55 25 21 25 24 25 6b 1b 28 42
_$B$GId9f2=$7$?%=!<%9%U%!%$%k_(B

なるほど、これならごまかせそうですね。さすが7-bitエンコーディング。ただし、ISO-2022-JPで符号化すると、$や%といった、Perlにとって特別な意味を持つ文字が頻発するため、スクリプト中で使用する場合は細心の注意が必要になります。例えば、JIS X 0208-1983への切り替えである ESC $ B (1b 24 42)をqqなどで評価すると、これはPerlから見ればESCに続くスカラー変数$B として処理されてしまいます。このような意図しない結果を招かずに済ませるには、日本語文字はコメント以外には使用しないようにするのが良いでしょう。

なお、同じ7-bitエンコーディングであるUTF-7では対応できません。理由は面倒なので説明しません。文字コードの部屋 -- Unicode のエンコーディングを読んで考えてください。

1.6. 結論

現実解としては、次の二つに絞られるでしょう。

  • requireやuseで動的・静的コンパイルする
  • ISO-2022-JPで符号化する

…というかですね、ActivePerlがちゃんと対応していれば、こんなことせずに済むんだよ!

8月 19日 (土)

1. ActivePerlの〜を修正

昨日のActivePerlのPerlScriptで日本語のサンプル、printステートメントは要らないので削除しました。サンプルに余計なものがあるのは良くない。

2. Text-ACE メモ

近日公開できるといいな、な状態の、サクラエディタのマクロです。

例えば、Hoge.tjsというファイルを編集していたとします。拡張子がtjsなのですから、TJSのソースを書いているのだと推測できます(そのくらいは計算機でも可能)。ユーザが次の行を書いたとします。

function hoge foo bar

こう書いてあると、何となく「関数だね。関数名はhogeで、引数はfooとbarだ。そんな関数を実装したいのだろう。」と想像できますね。そこまでわかれば、あと書くことはだいたい決まってきます。大抵のプログラマは次のようなことを書くのではないでしょうか。

/***
関数の説明
@param foo 
@param bar 
@return
*/
function hoge(foo, bar)
{
	var rc = void;

	return rc;
}

今のところ、C/C++でもこのくらいならできます。テンプレート次第でどうにでも化けますけどね。

function, int, hoge, int argc, char *argv[], char* (*fp)()
/***
関数の説明を記述してください。
@param argc 
@param argv 
@param fp 
@return
*/
int hoge(int argc, char *argv[], char* (*fp)())
{
	int rc = /* 戻り値 */ ;

	return rc;
}

Eclipseなど大抵のIDE(統合開発環境)なら搭載されていそうな機能ですね…Eclipseはよく知りませんが *1 。というわけで、こういった定型処理を自動化させるマクロを作っています。いや、作るよりもドキュメントを書くのが大変で大変で、もう。

  • *1: 以前自宅PCにインストールしたことがありますが、起動が遅い、その他何かと重たい、何このヘヴィ級、アンインストール、で終了。

8月 22日 (火)

1. メモ

2. デスま!

数日前、YRP デスマーチで検索してこのサイトにたどり着いた人がいたのを、アクセスログで発見しました。そういえば、私の脳内ではなぜかずっとこの二語がリンクしていて、確かに旅人さんからいろいろ話を聞いたことも理由の一つでしょうけれど、どうもそれだけではないな、と思っていました。

今日、何気なく某まとめサイトを見ていて、その理由を思い出しました。

これでした。読んだのが大分前なので、忘れていたのですね。

しかしこれ、今読んでも、何というか…

8月 24日 (木)

1. 降格

「スイキンチカモクドッテンカイ…」

とうとう冥王星が惑星から外されてしまいました。どこか寂しくなりますが、別に冥王星そのものがなくなるわけではありませんし、惑星 の定義をはっきりさせた(今まで定義が曖昧だったのもいかがなものかと思いますが)という点は科学的に進歩したと言って良いでしょう。

冥王星を発見したのがアメリカの科学者だからいう理由で、一部の米国民は冥王星を惑星から除外することに反対していたようですが、それは反対する理由としておかしい。科学的な分類に対して、政治的に含めるべきと言ったところで反論にはなりません。まあ、今回の定義の決定に政治的要因がどのくらい加わったかはわかりませんけどー :)

2. 定期入れ

定期入れを新調しました。今使っている定期入れがぼろぼろになってしまい、使用に難が出始めたためです。さすがに十年以上使い続ければぼろぼろにもなりますが、よく今まで保ったな、とも思います。

8月 25日 (金)

1. エンジニアに必要な能力

「tar.gzって何?」

(中略)この質問の出先が、「取引先設置サーバの管理者」からってのは一体どうなのよ?

(中略)そのサーバ管理者さんの資質とか能力とか以前に、要は「tar.gzって何?」って疑問ですら自力で解決することのできない現場が既に存在している、ということですから。

これを読んで、数年前、元SEの営業が話していたことを思い出しました。氏がエンジニア時代のプロジェクトの話をしていたときに、「CSVって何のことだかわからないんですけどね」とかなんとか言っていました。この言葉を聞いたとき、「ああこの人、エンジニアを辞めて正解だったな」と思いました。CSVは基本的なデータ形式ですから、大抵のエンジニアは当然の如く知っていますが、問題はそこではありません。問題なのは、知らないことではなくて、知らないことを調べようとしなかったことです。

件の引用ですが、疑問を自力で「解決することができない現場」も確かにどうかとは思いますが、「解決しようとしない現場」と見方を変えると、なにやら恐ろしいものを感じます。こういう現場って増えているんでしょうかね。

8月 27日 (日)

1. コミティア

「メンバーの急な予定で参加者に欠員が出たからサークルチケットが余った」とのことで、旅人さんのサークルに同行することになりました。またビッグサイトロンですよ。まあ、コミティアの会場は「六道輪廻の東館」 *1 、の一角ですけどね。ちなみに「東」の大半はどきっ!女(腐女子)だらけのコミックシティ会場でした。

私ははしくれ工房の本さえ買えればそれだけで参加目的は達成できるので、会場直後にさくっと購入しました。あとは基本的に旅人さんや多謝氏とおしゃべりしながらまったりと店番。それで終わるはずだったのですが、何度かふらふらとブースを廻っているうちにいろいろと買ってしまい、帰る頃には予想以上に鞄が重くなっていました。

閉会後にアキバ。私はTHE メイド服と機関銃Small Arms Collection Vol.1を購入しました。このSmall Arms Collection、店員の話では、企画段階ではシークレットとして「バイオリンケース入りP90」(ガンスリ *2 ?)があったのだが、あまりの精巧さに「凝りすぎてて採算取れねーよ!」ということでボツになったらしい、とのこと。まあ、商売ですから必要以上にコストをかけるわけにはいきませんね。客としては残念ですが。

和幸で食事を摂って、ヨドバシに寄って帰宅。疲れていたためそのまま眠ってしまいました。

  • *1: 「りくどうりんね」くらい変換してくれよ、ATOK。
  • *2: 個人的には、「ガンスリンガー・ガール」を略したら「ガンガル」だと思う。

8月 28日 (月)

1. THE メイド服と機関銃

ゲーム名に騙されて機関銃を撃ちまくるとクリア時の評価が下がると評判の、剣劇アクションゲームです。いや、メインウェポンは自動小銃であって機関銃ではない、と解釈すれば一応筋は通ります。軽機関銃はサブウェポンですが、サブウェポンは撃ちまくってOK、というか、回避攻撃で撃ちまくれ!(Comboランクが上がる)

そんなメイドゲーム、今日はストーリーモードをクリアしました。武器をいくつかと、アウロラ(袴コスチューム)をゲット。EXの一面をクリアしたところで終了。

2. Small Arms Collection

無駄に細かくて出来が良いと密かに評判の、1/6スケールSmall Arms Collectionです。うちには1/6スケールのフィギュアがないので、1/8のなのはさんと並べてみました。もちろんシモノフPTRS1941ね。

8月 29日 (火)

1. THE メイド服と機関銃

  • 回避十連は△連打がポイント。親指が疲れる。
  • EXクリア。コーラル(ひらひらピンクコス)ゲット。
  • 武器あと一つ。3面でSを取ればいいらしい。
  • 処理落ちが目立つ。うざったい。
  • 対戦車ライフル使えねー!

基本戦術とか、攻略のコツとか。

積極的攻撃(日本刀)
メインとなる武器。これでちまちまと斬っていきましょう。二段目を振り切ったときに○ボタンを押すと、ザンゲツショウ(斬月衝?)に繋がり、アウロラだとこれがかなり強力。
積極的攻撃(アサルトライフル)
一度でも発砲すると、Aランクに下がります。撃ってはいけません。
消極的攻撃(回避攻撃)
△を連打しながら相手の攻撃を回避して、□を押しながら△を連打すれば十回繋がります。1〜2回極めればComboがSになります。
メイドスタイル
これはボス戦で2〜3回出すだけで、確実にSランクになります。雑魚戦で使う必要はありません。

8月 30日 (水)

1. THE メイド服と機関銃

一つだけ残っていた、ステージ3 Sランククリアで手に入る武器を取得し、ラウラ服も入手。その後、EX二周目をクリアしました。一通り全て揃い、隠し武器・コスチュームもないようなので、やることがなくなってしまいました。いまいちボリューム不足ですね。SIMPLEシリーズだから仕方がないか。