雑な k|m の生態について

その 36 - const 人間 自分 = NULL;

2003-07-03

“自分”という状態の停滞

最近ちょっと,この雑記の本来の目的とは離れた文章になっているのでトホホ。でもまぁいいか。

エンジニアとビジネスマンの違い

巷では「プログラマも営業技術をわきまえていなければダメだ」という意見が溢れていますが,どうしても私はそれが納得できないで居ます。だって,その両方を“プロ”と呼んで恥ずかしくないレベルまでに身に付けてしまうとまさしく資本主義社会の王者じゃないスか。街に溢れかえる王者たちが普通に吉野家で牛鮭定食かき込んでたら困るっしょ。マックの 80 円バーガーほおばりながら○×社との技術提携の話と某オープンソース・ソフトウェアのセキュリティの話を同時にしてたら泣くっしょ。そんな“スキルのインフレ”は認めたくありません。断じて

・・とは言いつつ,もしかしたらそれは甘い甘い私の孤独な抵抗に過ぎず,普通の人ならば適度に努力する事で技術も営業も“プロ”と呼べるまでに身に付くのかな / 少なくとも普通の人はそれくらいの自信があるのかな,などと悩んでいました。

でも「プログラマーのためのプログラマー日記」( by kwach さん ) の 2003-06-25 を読んでひと安心。エンピリカルな根拠から堂々と意見を述べてくれる姿は非常に心強いのです。そうだ,連結決算の勉強よりも,mozilla のドキュメントを眺めていた方が楽しいじゃないかっ。私も主張したい事を堂々と主張せねばっ。

おりゃあ! 私は技術が欲しいんだ! ランダムウォークな株価指数を追っかける暇があるなら,gcc のソースを追っかけて逝きたいんだ!! 生粋のアルゴリズムおたく万歳!!!1123

・・何を言ってるんだ自分は ( やっぱり脱力 )

2003-07-02

日本語での議論

議論のしかた ( by iwatam さん ) というモノを私は知らないまま高校・大学を卒業し,よせばいいのに社会人 ( 似非 ) として 2 年間もダラダラと。あーあ,こんな風に比較的分かりやすい言葉で文書化が可能なんだから,文部科学省は小学校もしくは中学校の必修科目にするべきなんですマジで! っていうかぜひ!

一方我らが /.J では,「楽」にまつわる議論というか,もはやちょっとしたフレームが勃発。このコメントの後の「農薬を使うのは作業の軽減のためであり,楽だからではない」に対して Ryo.F さんが「しかし,作業の軽減とは要するに『楽』では」とツッコミを入れたのが発端。

多分,この議論の混乱の原因は「楽をする」「楽になる」という言葉の混同にあると思います。前者は「絶対的な楽」,後者は「相対的な楽」ですね。

「農薬を使うのは作業の軽減のためであり,楽だからではない」で用いられている「楽」は,「楽をする」つまり絶対的な「楽」。対して「作業の軽減とは要するに『楽』では」で用いられた「楽」は,「楽になる」の「楽」。

Ryo.F さんの

慢性的な人手不足で苦しいのが、農薬を使うと「楽になるから」ですよね。
( 中略 )
無農薬だと楽じゃないけど、農薬を使うと「楽になるから」ですよね。
( 中略 )
「楽になるから」なら「楽になるから」と認めれば良い ( 意図的に端折って後略 (笑い) )

これは間違いではありません。一方,大元のコメント

私の田舎の畑では農薬つかってますが、別に楽だから使ってるわけではありません。

はおそらく,日本の農業の現状を察するに「楽になる」事を否定しているのではなく「楽をする」事を否定しているものと考えられます。ここで混乱したために,お互いに少し感情的になってしまったようです。

