白頭山旅行記自己紹介工房| 巻頭言| おたより
→ 巻頭言 ▼ 前月分▲ 次月分

2000年〜 の巻頭言


2001年11月22日(木)

exit() によりプロセスを中断した場合は、ローカル変数のデストラクタは呼び出されない。

 きちんとC++言語を学んだ人にとっては当たり前のことなんでしょうが、きちんとC++言語を学んだことのない私は、今日このことを初めて知りました。以下のコードで実験してみると:

#include <stdio.h>
#include <stdlib.h>
class C1 {
public:
    C1() { printf("▼ C1 コンストラクタ¥n"); }
    ~C1() { printf("▲ C1 デストラクタ¥n"); }
};
class C2 {
public:
    C2() { printf("▼ C2 コンストラクタ¥n"); }
    ~C2() { printf("▲ C2 デストラクタ¥n"); }
};
void stop(void) {
    printf("■ exit() によるプロセス終了¥n");
    exit(1);
}
void func1(void) {
    static C1 c1;
    printf("◎ func1()¥n");
}
void func2(void) {
    C2 c2;
    printf("◎ func2()¥n");
    stop();
}
int main(int, char *) {
    printf("■ プロセス開始¥n");
    printf("func1() 呼出¥n");
    func1();
    printf("func2() 呼出¥n");
    func2();
    printf("■ プロセス正常終了¥n");
    return 0;
}
実行結果は:
■ プロセス開始
func1() 呼出
▼ C1 コンストラクタ
◎ func1()
func2() 呼出
▼ C2 コンストラクタ
◎ func2()
■ exit() によるプロセス終了
▲ C1 デストラクタ
となり、exit() による終了時に、static宣言されたオブジェクト(c1)のデストラクタは呼び出されるのに対して、ローカル宣言オブジェクトである c2 のデストラクタは呼び出されません。これは exit() に限らず、Visual C++ の _endthreadex() などによるスレッド終了時も同様に起こります。

 考えてみれば、仮想関数など関数ポインタで動的に選択されて呼び出される関数が存在する以上、コンパイル時にスタック上のオブジェクト配置を決め打ちすることはできませんし、かと言って、関数内でローカル宣言されたオブジェクトを exit() の処理関数内から把握することはスタックを逆にたどったとしても不可能なわけで、それを行う為にはスタックにオブジェクトが積まれるたびにいちいちその情報をテーブルにでも記録してそれを保持する必要があります。しかも、莫大なコストを払ってそんなテーブルを作成しても、普段、普通に関数が終了する99.9999%の場合においてそのテーブルは無駄になるわけで、インタプリタならまだしも、ネイティブコードにコンパイルされる効率重視のC++言語では、そんな仕様はとても飲めないわけです。exit() の実装は、ファイルクローズなどの後処理をしたら、スタックを一気に破棄してスタックポインタを復帰させることで、ちゃっちゃっと片付けるC++の仕様は正しいと言わざるを得ません。C++ は“本物の”オブジェクト指向言語ではなくて、オブジェクト指向でシステム記述が可能なアセンブラなんですから。

 ま、実際にプログラミングする場合は、複雑なオブジェクトはポインタとして保持して、自分の完全な管理下で newdelete するのが普通で、オブジェクトのインスタンスを直接定義することはまずないのですが、改めて、インスタンスを直接定義することの危険性を感じた次第です。風呂釜制御プログラムで「風呂焚きスレッドクラスのデストラクタでちゃんと釜の火を消すようにしてるから大丈夫さ」とタカをくくってプログラムを組むと、家が燃えることになってしまいかねません。 え?Javaならそんな心配はいらないって?...嫌いなんです、Java は。

2001年4月21日(土)
 JavaScript旧暦計算ライブラリ Version 1.3 にはバグがありました。月齢を計算する部分で早トチリして誤った計算をしていました。修正版の Version 1.31 を配布していますので、そちらをご使用ください。

2001年4月18日(水)
 出先でインターネットカフェなどからこのページを開くならば、Yahoo! Japanで、「y-nagano」や「ながのゆたか」「白頭山」のいずれのキーワードを指定しても検索結果は1件しか出てこないので、簡単にたどり着けます。ぜひお試しください。検索キーワード「y-nagano」は、日本語表示はできるが入力ができないことが多い海外のインターネットカフェでも通用するのでお奨めです。

 ひさびさにこの欄を書き替えたついでに、コンテンツも1ヶ所だけ改訂しました。
 JavaScript旧暦計算ライブラリに、月齢を計算するメソッド(というかプロパティ)を追加しました。月と太陽の黄経の経度差が1朔望月(≒29.53089日)で1回転するという前提で:
 月齢[day] ≒ norm( 月黄経[degree] − 太陽黄経[degree] ) ÷ 360 × 29.53089
