奇抜なコードを書けるのはほぼ Perl の専売特許。C (や C++) もそれなりに笑っちゃうコードが書けますが,Perl に比べればあんなのは何でもありません。
冷静に考えれば,こーんなコードも許されるのです。
my $foo = &{sub{
$_[0] + $_[1];
}}(1, 2);
なんか使い道がないかなー。
コードにバグがあるのなら,処理の途中で埋め込んでいるエラー処理でひっかかってくれたりアプリケーションやマシンが落ちてくれればいいのに,それすらもなく,一見まともそうな出力をしてしまうという困難もまれにプログラマーを襲います。
今日,私が目にしたのはこんなの。分かり難いかもしれませんが・・・
while (hash_length < hit)
c_hash += (int)(*c_top_org + hash_length++);
実は,これは私が公開している Deflater のコードの一部分です。hash_length が hit 未満である間中,*c_top_org と hash_length の合計を c_hash に加え,最後に hash_length をインクリメントしています。
実際,このコードで動きます。ちゃんと圧縮処理も行われているように見えます。しっかし処理速度がアレのわりには,あまりうまく圧縮できていないように見えました。おっかしいなー。まぁちゃんと動くしリリースしちゃえと言ってこのバージョンのコードを公開したのが丁度 1 ヶ月前。それからすっかり忘れていました。
そして今日,仕事中に何気なく deflater.c を見てたですよ。
ぅあっ!!! 分かったあ!!!
↑のコードをちょっと分かりやすくするなら,こう。
while (hash_length < hit) {
c_hash += (int)(c_top_org[0] + hash_length);
++hash_length;
}
でも違うですよ! 本当にやりたかったのはこう!
while (hash_length < hit) {
c_hash += (int)(c_top_org[hash_length]);
++hash_length;
}
hash_length は c_top_org[0] と足し合わせていきたいんじゃなくて,c_top_org[] 配列の添え字にしたかったのですよ!! だから,本当に書きたかったのは↓こうなんですよっっ!!!!1
while (hash_length < hit)
c_hash += (int)(*(c_top_org + hash_length++));
よっしゃあっっっ!!!! ( 処理速度以外は ) もう完璧っす!!!!ぬ もう今日は最高の一日っす!!!!!!1111234
超越弩級宇宙最高人民的大解決度:10\9360-^t2497q@
最初に見た時はあまり難しそうではないんだけど,よくよく考えてみるとヤケクソに難しい,それが,プログラマがまれに襲われる困難の一つです。特に求められる機能が奇妙且つ複雑に入り組んでいる場合,プログラマが「1ヶ月くらいでできます」と申告しても信じるべきではありません。その「1ヶ月」はおそらく,要求された機能をなんとかやりくりしてモジュール単位に分割するのに全て費やされるでしょう。
次に示す仕様書の切れ端は,要するに会社で用いられる「タイムカード」を管理するアプリケーションのもの。「今日は何時から何時まで働きましたよ」ていうのを機械でスタンプを押して管理する仕組みですね。
PSID 個人を識別 PSNM 名前 PSTR 個人に与えられた研修期間を表す PSCHPT1 PSCHPT2 PSCHPT3
. . . PSCHPT1 に 3,PSCHPT2 に 13 が与えられた場合,各月の 3 日〜 12 日は「パターン1」を,13日 〜 3日は「パターン 2」を用います。同様に,PSCHPT3 が与えられていれば「パターン 3」も用います。PSTR は個人別に与えられた「研修期間」で,現在までの就労時間がこれより短い場合は「パターン 4」を用います。
k|m 注。「パターン」というのは,後で示す「時給データ」の「pattern」の部分に対応します。なんと,日によって時給データを替えるらしいのです。すげぇ。
** 形式は次の通り ** 区画 A = hh:mm 区画 B = hh:mm 区画 C = hh:mm 区画 D = hh:mm : (以下「区画 J」まで略)
. . . 例えば区画 A データとして 5:00,区画 B データとして 15:00,区画 C データとして 20:00 が入力されていた場合,5時〜15時までは「時間帯 "1"」を,15時〜20時までは「時間帯 "2"」を,そして 20時から5時までは「時間帯 "3"」を用います。時間帯は 10 種類設定できます。
つまり時間帯によって時給を替えるってことですね。これは当然。
ID 個人を識別 pattern パターンを表す mon_1 月曜日,時間帯 "1" の時給 (以下,全て整数型) tue_1 火曜日,時間帯 "1" の時給 : sat_1 土曜日,時間帯 "1" の時給 sun_1 日曜日,時間帯 "1" の時給 hol_1 祝日,時間帯 "1" の時給 spe1_1 特別日1,時間帯 "1" の時給 spe2_1 特別日2,時間帯 "1" の時給 mon_2 月曜日,時間帯 "2" の時給 tue_2 火曜日,時間帯 "2" の時給 : sat_2 土曜日,時間帯 "2" の時給 sun_2 日曜日,時間帯 "2" の時給 hol_2 祝日,時間帯 "2" の時給 spe1_2 特別日1,時間帯 "2" の時給 spe2_2 特別日2,時間帯 "2" の時給 : (以下略。 各曜日,祝日,特別日について "10" までのデータ)
というよりも,気ぃ狂っていいですか?
これはつまり(時間によって時給を替えるのは普通だけど)個人によって,日付によって,曜日や祝日,特別日か否かによって,研修期間か否かによって細かく時給を設定できてしまいます。個人に与えることが出来る「時給」の種類は最大 400 種。従業員 ID が 749 の人の 2002年5月13日(月曜日) 午後 3 時〜 4 時の時給を求めるのにおよそ 500 行のコードを書いてしまいました。特に「研修期間か否か」を判断するあたり,過去の就労データを全部取得して,地道に合計を出しながら注意深く PSTR と比較し,研修期間終了の瞬間を取得しなければならないという力技が必要です。完全に設計ミスではないかと小一時間。
私がヘボいだけ? 核心禁止っ!
【おくやみ】多くの命救った人生 殉職の東京消防庁・酒井俊明さん(2ch.net)
5月7日夕方,大田区のとある清掃工場にて出火。延べ400平方メートルが焼失,東京消防庁第 2 方面消防救助機動部隊機動特科隊長の酒井俊明・消防司令補が全身に火傷を負い死亡するという痛ましい事件が発生しました。
本日紹介したリンクは,亡くなった酒井俊明さんのためのスレッド。「2ちゃんねる」と聞いて「誹謗中傷雑言罵倒アハハハハの巣窟」と応える方も多いかも知れませんが,それはある意味「インターネット」に対する大きな誤解。ネット上には「私たち」しか居ないということを思い出さないとね。
そんな私たちが亡くなった酒井さんにしてやれることは,もう少しだけでも,些細な事に注意すること。今回の火災は不燃物の処理場で起こりました。周囲には燃えやすい物など無かったはずなのです。にも関わらずどうして火災は発生したのでしょう。
私たちのうちの誰かがほんの少しだけ何かに注意してさえいれば,「『幸せ』の絶対量」も増えるんじゃないかな,とか思いました。
「いつ何秒間話し合いをして日本側が同意したと言うんだ?」
「あの外務省だからなあ・・あり得るかも・・」
双方の意見が飛び交っておりますが,中国側,外務省側とも信用できません。
一番よい解決方法はどちらも黙っちゃうこと? いや,これでは国際的に評価を落とされそうな中国側が黙っちゃいないっすね。しかも難民は絶対に受け入れない所存らしいんで,どうするんだろう? 無論,北朝鮮に送り返そうものならば確実に中国の評価は下がりますわな。
ここはもう,中国で養ってゆくのが最良の解法でしょう? ついでに中国も北朝鮮からの難民を受け入れるようにポリシーを変更しちゃって,これで中国の評価もアップップ。日本はこの件についてもともと「来る者は(多分)拒まず」の態度だったので,プラスもマイナスもなしということで。
傍観度:100
2002 年の 11 〜 12 月,M-V ロケット 5 号機になんと 100 万名様くらいのお名前を載せてドカーンと打ち上げちゃいます。目的地は太陽から平均約 1 億 3500 万 km ほど離れた小惑星 "1998SF36" ( 仮符号 )。2007 年 6 月に到着予定とのこと。
このキャンペーンで面白いのは,なんと「先着 100 万名様」ではないトコロ。100 万という数字は単なる目標にすぎず,応募数が 100 万を越えても全員の名前を載せるのです。超太っ腹ー。さっそく某兄弟姉妹が応募しやがりました。ミーハーめ。
私の本名はそれなりに珍しいので,名乗る時はいつも「○×です」「○・・・え?」「○×ですってば」「へー・・・珍しいね」などとなかなか複雑な会話がなされてアレでした。しかしそのおかげで,このキャンペーンでは同姓同名の心配がありません。まさに珍しい名前を持った人にうってつけのキャンペーンなのです。珍しい名前を持った諸兄よ,今こそ立ち上がれっ! さあ,あなたの名前のユニークさを誇ろうではありませんかっ!
・・書いてて寂しくなりましたが何かっ!?
今日は大分に住む友人が来たですよ。私がさんざん「うちの会社はあんまし退屈しないよ」と宣伝してたら,どうもその気になった模様。ええ,つまりズバリ,私が働いている会社へ面接をしに来たのです。
彼が会社近くの駅に着いたとのことなので迎えに行ったわけですが,どうして私の方が緊張するんだろう? 面接を受けるのは彼であって,私じゃないのにね。
合否結果はまた後日ということで,あとは私の家でまったりと遊んで行きましたとさ。
あ,完全に日記になってしまったね。たまにはいいですか。
そういえば,2002-05-07 分の雑記のレイアウトが Netscape4 で見るとぶっ壊れてました。header.cpp 以下のソースや文章が,その前文の右側に表示されてたですね。まるで綺麗に段組が出来ていたかのように。
原因は単純。スペルミスでした。私はこのような場でプログラムなどのソースコードを記述するときは <pre> で囲んで,さらに中で <code> で囲んでいます。今回のレイアウト崩壊の原因は,その code を cdoe と書いてしまっていたこと。よくあるんですよね,こういうこと。
こういう部分に限って律儀にエラーを反映してしまう Netscape4 畏れ。
for my $honey ('-') {
# いえ,ただなんとなくであります。
}
疲労度:90045
どうやら Klez 騒動はあまり大きくならなかった模様ですな。本流である Klez.E しか破壊活動を行わないとのことで,結局実際に被害が報告されたのは十数件。私はと言えば Netscape/Mozilla を常用している以外徹底的に無防備なのに,未だかつてヘンな事は起きてません。・・・自分でバラ撒いてるのに気づいていないだけ?
・・んまあ,そのようなウィルスやワームを作って遊んでるようなナメたプログラマもいる一方で,巷では OpenOffice が大流行。なんでも Microsoft の Office アプリケーション群で使用するファイル形式がほぼ読み込み編集可能で,各国語・各 OS にまでも対応してるとかっ? さっそくダウソして実行してゆきたいっ!
ダウソできないっ!!
いあ,大人気にもほどがありますってば。はたから見ればあんまし負荷分散してないように見える Mozilla だってわりと難なくダウソできるのに,世界中のサーバを使って配布している OpenOffice はその前評判もあいまってかなりのダウソ数。どこかで二次配布してる方もいらっしゃるようですが,うーん,私はあとでゆっくりダウソしようと思います。
今使ってる Mozilla のビルド ID:2002050608
“完璧”という言葉には個人的な神話があります。それは絶対であり,何の汚れもなく,他の追随を許さず,代替手段など存在し得ず,全宇宙を統べる真理であり, もう自分さえ振り切ってて ,つまりそんな感じ。
プログラミング中の問題における「完璧な解決方法」と言えば,それは同時に完全な信頼度を誇り,実に精神衛生的なものだと思ってきました。例えばウィンドウメッセージを処理するような Windows アプリケーションにて,独自のウィンドウメッセージを定義したい場合,次のようなコードは非常に一般的です。
#define WM_EX_MESSAGE_A (WM_USER + 100)
#define WM_EX_MESSAGE_B (WM_USER + 101)
しかしなるべく数字をハードコードしたくないという要求は私たちに共通するもの。それにメッセージは他のアプリケーションからも使えるもの。特にデスクトップアクセサリでは,そのような仕様を公開し合えば楽しいことができるでしょう?
とりあえず完璧な解法は次の通り。
#define WM_EX_MESSAGE_A_STR _T("WM_EX_MESSAGE_A")
#define WM_EX_MESSAGE_B_STR _T("WM_EX_MESSAGE_B")
UINT WM_EX_MESSAGE_A();
UINT WM_EX_MESSAGE_B();
#include <header.h>
static UINT _wm_ex_message_a = 0;
static UINT _wm_ex_message_b = 0;
UINT WM_EX_MESSAGE_A() {
if (_wm_ex_message_a == 0) {
_wm_ex_message_a = ::RegisterWindowMessage(WM_EX_MESSAGE_A_STR);
}
return _wm_ex_message_a;
}
UINT WM_EX_MESSAGE_B() {
if (_wm_ex_message_b == 0) {
_wm_ex_message_b = ::RegisterWindowMessage(WM_EX_MESSAGE_B_STR);
}
return _wm_ex_message_b;
}
無論,これは switch の分岐先の値としては使えません。私が 2002-05-05「猛暑と TA と,あとスペルミスとか」のマクロで switch ではなく if を使った理由はそこにあるのです。
ともかく,あとは "WM_EX_MESSAGE_A" という文字列を他のアプリケーションにも使ってもらえれば,とても強調的で愉快な処理を行うことができます。( RegisterWindowMessage にバグさえなければ ) これは非常に精神衛生的な解法の一つ。
しかし記憶の片隅にヘンなゴミが残っていると,どのような鮮やかな解法もうさんくさく感じてしまいます。
少し前,私は確かに見たんです。microsoft.com ドメインの中で「インターネットに接続できているかどうかを調べる完璧な方法はない」という記事を。本当です。信じてください。苦しい解法を提示したサンプルコードもありました。・・・なのに肝心の URL をメモしていませんでした。悔やまれます。
そして今日見つけたのは,こんなコード。
DWORD flags;
InternetGetConnectedState(&flags, 0);
たったこれだけです。まさに完璧。あまりに鮮やかでぐうの音も出ません。というより,なんか納得がいきません。
私の記憶の隅っこの方で「接続状態を取得するのは難しいものなんだ」というイメージが激しく自己主張を続けています。これは非常に非精神衛生的。脳内の掃除がうまくいきません。誰か助けてください。
「接続状態を取得するのは難しい」という記述は 2002-10-11 にて解決。microsoft.com ドメインじゃないっすね。
昨日は観測開始以来 6 番目に早い真夏日だったらしくて,結局 1 日中ハダカでした。ワイルドな k|m の生態っす。
「三菱クオンタムファンド」ご存知の方はそんなに多くないんじゃないかな。なんか,勝手に「三菱」の名を騙った云々などと,かなりぁゃιぃ噂が流通している模様。上記の検索結果,見事に本家「三菱」さんから村八分攻撃を受けています。
・・・なんとなく可愛そうになってきました。当然ながら本家三菱さんは東京地裁に提訴とのことですが,せっかくだから買収してあげればいいのに(ρ_;)。・・・アレなジョークはともかく,どうせ提訴したんだから,法廷で彼らに思う存分社会の仕組みを教えてあげて下さい>本家三菱さん。
ちなみに本家三菱さんの URL は "http://www.mitsubishi.com/"。ただしここはブラウザによって英語/日本語を振り分ける JavaScript が置かれてあるだけ。JavaScript が動くブラウザじゃないと意味がありません,本当のサイトは "http://www.mitsubishi.com/index_j.cfm" っすね。