日本語はこれまでほとんど体系的に研究,理論付けがなされなかった事もあり,比較的感情を表しやすい言語に育ったと・・ソースが出てこない・・えーと,大学の先生がそうおっしゃっていました ( <-逃げ )。議論に感情を持ち出すのがナンセンスである事は上述「議論のしかた」で述べられている通り。しかし正確な言葉を用いる事と,議論の相手の感情を考慮する事は少なからず関係しているのではないかな,というのが今日の感想。

って? え? これ? 問題提起になってる? いやそんなつもりじゃ・・ぁぅぁ・・

[ 感情を表現しやすい ]
あれれー,「FWMW( 2001/10/21 参照 )」( by Emie さん ) では「ヨーロッパの言語は感情を表しやすく,対して日本語は淡々としている」て。。。まじですか。

2003-07-01

クリエイティブな脳みそ

ついに 7 月。初日はいきなり雨模様で,夜は若干肌寒かったりします。ずっとこの調子ならいいんだけど,そうは問屋が卸さねえ。

クリエイティブな人は夢を覚えている / Creative People Remember More Dreams

夢を覚えているからクリエイティブなのか,クリエイティブだから夢を覚えられるのかはまだ不明なのかな。

私は夢を全然覚えない人です。そして私はクリエイティブではありません。よって,このレポートは私を納得させます

言いたい事はそれだけだ。( ここで脱力 )

2003-06-30

「アクセスプラス」終了

2003-06-28 で少しつぶやいている通り,アクセスプラスさんは微妙にニヤリとさせられる会社でしたが,なんとそのユーザ (「リンクスタッフ」と呼んでいる) の半数もかなりのドキュンだった模様。

突然ですがリンクスタッフサービスを、6月いっぱいを持ちまして終了させて頂きます。
2ch・ヤフー掲示板などの宣伝禁止サイトでの悪質な宣伝が多数行われ、その宣伝によって登録された
スタッフが同様な行為を行う事で、スタッフの約半数が違反スタッフとなっております。
多数の掲示板・メールマガジン管理者様に多大なご迷惑をお掛けしている状況です。
また、違反スタッフの取り締まり(1日1000件以上のリンク確認)・報酬支払いの為の確認作業等で
正式なスタッフ様へのご入金・メールのご返信が遅れております。
今回のサービス終了に伴って、現在ご迷惑をお掛けしておりますスタッフ様へは10/01日までに
全てのメール対応・報酬お振込のほうお約束致します。
以下は今後の対応予定となりますので、ご確認のほどお願い致します。


06/30日 リンクスタッフサービス停止(課金・宣伝)
07/30日 報酬要請の最終日・会員ページの撤去
09/30日 サポート終了
10/01日 リンクスタッフサービスの全停止

今思えば,1 クリック 10 円という魅力が異常だったんですよね。

ところで規約によると,報酬額が 1 万円を超えた時点でその報酬を受け取る権利が生じます。しかし私の場合は結局 1 万円を超えませんでした。・・ダメっすか?

わからいでか!

・・という言葉を知ったのは何かの漫画だったかな。少なくとも学校の教科書ではありません。

社会の「常識」なるものは,その大部分が `入手が確率的である情報' で成り立っているので大変です。必ずしもその情報に出会うとは限らないのにね。モスバーガーではトレーを自分で片付けなくて良いと,店の中のどこに書かれてありますか? 一般に,自らを「常識ある社会人」とのたまう人間は,そのような確率的にしか出会えない情報に不幸にも出会えなかった人間の事を `異常' と見なす傾向があるようです。

「わからいでか」・・どうも辞書には載ってなさげ。google で検索したところ,既に閉鎖したらしいサイトのキャッシュに出会う事が出来ました。

この言葉は「わからないはずがあろうか = 当然,わかる」という意味の大阪弁であるとの事。「わから - いで - か」と分解する事ができ,中間の「いで」が反語を形成するようです。「怒らいでか」「知らいでか」のような感じで。

で,google で「わからいでか」のみを検索すると,小説サイトなどでさも当然のように何の解説もなく使用されているので畏れ。文脈でなんとか理解できるのがせめてもの救いです。