という式で計算しています。norm() は、角度を0-360の間に正規化する関数です。詳しくは、ライブラリのソースコードをご覧下さい。このソースコードの拡張子を「.js」に変更して保存すると、HTMLやWSHなどから呼び出すことができます。
 ライブラリはフリーソフトで使用法はソース冒頭のコメントに詳述しましたので、それをご覧になってどうぞご自由にお使い下さい。→菊池さんの工作室では、私のライブラリを独自に改良されて公開されています。万年カレンダー「今日のこよみ」スクリプトの多機能ぶりとそのアイディアには脱帽です。おすすめ。

2000年10月15日(日)
 昨日公開のスクリプトについて追記。
 MSIE5.x には Netscape のブックマークを書き出す機能が標準でついていますが、私のスクリプトはブックマークの名前順にソートして出力するのが、MSIEの「エクスポート ウィザード」とは違います。IEのメニュー内でドラッグ&ドロップする方式に慣れた私には、Netscape のブックマーク編集機能はどうも使いにくく順序を整理するだけでも困難で、せめてあらかじめソートして出力してくれれば、と思って作ったのが昨日のスクリプトなわけでして...。
 今後のヒマつぶし予定として、MSIEの「お気に入り」メニュー内の順序もそのまま再現させて Netscape にエクスポートできるようにバージョンアップしようと思っています。現在その方法を調査中です。ま、おそらく誰一人としてダウンロードしないスクリプトでしょうけど。

 厭世的気分ゆえ、読み手を無視しておたくネタでしばらく行きます。このページのアクセスカウントが1日あたり1ケタになるのを目指します。

2000年10月14日(土)
 ヒマつぶしに30分ほどかけて書いたプログラムを公開します。GPL配布のフリーソフトなのでどうぞご自由にお使い下さい。実行するには Perl for Win32 (ActivePerl) が必要です。
 MS Internet Explorer の「お気に入り」の内容を、Netscapeのブックマーク形式に変換して、標準出力に書き出します。Windowsで使っているMSIEのお気に入りを、LinuxのNetscapeに移すために作りました。SJISかつ改行コードCRLFで出力するので、nkfなどで改行コードと文字コードを変換すればLinuxで使用できます。Windows版のNetscapeなら出力をそのまま使えます。
 名称:bmc (MSIE → Mozilla ブックマークコンバータ)
 配布条件:GPL
 ソフトウェアの形態:Perl スクリプト (Perl for Win32専用)
 ダウンロード:http://park1.wakwak.com/~y-nagano/Programs/bmc/bmc.txt

2000年9月11日(月)
 私のISP変更に伴い、このページも新サイトに引っ越しました。ページ内の全コンテンツが新サーバーに移動しましたので、ブックマークやリンクをされていた方は変更をお願いします。なお、今までのベッコアメの私のページは、10月末で契約が切れますので削除されます。ご注意下さい。

2000年4月10日(月)
 泉の4号バイパス沿いにあるラーメン屋「味一品」のラーメンが私は好きです。オープンキッチン&オープンテラスのお店で、屋外のテラスは石油ランプの光がちらちら揺れてムードも満点です。値段も安く、敷地内にハンバーグレストランもあるので、ラーメンだけでは物足りない人でも大満足です。宮町にも支店があるんですがそちらはスープの煮詰まり度がイマイチなので、泉のお店のほうがおすすめです。
 で、金曜日の深夜2時、無性に味一品を食いたくなった私は、お抱えハイヤーに電話をして呼び出しました。私の家の車寄せまで乗りつけてもらって車に乗り込み、先ほどラーメンを食って帰宅しました。味一品に行く途中、西村達が上野で花見をしているという情報を頼りに、上野公園に立ち寄ってきました。上野はちょうど桜が満開で、懐かしい面々が集合した花見はそれは楽しく、その夜は世田谷のプチトマトとかいうホテルにタダ泊まりし、そして今日、国道4号をひたすら北上して目的の味一品ラーメンを食って帰宅しました。長い旅路の末にやっと食えた味一品でしたが、疲労困ぱいの運転手氏はドンブリを前にして呆然と虚空を見つめたまま固まっていました。
 上野花見のレポートは西村まページにて近日公開されると思われますのでそちらをご覧ください。

2000年3月27日(月)
 このページ左上の私の写真が昔のものを使用しているせいか、「写真に偽りあり」との苦情をいただいていますが、髪の毛は去年の夏に腰まで伸びていたのを切りましたし(今はまた伸びてきてますけど)ヒゲもさっぱり剃りましたので、今のあたしゃ写真の通りに若々しく瑞々しい容姿でございます。文句は言わせません。

