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

その 21 - 退屈克服委員会

2002-12-06

[ネガティブ・コーディング] 2 - 大山鳴動して鼠一匹

メです今日は。ネガティブな気が充満しています。エンドユーザと直接会う機会が出来たわけですが,ハッキリ言ってワガママすぎ。詳細を書くのはあまりにも面倒ですが,とりあえず私のような下っ端のプログラマは,いくらエンドユーザが仕様の変更を要求しても,勝手に応じてはいけません ── 上が「うん」と言わない限りね。しかし「ソフトウェアが完成しなければ代金は払えない」と。一体私にどうしろと。もう 4 ヶ月も給料が未払いなのですが,今私が会社を辞めれば面白い事になりそうです

そんなネガティブな雰囲気に便乗,こんなコードを書いて見ました。

sub least {
  my %hash = map { ($_,1) } @_;
  my @arr  = sort { $b<=>$a } keys %hash;
  my $index = @arr;
  --$index;
  return $arr[$index];
}

辛うじて,サブルーチン名から何をやっているかを推測する事ができるかも知れません。まず引数に渡された配列を連想配列にマップして値の重複を取り除き,なぜか降順にソートし,奇妙な運命を経てリストの一番最後の要素を返しています。すなわち最終的に得られるのは,リストの最小値ですね。

こんなコードをあちこちに紛れ込ませておけば,プロジェクトは破綻へ向かうに違いありません。悪用ダメゼッタイ

ネガティブ度:34

2002-12-05

[C++] 構造体を初期化してみる

らく初歩的なネタですが,しかしその初歩すら身に付けないままプロを名乗っている人間が至近距離とさえも言えないほど近くに居るので大変です。

struct Alpha {
  int a,b;
  int c[3];
};

struct Beta {
  Alpha alpha;
  int   b;
};

こんな感じの構造体 Beta を初期化したい場合,どのように書けばよいのでしょう? 正解の一つはこう。

static Beta beta = {
  1, 2, 3, 4, 5,  // Alpha の分
  6               // Beta::b の分
};

Alpha の分はさらに { } で囲んでもよいようです。

static Beta beta = {
  { 1, 2, 3, 4, 5 },  // Alpha の分
  6                   // Beta::b の分
};

そうではなく Alpha::c が配列なので,この部分を { } で囲んでみたりして。

static Beta beta = {
  1, 2, { 3, 4, 5 },  // Alpha の分
  6                   // Beta::b の分
};

両方囲んでみてもコンパイルが通りました。

static Beta beta = {
  { 1, 2, { 3, 4, 5 } },  // Alpha の分
  6                       // Beta::b の分
};

そういえば,配列を初期化する場合は {0} と書くとゼロクリアされるんですよね。ならば,Alpha::c の初期化を簡略化してみるとどうなるのかな?

static Beta beta = {
  1, 2, { 0 },  // Alpha の分
  6             // Beta::b の分
};

ん,これでもよい感じです。ちょっと話はそれるけど,static なメンバを持った構造体 Gamma があった場合

struct Gamma {
  int a;
  static int b;
  int c;
};

どう頑張っても b は特別扱いしなければなりません。例えば,こんなコードを書きます。

int Gamma::b = 10;

static Gamma gamma = {
  1, 2   // Gamma::a と Gamma::c が初期化される
};

ぜひともこのあたりについて確たるリソースが欲しいトコロなんだけど,とりあえず私は ISO/IEC 14882-1998 なぞ所有していない事になっているので,よい情報は自分で見つけていく必要があります。例の「プログラミング言語 C++」でも,ここまで詳細な解説は見つけられません。やはり ISO/IEC 14882-1998 を買うべき?? $18 なのは確かに安いですが。

疲労度:98

[ ISO/IEC 14882-1998 ]
つまり C++ の完全なる御姿。そういえば過去に流出事件が発覚したんだけど,今ではリンクが無効になってます・・・い,いや,べべべ別に残念とか思ってないっすよ。。。

2002-12-04

HTML を正しく書きましょう,と

Web標準普及プロジェクト

Opera Open the web

ウェブサイトは「HTML の文法に沿った text/html」と「HTML の扱い方を間違えている text/html」に大別する事が出来ます。後者の場合は多くのブラウザが必要なものを補うため,表示結果のみでは HTML の記述を間違えているかどうかが判別しにくい,というのが昨今の HTML 事情と言ったところでしょうか。