[ 店の中のどこに ]
どっかに書いてあるだろうに・・・注意書きを読もうともしないのは私の悪いクセ。
[ 大阪弁 ]
先生! 「関西弁」との違いが分かりません!

2003-06-29

Mozilla さんとたわむれる日々

そろそろ関東地方も梅雨明けじゃないかなあと思う頃。ちらほらと雲が出ていたものの,徐々に絶望的な暑さになってまいりました。

さて今日の Mozilla さんはちょっと気になるレンダリングミスをやらかします。このサイトのトップでこのような HTML を書いていますが:

	To view these, 
	<script type="text/javascript" src="./JS/browser.js"></script>
	<noscript>Lynx</noscript>
	iz da best, hehehe...

こうレンダリングされます:

レンダリング結果 / rend.png 147x81

;<noscript>〜</noscript> が一つの box 要素を生成してしまうようで。これってただの nightly のバグ? ですよね?

それはそうと,またコインランドリー・・

以前,かなりルーズと思われる人がコインランドリーの洗濯物をほったらかしにしている事を愚痴りました。・・そして今日もまた放置された洗濯物を発見。結局それは回収されないままコインランドリーの営業は終了したようです。

今日は ──どうせ私には関係ないけど── 事態は笑っちゃう方向に進みました。というのも,明日はコインランドリーが閉まっているのです。もちろん管理人さんに言えば特別に開けてもらえるでしょうが・・・

( 開けてもらわない事には ) 明日一日は洗濯物を回収できません。しかし管理人さん,繰り返しこのような状況に遭っているらしく,「これじゃ営業妨害だよ」とかなりご立腹。おそらく無事では済まないでしょう

顛末が気になります。火曜日の朝一番に確認するべき。

2003-06-28

こんな会社のお話

とりあえず事実だけを列挙しておきましょうか。これは各社さんとも隠しているものではなく,完全にオープンな情報です。

まず web サイト広告代行屋の「アクセスプラス」さん。私たちの web サイトにテキスト広告を貼り付け,それが 1 回クリックされるたびに広告料として 10 円が私たちに振り込まれるシステムを採用しています。そんな私たちの事は「リンクスタッフ」と称されます。さてその「リンクスタッフ規約」を見てみると:

第14条 守秘義務
1. 甲は乙の情報を第三者に漏らす事はないものとします。
2. ただし、捜査協力義務が生じた場合はこの限りにありません。

甲 = アクセスプラスさん,乙 = リンクスタッフ = 私たち,という構図。乙は「リンクスタッフ」として登録作業を行う際に甲にメールアドレスを知らせますが,そういう情報も第三者に漏らす事はないって事で OK ?

次もやはり web サイト広告代行屋「SOHO通信」さん。なんと広告をメールマガジンとして発行しています。

メールアドレスの収集方法がやや独特。自分で web 上を駆け巡って収集するのではなく,他の組織が集めた情報を譲ってもらっているのだそうで。

一括登録提携サイト様をご利用の場合に関しましては、
当サイトへ提携サイト様から、投稿者のデータが送られて来た地点で、
既に、代理登録に同意したものとみなされます。
詳細に関しましては、各提携サイト様投稿規約をご確認ください。

5/29現在の提携サイト様は下記となります
Back-Up!様|つぼみネット様
いっきにドン!様|アクセスプラス様|PecoExpress様
PRJAPAN様|THE 宣伝様|一括投稿花子様|選べる広告様|速攻ネット様

尚、代理登録完了後には、件名「読者登録が完了しました!」にて、
確認メールも配信しております。

なぜ「投稿者」という表現が用いられているのかは謎ですが,これはつまり私たちの事。通常は私たちの同意のもとで広告メールマガジンを送るけど,提携サイト様から譲ってもらったメールアドレスに関しては「既に同意済みである」と勝手に見なすという意味。