2000年3月26日(日)
 NY Spectrum Analyzer 開発室版 バージョン1.20RC1 を公開しました。表示色を選べるようになって、我ながらクールなデキに仕上がったと思っています。機能追加はこれでひとまず停止して、あとは正式版公開に向けてバグ潰しを進めて参ります。
 なお NY Spectrum Analyzer は、Windows 95/98/NT4/2000用のソフトウェアです。その他のOS愛用者の方は対象外ですのでご了承下さい。

2000年3月13日(月)
 NY Spectrum Analyzer 1.18(旧名称:Spectrum Analyzer)を公開しました。

2000年3月5日(日)
 拙作のフリーソフトSpectrum Analyzerの新版を公開しました。バージョン1.16aで行った修正を反映し、さらに要望の多かったウィンドウサイズの拡大機能を搭載して、バージョン1.17になりました。

(5日午後6時追加情報)
 今朝から配布していたv1.17には、起動時一瞬画面が乱れるバグがありましたので改訂し、v1.17aを現在配布しています。v1.17をダウンロードされた方は、お手数ですがv1.17aをダウンロードし直してください。

2000年2月29日(火)
 今日は400年ぶりの「00/02/29」という日付。“みれにあむふぃーばー”はまだ終わっちゃいない...。
 昨日のWin95/98 con/conバグの話の続きですが、メール/ニュースの購読にOutlook ExpressNetscape CommunicatorなどのHTMLをサポートするクライアントを使っている方は、緊急に対策が必要です。例の「危険なURI」をJavaScriptを使って開くように仕込んだメールを受信すると、そのメールを読もうとした瞬間にブルースクリーンになってしまうことを実験して確かめました。プレビュー表示を使っている場合はメールをいちいち開かなくても、プレビュー表示によってOSが死んでしまいます。メールよりも怖いのがニュースで、誰かがそんな記事を流すだけで世界中のWin95/98に絶大な被害を与えることが出来てしまいます。以下の対策を直ちに行ってください。

【対策例】Outlook Expressを使っている場合:
(以下の説明は、Outlook Express 5.01 を前提にしています。異なるバージョンでは設定項目の名前等が異なるかもしれません。)
  1. Outlook Express の「ツール」メニューの「オプション」を開き、「セキュリティ」タブの「セキュリティ ゾーン」を「制限付きサイト ゾーン(安全性が向上します)(R)」にする。
  2. コントロールパネルから「インターネットオプション」を開き、インターネットのプロパティの「セキュリティ」タブをクリックし、
    並んだアイコンの中から「制限付きサイト」をクリックして選択し、「レベルのカスタマイズ」ボタンをクリック。
    「設定」の下のほうの項目に「アクティブ スクリプト」というのがあるので、それを「無効にする」にチェックを入れる。
 私の環境で上記の操作を行ったところ、危険なスクリプトを含んだテスト用メールを開いてもなんの異常も発生しなくなりました。Netscape の場合は、私は使っていないのでわかりませんごめんなさい。

2000年2月28日(月)
 Windows 95/98(WinNT/2000は無関係)の一部のバージョン(NEC PC-9821系は無関係との情報あり)で con\con というファイルにアクセスするとOSが死ぬというバグが今ごろになって見つかって、先週あたりから関連ニュースグループで話題になっています。DOS窓で「cd con\con」とタイプしたり、「ファイル名を指定して実行」に「con\con」と入力したり、WWWブラウザのアドレス欄に「file:///C|/con/con」と入力すると、いとも簡単に恐怖のブルースクリーンを拝めちゃいます。その後は電源を切るかリセットするしか復旧する方法はないという恐ろしさ。私のマシンで試したところ、ちゃんと画面真っ青になってリセットする羽目になりました。ブルースクリーンをまだ拝んだことがないという幸せな方は試してみるといいでしょう。確実に不幸になれます。
 この欠陥はOSレベルのもの(Win95/98のFATファイルシステムを司る"IFSMGR.VxD"のバグ)なので、いかなるアプリケーションからも、上記のファイルにアクセスするだけでOSが死んでしまいます。con 以外にも prn, aux, nul, lpt などの、要するに MS-DOSの遺物である「予約デバイス名」であればどれでもOSを落とせます。
 で、これのどこが問題かというと、このファイルを指すリンクをMSIEやNetscapeなどのWWWブラウザで開くと、Windowsが停止してしまうということなのです。Webページの中に上記のリンクを入れておくと、それをクリックしただけでその人のPCをフリーズさせられるのです。クリックなんてしなくても、HTMLの<META>タグを使ったり、HTTPのLocation:ヘッダを使うことで勝手に誘導させることもできてしまいます。また、Web自動巡回ソフトなんてシロモノを使っている人は、それこそクリックしなくてもそのソフトが勝手にアクセスしてしまいます。今までに発見された多くのバグとは異なり、非常に簡単に実装できてしまうのが恐ろしいのです。
 2月28日現在、Microsoft からはまだアナウンスがないようですが、
   マイクロソフトセキュリティアドバイザ
   http://www.asia.microsoft.com/japan/security/
