ダメです今日は。ネガティブな気が充満しています。エンドユーザと直接会う機会が出来たわけですが,ハッキリ言ってワガママすぎ。詳細を書くのはあまりにも面倒ですが,とりあえず私のような下っ端のプログラマは,いくらエンドユーザが仕様の変更を要求しても,勝手に応じてはいけません ── 上が「うん」と言わない限りね。しかし「ソフトウェアが完成しなければ代金は払えない」と。一体私にどうしろと。もう 4 ヶ月も給料が未払いなのですが,今私が会社を辞めれば面白い事になりそうです。
そんなネガティブな雰囲気に便乗,こんなコードを書いて見ました。
sub least {
my %hash = map { ($_,1) } @_;
my @arr = sort { $b<=>$a } keys %hash;
my $index = @arr;
--$index;
return $arr[$index];
}
辛うじて,サブルーチン名から何をやっているかを推測する事ができるかも知れません。まず引数に渡された配列を連想配列にマップして値の重複を取り除き,なぜか降順にソートし,奇妙な運命を経てリストの一番最後の要素を返しています。すなわち最終的に得られるのは,リストの最小値ですね。
こんなコードをあちこちに紛れ込ませておけば,プロジェクトは破綻へ向かうに違いありません。悪用ダメゼッタイ。
ネガティブ度:34
えらく初歩的なネタですが,しかしその初歩すら身に付けないままプロを名乗っている人間が至近距離とさえも言えないほど近くに居るので大変です。
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
ウェブサイトは「HTML の文法に沿った text/html」と「HTML の扱い方を間違えている text/html」に大別する事が出来ます。後者の場合は多くのブラウザが必要なものを補うため,表示結果のみでは HTML の記述を間違えているかどうかが判別しにくい,というのが昨今の HTML 事情と言ったところでしょうか。
そこで,サイトの管理者さんになるべく正しい HTML を書いてもらうように指導を始めたのが本日紹介したサイトの趣旨。文法の正しくないサイトを発見し次第,サイトの管理者さんに改善の要望を出してゆくわけですね。もっとも日本だけでもかなりの数の厨房諸氏がとんでもない HTML 文法を掲げてそのイチモツをおっぴろげているわけで,その全てにツッコミを入れるのはキリがありません。まずは公共性の高いサイトから順次改善を要望してゆく,というスタンスが一般的?
ただし文法の間違った HTML を書いている氏の半数以上は,なぜそれが間違いと呼ばれるのかを理解できないので,多少ケムたがられているかも知れません。そのようなサイトはエンターテインメント性の高いものであり且つ「一般的に閲覧できなければ困る」という性質のものではないものがほとんど。ツッコミもほどほどに,っすね。
疲労度:20
妖精現実 フェアリアルさんからのネタ。「だまし絵エッセイ──雪風 謎ジャム炒め」で紹介されています。私の錯視ネタの好きさの異常さは世界でも・・そうですね・・1000 本の指の中には入ると思います。
Lightness Perception and Lightness Illusions
ご覧の通り,以前に紹介した Checkershadow Illusion の一般形ですかね。一見違う色に見える灰色も,実はその成分は同じであったりします。事例が豊富に揃えられもうお腹いっぱいですが,これでもなおヒトの目の不思議は解明されないので萌え。
ところで Individual demos は flash によるアニメーションを用いての錯視の解説ですが,2.5mb とか 3mb とか書いてるのはファイルサイズ? 実際には数百kb しかないんですけど。
疲労度:6
毎年,いきつけの掲示板とかでこのネタを出してるんですよね。プログラマはカフェインさえ摂取できるならコーヒーの温度はさほど気にしませんが,それでも今の時期ならあたたかい方が好まれます。
コーヒーカップ用保熱機 ( PNG,640x480,7.5Kbytes )
こういうのが欲しいんだけど,売ってないのかなー。よくホテルに備え付けられているのは,カップ自体が金属になっていてお湯を沸かすことができます。しかしカップ自体が熱くなるんでちょっと不便。私が欲しいのは,別にお湯は沸かせなくてもよいものです。あたたかいコーヒーを飲めるならね。
疲労度:5429734092534
ほーら,また日付が変わってます。本当は今は12月2日の朝。どうして私は頑張ってるんだろう? 答えは風の中? 明日はあるのか? どっち?
寒い夜空の中で自転車を漕いでいると,ライトの電池が切れかけているのに気付きました。そこでコンビニを探していると目に飛び込んだのが「24時間スーパーマーケット」。コンビニとは違い,扱っている商品が明らかにスーパーマーケットのものです。
2000 年 6 月,従来の「大規模小売店舗法」が廃止され「大規模小売店舗立地法」が施行,それまでスーパーマーケットなどに課せられていた営業時間の規制が取り払われました。かくしてスーパーマーケットは従来の商品調達のノウハウを活かし,安い価格を維持しながら24時間のサービスを行なう事が出来るようになったわけです。最近ではコンビニでもちょっと安売りがあったりして,競争が激化しちゃってます。ってデフレの原因じゃんっ。
ちなみに弁護士資格を持っていない人が法律を解説する事を非弁行為 ( 非弁活動 ) と言います。畏れ
よく考えると時計の針が 12 時を過ぎているため,日付が変わっています。いやむしろ朝に限りなく近い時間帯とも言えます。今日は 12 月 1 日。現在地点は会社の椅子の上。・・徹夜作業の真っ只中です。
前からどうも挙動不審な VB のソースがありました。しかしその理由さえわかれば当然の振る舞いだと感じられるので,まったく前頭葉ってのは現金なやしです。
Dim nCount, nRev, nCode as Integer
普段 C に慣れ親しんでいるプログラマが何も聞かされずにこのコードを見ると,変数 nCount,nRev,nCode が Integer 型になるように受け止めます。ちなみに VB の Integer 型は 16 bit なのも萎える要因の一つ。
しかしその解釈は間違いで,nCount と nRev はここでは Variant 型になるとの事。きちんと明示的に宣言してやらないといけないんスか。
Dim nCount as Integer, _
nRev as Integer, _
nCode as Integer
・・・こんな仕様,どうなの?
セミコロンを使わずに Hello, world! を書いてみました。
#include <stdio.h>
void main() { if (puts("Hello, world!")) {} }
main が void 型という部分で非常に萎え。これでは g++ ではコンパイルできませんでした。また gcc でも,ソースファイルの拡張子が cpp である場合はエラーとなります。それから引数が標準に準拠していないんで同じく減点対象。あと,if 構文の { } の中身が空っぽだとコンパイルできないコンパイラもあるようで,やはりこんなコードは書くべきではありません。あたりまえですが。
疲労度:5425
こんな 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 のソースコードを追って行けば,まだまだ面白そうな機能が眠っているのかも?
日本語と 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 の扱いを判っていません。上記は各自責任にて。
ちょっと面白いパズルです。
#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
すいません。今ちょっと調子に乗ってます。今日もまた 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
なんか謝られちゃいました。
「ご不便をおかけして申し訳ありません。」by IE (PNG,487x254)
一昔前ならば,アプリケーションは自分が不正な処理を行ったことなど知る由もありませんでした。アプリケーション自身が不正な処理を検知したのを私が初めて見たのは Netscape が採用した Talkback という仕組み。最近では Iria が不正な処理を行った時にも「不正な処理を行ったので終了します」とダイアログが出ました。WinMain を 1 つの try 〜 catch で包んで例外を捕捉してるのかな。
疲労度:49
まず 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 さえ正しく書けないようなサイトを読む必要性が発生する事はない気もしないでもないですねー。この雑記とか。