で,今日も私の元に数通の広告が送られて来ました。ハハハ・・・。

2003-06-27

図星をつかれた人間の図

2ch のサーバ管理を行っているらしい某社に喧嘩を売りましたかあの人たちは。

私はソフトウェア板の Mozilla スレッドをよく見るけど,やはり非理論的で要点を得ないアンチ派が存在します。しかしそんな輩,Moz 擁護派にとってはただ出て行って欲しいだけ。単純にウザいだけなんですよね。だから通常の Moz 擁護派は必要以上には叩いたりしません。完全に無視を決め込むか,まれに釣られて非理論性を指摘するのみ。

さてさて,今回の事件の発端らしきスレッドを眺めてみると,アンチ派を必要以上に叩く擁護派の存在が目立ちます。アンチ派の数回の書き込みに対して,具体的な反論もなくただひたすら人格攻撃に徹する擁護派がワンサカとね。

いろいろ勉強になりました。

[Perl] デバッガ [知らなかった・・]

「とりあえず一通りラクダ本には目を通しました!」とか言ってる人間にとってめっちゃくちゃ恥ずかしい事に,これは知りませんでした。Perl にはデバッガが標準で存在しますというか,"perl" そのものがデバッガでしたか

perl -d mycode.cgi

ステップ実行を行いながら,変数をウォッチする事も可能です。詳しくは「ラクダ本を読め」なんだけど,やはりあのブ厚さは伊達じゃありませんでした。もう一度読み直すことにします。。。

2003-06-26

CGI をデバッグするお手軽な方法 [迷惑行為?]

なぜか CGI ネタが続きますが,最近掲示板をいじったりしてネタが貯まったので仕方がないのです。

次の Perl コードにはバグがあります。

target.cgi
#!/usr/local/bin/perl

binmode(STDOUT);
print "Content-type: text/plain\r\n";
print "\r\n";

if ( $ENV{'REQUEST_METHOD'} eq 'GET' ) {
	&get_method();
} elsif ( $ENV{'REQUEST_METHOD'} eq 'POST' ) {
	&post_method();
} else {
	die "unknown method";
}

sub get_method {
	print "GET method";
}

sub pst_method {
	print "POST method";
}

sub post_method を記述しようとして,間違えて pst_method などと書いてしまいました。

perl は,普通に実行されただけではこのタイポに気付いてくれません。perl -cw で起動しても無駄です。この CGI が POST メソッドで起動される事でようやくサブルーチンが適切に定義されていない事に気付くのです。これだけならばまだバグに気付くのは簡単かも知れませんが,しかし滅多に参照されないようなサブルーチンの記述を間違えていた場合,障害に遭遇する事すら難しいのです。

もっともこのようなバグも,普通にコマンドラインにて perl target.cgi などと起動した場合は遭遇する事さえ出来れば "post_method なんてサブルーチンは見当たりませんよ?" というメッセージを見る事が出来ます。しかし CGI の場合にはさらに悪いニュースが待っていて,STDERR に出力される Warning メッセージはブラウザに出力されません。つまり CGI の製作者は,その CGI が正常に動作しない理由を知る手段を断たれてしまっているのです。

そこで,私はデバッグ時にはこんな感じの皮をかぶせています。

target_debug.cgi
#!/usr/local/bin/perl -w

eval {
	require 'target.cgi';
};
if ( $@ ) {
	print "Content-type: text/plain\r\n";
	print "\r\n";
	print $@;
}

target.cgi が文法的な理由で実行できなかった場合はもちろん,die "message"; で異常終了させた場合もそのメッセージを拾って出力させる事が出来ます。perl における例外機構の実装の常套手段ですね。

ただ・・eval のコストってどんなもんなんでしょう? もしもコストがやたらと高いものならば,この手段は少なくとも共用サーバで用いてはいけないものですが。

2003-06-25

正しいはずの CGI が動かない理由