そこで,サイトの管理者さんになるべく正しい HTML を書いてもらうように指導を始めたのが本日紹介したサイトの趣旨。文法の正しくないサイトを発見し次第,サイトの管理者さんに改善の要望を出してゆくわけですね。もっとも日本だけでもかなりの数の厨房諸氏がとんでもない HTML 文法を掲げてそのイチモツをおっぴろげているわけで,その全てにツッコミを入れるのはキリがありません。まずは公共性の高いサイトから順次改善を要望してゆく,というスタンスが一般的?

ただし文法の間違った HTML を書いている氏の半数以上は,なぜそれが間違いと呼ばれるのかを理解できないので,多少ケムたがられているかも知れません。そのようなサイトはエンターテインメント性の高いものであり且つ「一般的に閲覧できなければ困る」という性質のものではないものがほとんど。ツッコミもほどほどに,っすね。

疲労度:20

2002-12-03

錯視ネタまたまた

精現実 フェアリアルさんからのネタ。「だまし絵エッセイ──雪風 謎ジャム炒め」で紹介されています。私の錯視ネタの好きさの異常さは世界でも・・そうですね・・1000 本の指の中には入ると思います。

Lightness Perception and Lightness Illusions

ご覧の通り,以前に紹介した Checkershadow Illusion の一般形ですかね。一見違う色に見える灰色も,実はその成分は同じであったりします。事例が豊富に揃えられもうお腹いっぱいですが,これでもなおヒトの目の不思議は解明されないので萌え。

ところで Individual demos は flash によるアニメーションを用いての錯視の解説ですが,2.5mb とか 3mb とか書いてるのはファイルサイズ? 実際には数百kb しかないんですけど

疲労度:6

2002-12-02

プログラマは熱いコーヒーを好む

年,いきつけの掲示板とかでこのネタを出してるんですよね。プログラマはカフェインさえ摂取できるならコーヒーの温度はさほど気にしませんが,それでも今の時期ならあたたかい方が好まれます。

コーヒーカップ用保熱機 ( PNG,640x480,7.5Kbytes )

こういうのが欲しいんだけど,売ってないのかなー。よくホテルに備え付けられているのは,カップ自体が金属になっていてお湯を沸かすことができます。しかしカップ自体が熱くなるんでちょっと不便。私が欲しいのは,別にお湯は沸かせなくてもよいものです。あたたかいコーヒーを飲めるならね。

疲労度:5429734092534

2002-12-01

24 時間スーパーマーケット ≠ コンビニ

ーら,また日付が変わってます。本当は今は12月2日の朝。どうして私は頑張ってるんだろう? 答えは風の中? 明日はあるのか? どっち?

寒い夜空の中で自転車を漕いでいると,ライトの電池が切れかけているのに気付きました。そこでコンビニを探していると目に飛び込んだのが「24時間スーパーマーケット」。コンビニとは違い,扱っている商品が明らかにスーパーマーケットのものです。

2000 年 6 月,従来の「大規模小売店舗法」が廃止され「大規模小売店舗立地法」が施行,それまでスーパーマーケットなどに課せられていた営業時間の規制が取り払われました。かくしてスーパーマーケットは従来の商品調達のノウハウを活かし,安い価格を維持しながら24時間のサービスを行なう事が出来るようになったわけです。最近ではコンビニでもちょっと安売りがあったりして,競争が激化しちゃってます。ってデフレの原因じゃんっ

ちなみに弁護士資格を持っていない人が法律を解説する事を非弁行為 ( 非弁活動 ) と言います。畏れ

[ 大規模小売店舗法 ]
大規模小売店舗における小売業の事業活動の調整に関する法律。多くは大店法と略したり,まれに大店舗法と略したりも。
[ 大規模小売店舗立地法 ]
これが正式な名前っすか? 大店立地法と略されるのが一般的。
[ 非弁行為 ]
ただし「報酬を得る目的で」ですね。しかも親告罪。・・でも,( 私のような ) シロウトがいい加減な法律の知識をひけらかすのも多少は制限すべきかと。

2002-11-30

[VisualBASIC] C プログラマが憂鬱になる理由

く考えると時計の針が 12 時を過ぎているため,日付が変わっています。いやむしろ朝に限りなく近い時間帯とも言えます。今日は 12 月 1 日。現在地点は会社の椅子の上。・・徹夜作業の真っ只中です。

前からどうも挙動不審な VB のソースがありました。しかしその理由さえわかれば当然の振る舞いだと感じられるので,まったく前頭葉ってのは現金なやしです。

    Dim nCount, nRev, nCode as Integer