のページをこまめにチェックして、修正パッチの配布を待ちたいと思います。それまでは、狂信的に反マイクロソフトを謳うサイトなどヤバそうなところには近付かないのが得策でしょう。(大抵のアンチMSサイトはマトモなので大丈夫だと思いますが。)

2000年2月3日(木)
 不肖私、サンモール一番町商店街振興会青年部部外部員ということになりまして、サンモールのホームページを立ち上げる係に任命されてしまいました。で、昨日はサンモールの節分豆まきということで、そのお手伝いをさせてもらってきました。
 サンモールのアーケードの、丸善前とひらつか前にステージを作って、袋入り当たりクジつきの豆を撒いたワケなんですが、...すごいですワ、オバさんのパワーは。たかが豆ごときに、必死の形相で「もっとちょうだい〜、豆ェまめェ〜」と原色真ッ黄色の声が飛び交い、あちこちで豆袋の奪い合い。バッグの中にもうぎっしり豆をかき集めてるのに、もっとくれもっとくれと...。こちらとしては楽しんでもらえればそれでいいので、転倒事故などがないように見守っていたのですが、見ててとにかく面白かったっス。
 我がサイク部で私と同期の、森田様、山田様も、あと15年もしたらあーなってしまうのでしょうか? あーなってしまうんでしょうね。

2000年1月28日(金)
 ご存知でした?

 松島湾・浦戸諸島朴島って、ゴールデンウィーク頃に島一面を黄色に染める菜の花畑で有名ですが、その菜の花、ハクサイの花なんですってね。白菜の丸くなる遺伝形質は劣性遺伝子なのだそうで、他のアブラナ科と交配してしまうと白菜が小松菜のようになってしまって結球しないんだそうです。で、孤島の地理を生かして、他のアブラナなどを駆除して純粋培養しているのだそうです。知らなかったなー、あれ、全部ハクサイだったとは...。

 広瀬通のホテルリッチ改めホテルリッチフィールドの前のイチョウの木に、毎晩花が咲いているの知ってました? 広瀬通のイチョウ並木の中で、ホテル前の3本の木にだけ、夜になると白い花がいっぱい咲くんです。...あれ、鳥なんですね。今までホテルが休業中でそこだけ暗かったせいか、野鳥の夜のねぐらになってるみたいです。国分町でしこたま飲んだあと、猛烈に視界が狭窄した状態で千鳥足でそこを通る私は、上なんて見上げたことなかったので今まで気付きませんでした。でもホテルが今週から営業開始したので、鳥さんのねぐらがお引越しするのも時間の問題かもしれません。

2000年1月11日(火)
 2000年になって10日あまりが経過しました。Y2K問題とは無縁だったかというとそうでもなくて、実は「JavaScript バイオリズム」がMSIEでは動作しなくなっています。西暦の下2桁を返すJavaScriptの古いメソッドgetYearを使用しているのが原因なのですが、Netscape 4.x ブラウザでは2000年以降も正しく動作するようにブラウザ側に修正が加えられた(西暦から1900を引いた年を返すように仕様変更)のに対し、Microsoftは考え方の相違で4桁の西暦を返す新しいメソッドgetFullYearを使うように仕様変更(従来のgetYearは2000年以降は4桁の年を返す仕様。よって2000年を越えると+1900してしまう。)してしまったためです。両社の対応のどちらも一長一短あるので一概にMicrosoftが悪いと決め付けることはできません。すべては2000年以降のことを考えてプログラミングしなかった3年前の私が悪いのです。
 でも、ま、あのバイオリズムスクリプトを使う人は皆無だと思いますので、当面はそのままにしておきます。私が気乗りしたら今度はJavaかサーバーサイドcgiあたりでもっと使いやすいバイオリズムのプログラムを組もうかな...。
【参考】先人の作成されたバイオリズムアプレット(Yahoo! Japan 検索結果へのリンク)

平成庚辰 元旦
あけましておめでとうございます。
旧千年紀中は世話ンなりやした。今千年紀もよろしゅう。

→ 巻頭言 ▼ 前月分▲ 次月分