私が何も考えずにテキストエディタで CGI スクリプトを書くと,こんな感じになります。[CRLF] は,そこで改行している事を表します。

#!/usr/local/bin/perl -w[CRLF]
[CRLF]
print "Content-type: text/html\r\n";[CRLF]
print "\r\n";[CRLF]
[CRLF]
print "<html><head></head><body><p>hello :)</p></body></html>";

これをローカルでテストすると ── つまり Windows 上で動かすと,まずまともには動きません。なぜならば print で出力する \r\n はシステムが \r\r\n に変換してしまい。ブラウザはこれをきちんと解釈できないからですね。

スクリプトの先頭で binmode(STDOUT); とする事で解決します。( ルーズな人間ならば \r\n と書かずに \n とだけ書くでしょう:Windows は \r\n を出力するようになり,他のシステム上では \n だけを出力します。HTTP/1.1 は,とりあえずそのようなルーズなヘッダにも寛容であった方が良いとの記述があります。)

そしていざ NewCOARA サーバに (何も考えずに) アップロードして動かすと,やはり動きません。原因は [CRLF] にあります。NewCOARA さんの CGI サーバは Solaris + Apache 1.3.26 + Perl 5.004_04 ですが,これらは [CR] が改行文字である事を知らないようなのです。

全ての [CRLF][LF] のみに変換して,ようやくまともに動くようになります。

これ,初心者さんは解決できてるの? どうやって?

2003-06-24

[WinAPI] MoveWindow() と WM_SIZE

2ch 巡回して気付いたことをメモ。数日前のネタなんだけど,書くのを忘れてたや。。。

WinAPI の ::MoveWindow() は,メッセージ WM_SIZE を送出します。ちゅーことは,こんなコードは危険?

void setClientSize( HWND wnd, int width, int height ) {
  RECT wr, cr;
  ::GetWindowRect( wnd, &wr );
  ::GetClientRect( wnd, &cr );

  // ウィンドウサイズとクライアント領域のサイズのギャップを計算して,
  // 望ましいのウィンドウサイズを計算する
  width += wr.right - wr.left - cr.right;
  height += wr.bottom - wr.top - cr.bottom;

  ::MoveWindow( wnd, wr.left, width, wr.top, height, TRUE );
}

LRESULT CALLBACK wnd_proc( HWND wnd, UINT msg, WPARAM wp, LPARAM lp ) {
  ( 中略 )

  // ウィンドウサイズが変更されても
  // 強制的にクライアントサイズが 640x480 になるようにする
  if ( msg == WM_SIZE ) {
    setClientSize( wnd, 640, 480 );
    return 0;
  }

  ::DefWindowProc( wnd, msg, wp, lp );
}

ちなみに setClientSize()::AdjustWindowRect() があるだろ,とか,ウィンドウサイズを固定させたいなら WS_**** でウィンドウスタイルから指定すべきだ,とかのツッコミはしない方向で。

WM_SIZE が送られると setClientSize() が呼ばれ,中では ::MoveWindow() を呼び出しています。するとまた WM_SIZE が呼ばれ・・・一見,無限ループを起こしてしまいそうな予感。

しかし実際には,ウィンドウサイズに変化がなければ ::MoveWindow()WM_SIZE を投げないようです。同様の WinAPI に ::SetWindowPos() が存在しますが,これもやはり,ウィンドウサイズが変わらないなら WM_SIZE は発生しませんでした。

・・あー,考えを逆転させると「ウィンドウサイズが変わるなら WM_SIZE は発生し続ける」ってわけなので,このあたりについては気をつけないとマズそう。

2003-06-23

日本語のよりどころ

漢字研究・漢字資料

雑記草」( 後藤 吉孝 さん ) を見回ってて発見。特に上記サイト内の「現代日本語表記法」に興味そそられました。「内閣告示」てな形で,仮名遣いや外来語の表記方法が・・とりあえず「定められている」とか言っちゃっていいですか?