普段 C に慣れ親しんでいるプログラマが何も聞かされずにこのコードを見ると,変数 nCountnRevnCodeInteger 型になるように受け止めます。ちなみに VB の Integer 型は 16 bit なのも萎える要因の一つ。

しかしその解釈は間違いで,nCountnRevここでは Variant 型になるとの事。きちんと明示的に宣言してやらないといけないんスか。

    Dim nCount as Integer, _
        nRev   as Integer, _
        nCode  as Integer

・・・こんな仕様,どうなの?

[ 徹夜作業の真っ只中 ]
そんな状況の隙をついてこんな雑記の更新作業をするのは私くらいのもんです。

2002-11-29

[C/C++] セミコロンが消えた日

ミコロンを使わずに Hello, world! を書いてみました。

#include <stdio.h>
void main() { if (puts("Hello, world!")) {} }

mainvoid 型という部分で非常に萎え。これでは g++ ではコンパイルできませんでした。また gcc でも,ソースファイルの拡張子が cpp である場合はエラーとなります。それから引数が標準に準拠していないんで同じく減点対象。あと,if 構文の { } の中身が空っぽだとコンパイルできないコンパイラもあるようで,やはりこんなコードは書くべきではありません。あたりまえですが

疲労度:5425

2002-11-28

[16進数萌え] 正しい? 正しくない? URL の書き方

んな URL の書き方を見つけました。萌え。

http://0xc0.0xf4.0x01.0x28/%7etkuri/D/021.htm

Perl の Socket モジュールや Mozilla では普通に connect が可能でした。しかし IE5.5 や Netscape4.78 では DNS に名前解決を依頼しちゃいます ── 解決できるわけがありません。おそらく Winsock 自身ではこれに対応しておらず,Perl や Mozilla は独自に処理を行っているものと考えられます。

RFC1738 では,URL として IP アドレスを指定する場合は 0 から 9 までの数字しか使えないように規定されています。URL の書式を提案している RFC は他に 1808,2368,2396 ですが,16 進数の扱いに触れている部分はありませんでした。

他の妙な URL の書式としては,こんなのもあります。

http://3237216552/%7etkuri/D/021.htm

どう考えても URL に見えません ( 正確には URL と呼ぶべきじゃないかも知れないし )。IE や Netscape も,この形式ならばきちんと connect が行えるのでわりと有名かも。

というわけで,調子に乗ってみました。これらは少なくとも Perl の Socket モジュールや Mozilla で使用可能です。

http://0xC0F40128/%7etkuri/D/021.htm : 16 進数で。

http://0300.0364.01.050/%7etkuri/D/021.htm : まさかとは思ったけど, 8 進数版。各数字の頭に 0 をつけます。

http://030075000450/%7etkuri/D/021.htm : やっぱり 8 進数版。

むん,Perl や Mozilla のソースコードを追って行けば,まだまだ面白そうな機能が眠っているのかも?

[ 2368 ]
RFC2368 は mailto: スキームの書式について提案がなされています。
[ 2396 ]
RFC2396 が提案しているのは,正確には URI の書式。

2002-11-27

Jcode.pm の泣き所

本語と Perl を扱う私達にとって,Jcode.pm は避けては通れない,いつか必ず出会うモジュールです。作者の Dan Kogai さんは Unicode を好んではいない模様ですがしかし「未来はそこにある」とも。そう,往々にして世界を目指すプログラマはイヤでも Unicode に激突するようなのです。イヤなのに

今日の問題はこんなの。utf-8 全角マイナス記号「−」( 文字コードは 0xEF 0xBC 0x8D ) を Jcode.pm で EUC-JP ( 文字コードは 0xA1 0xDD ) に変換すると,化けてしまいました。

open FP,'utf8.txt';
my @lines = <FP>;  # utf-8 の全角マイナス記号を入力
my $str = $lines[0];
print jcode($str, 'utf8')->euc; # 0xA2F7 (ダガー) が出力される

で,その対処法ですが,Jcode/Unicode/Constants.pm を次のように編集します。

12918| "\xff\x0c" => "\xa1\xa4",
12919| "\xff\x0e" => "\xa1\xa5",
         ↓
12918| "\xff\x0c" => "\xa1\xa4",
12919| "\xff\x0d" => "\xa1\xdd",  # これを挿入
12920| "\xff\x0e" => "\xa1\xa5",

Jcode.pm は Unicode を EUC-JP に変換する時,まず ucs2 とかいうナニカに変換し,それから EUC-JP に変換しています。たまに対応が抜けている部分は,このように補っておくとよいようです。

というか,私はまだ Jcode.pm における Unicode の扱いを判っていません。上記は各自責任にて。

Jcode.pm
参考 -> Jcode
[ 対処法 ]
あえて原因を追求するのは無粋。そもそも Unicode は扱いにくいモノです。
[ ナニカ ]
ていうか,やっぱり Unicode の仲間なんですよね? あーもうわけ分からん。。。

2002-11-26

[C/C++] * ++

ょっと面白いパズルです。

#include <stdio.h>
int main(int ac, const char *av[]) {
  char str[] = [ ? ],  *p = str;
  ++*p;                          // (*)
  putc(*p, stdout);
  return 0;
}

この出力結果として,以下を得ました。

b

そこで (*) の行を次のように書き換えたところ

  *p++;                          // (*)

次のような出力を得ました。

B

さて, [ ? ] に入るものは何でしょう?

[ * ]
間接演算子,逆参照演算子
[ ++ ]
インクリメント演算子

正解は・・・

この挙動は演算子の優先順位だけでは説明できません。なぜなら * 演算子と ++ 演算子は優先順位が同じだから。もっと重要なのは,この演算子が右から左に結合するという事。正解は

  char str[] = "aB",  *p = str;

でした。こういう基本的なところを理解していないから,私はいつまで経ってもアレなんだと思います。

というか,カッコを利用した方がいいっすよね。*(p++) とか (*p)++ とか。

疲労度:5

2002-11-25

[Mozilla] ワンクリックで charset 指定

いません。今ちょっと調子に乗ってます。今日もまた Mozilla の Preferences Toolbar2 拡張ネタ。

2002-10-29 で紹介した通り,Prohosting は不正な charset を強制的につけてくれるため,日本語サイトは軒並み「化け」てしまいます。CGI ならば独自に Content-type: text/html;charset=Shift_JIS などと出力してやることで回避できますが,普通の html ではこうはいきません。

Preferences Toolbar2 でボタンを作成し,onclick に次のようなコードを埋め込みます。

BrowserSetForcedCharacterSet("Shift_JIS");

これで,ボタン 1 つで charset を Shift_JIS にする事ができます。本当はボタンじゃなくて menulist にするべき事なんだけど,menulist は preference をいじる目的に設計されているため,ちょっと無理っぽいですかね。。。

疲労度:12

2002-11-24

IE が落ちた日

んか謝られちゃいました。

「ご不便をおかけして申し訳ありません。」by IE (PNG,487x254)

一昔前ならば,アプリケーションは自分が不正な処理を行ったことなど知る由もありませんでした。アプリケーション自身が不正な処理を検知したのを私が初めて見たのは Netscape が採用した Talkback という仕組み。最近では Iria が不正な処理を行った時にも「不正な処理を行ったので終了します」とダイアログが出ました。WinMain を 1 つの try 〜 catch で包んで例外を捕捉してるのかな。

疲労度:49

[ Iria ]
Wolfy さん作のダウンローダ。Delphi にて製作。今は OpenIria とか書いてますね。OpenIrvine も有名。
[ WinMain ]
一般的な Windows アプリケーションのエントリポイント。msdn にもちゃんと載っていますよ?

[Mozilla] CSS をワンタッチで無効にする

まず Preferences Toolbar2 をインストールします。話はそれからだ。

すかさず "Customize" でカスタマイズを始めます。New Item で新しいボタンを作り,onclick イベントに次のスクリプトを記述します。

var ss = getBrowser().contentDocument.styleSheets;
if (ss)
  for(var i=0; i<ss.length; ++i)
    ss.item(i).disabled = true;

元ネタは 「暁に死す」( 管理人:北村曉さん ) の「ブックマークでユーザースタイル - 徒書」から拝借しました。これで,奇妙な CSS を指定しているために表示がグチャグチャになっているサイトも,ちょっとボタンを押すだけで,文字だけはなんとか読むことが出来るようになります。・・・もっとも,CSS さえ正しく書けないようなサイトを読む必要性が発生する事はない気もしないでもないですねー。この雑記とか

[ まず Preferences ... ]
Mozilla がインストールされていない,というギャグは禁止。
Written by kuri|minima(tkuri@fat.coara.or.jp) - all rights reserved.(warai
このリソースの位置情報は http://www.coara.or.jp/%7etkuri/D/021.htm で安定しています。お疲れ様です coara さん