掲示板のようなコミュニケーションの場で,特に言葉の表記が重要ではないコンテキストにも関らず,日本語の表記方法の揺らぎなどという下らない問題でモメた時,このようなリソースを示す事が出来るのは非常に良い事だと思いました。

言葉というものは須らく移り変わるもので,例えば「確信犯」という言葉,2ch の“ニュース速報+”のスレッドでは「もう『全てを計算し尽くした上での犯行』という意味でいいじゃん」という声もちらほら。

すいません。それだけは勘弁してください (;´Д`) 私の頭は相当にニブいんで,すぐには切り替えられないのです・・・

2003-06-22

ジリジリ焦る日常

室温がそろそろ 38 度に到達しそうな季節です。今年の夏こそはダメかもわからんね ← 色んな意味で。

しかし気ばかり焦ってイカンですな。私は明らかに "世間一般" から遅れを取っています。いくら鈍感な私でもそれくらいは自覚できるのです。だからいつも何かに必死なんだけど,今何に必死になっているのか自分でもよく分かっていないから一層タチが悪いし。

とりあえず,黙々とコーディングを続けるしかないのかな。楽しいからいいか

C(!?)SV 分解 - 少しだけシンプルに

昨日の C(!?)SV の分解ネタは,ちょっと難しく考えすぎました。こっちの方が 4 文字ほど短いですね。

my %data = ($line =~ /<<(.*?)>>(.*?)(?=<<)/g);

(?:(?=<<))(?=<<) だけでよかったのです。こんな構文を使っている理由は次の通り:

まず <<(.*?)>>(.*?)<< というパターンを使うと

<<key1>>value 1<<key2>>value 2...

"key1" という文字列が $1 に,"value 1" という文字列が $2 に格納されます。しかし Perl のパターンマッチエンジンはすでにその後ろの << にも気付いているため,次回のパターンマッチは

key2>>value 2...

の部分から始まります ── これでは key2 - value 2 を得る事ができません。そこで拡張構文 "(?= .. )" の出番。(?= .. ) の中身がマッチしても,Perl はそこを "処理済み" とは見なさず,次回のパターンマッチの対象に含めてくれます。

しかし (?= .. ) ってカッコで囲まれてあるし,このままでは $3 が生成されてしまうのでは? と考えてさらに (?: .. ) で囲んだのが昨日のコード。・・・見事に冗長だったわけですが

ところで,さらに効率のよさそうなコードとして

my %data = ($line =~ /<<(.*?)>>([^(<<)]+)/g);

こういうのも思いついたんだけど,すぐに私の欲しいものではない事が分かりました。

なぜ私が "<< .. >>" と二重のカッコを使用しているかと言うと,ログの中に利用可能な HTML タグを残しておきたかったからです。利用不能なタグはさっさと "&lt; .. &gt;" のようにエスケープして記録すればよく,利用可能なタグは "< .. >" のように残しておく事で,出力時に余計な変換を行わずに済みます。

で,"value *" の部分のマッチに ([^(<<)]+) を使おうと思ったのが上のコード。「"<<" にマッチしないような 1 文字以上の文字列」という意味を狙ったんだけど,残念ながらこれは「"<" にマッチしないような 1 文字以上の文字列」と解釈されてしまうようです。これでは利用可能タグとして残した "< .. >" を見つけると,そこでマッチが止まってしまいます。

たったこれだけの事に,あれこれと考えさせられます。正規表現ネタだけで本が 1 冊書けてしまうのも納得。

[ 本が一冊書けてしまう ]
J.E.F. Friedl 著,田和 勝 訳「詳説 正規表現」( オライリー・ジャパン )
Written by kuri|minima(tkuri@fat.coara.or.jp) - all rights reserved.(warai
このリソースの位置情報は http://www.coara.or.jp/%7etkuri/D/036.htm で安定しています。