September 28, 2004
[C++] C++ 例外の怪(おまけ)
2004 年 9 月 27 日の laconicDiary で,(re-throwするオブジェクトがないけど)
とありますが,まさにそこが「怪」なのです.
引数なしの throw;
は例外の再スローを行うことは仕様のようですが,例外ハンドラ以外で再スローすると,なぜ C++ のランタイムライブラリが「ありもしない」例外をハンドルするのか,なぜコンパイルエラーにならないところが不思議です.
ちょっと下の方に書いてあるそれ以前に、10 / 0 (int / int)でどうして「浮動小数点」例外なのかが気になる。
という点は私も気になりました.しかしよく考えてみると,浮動小数点で 10.0 / 0.0 を実行すると,値は無限大になるだけで,別に浮動小数点例外が発生するようなことはなかったように記憶しています.試しにやってみることにしました.
#include <iostream>
int main()
{
std::cout << 10.0 / 0.0 << std::endl;
return 0;
}
上記のソースコードをコンパイルして実行すると以下の結果が得られます.
% g++ test.cc test.cc: In function `int main()': test.cc:4: 警告: division by zero in `1.0e+1 / 0.' % ./a.out inf %
例外は発生していません.一方,整数で 10 / 0 を実行すると... 次の例のように floating point exception が発生します.
#include <iostream>
int main()
{
std::cout << 10 / 0 << std::endl;
return 0;
}
% g++ test.cc test.cc: In function `int main()': test.cc:4: 警告: division by zero in `10 / 0' % ./a.out zsh: 28997 floating point exception ./a.out %
当然これは signal(7) の SIGFPE のことです.前者の例から考えると,浮動小数点の 0 除算では「本当の」SIGFPE は発生しないでしょうから,私が推測する理由は次のようなものです.
「UNIX がよく稼働する Sparc では,整数の 0 除算も浮動小数点例外として処理していて,Linux は i386 への実装の際,できるだけ近い実装となるようにした」
(以下 2007 年 2 月 3 日に加筆)
上記の推測が正しいのかどうかは未だに謎なのですが,たまたま見つけた Wikipedia の SIGFPE という項目には以下の記述があります.
SIGFPE is the signal sent to computer programs that perform erroneous arithmetic operations on POSIX compliant platforms.
これを読む限りでは,別に浮動小数点演算に限らず,一般の算術演算に対して SIGFPE が発生するようです.また,SIGFPE の語源についても以下の通りに書いてあります.
Although SIGFPE does not necessarily involve floating-point arithmetic, there is no way to change its name without breaking backward compatibility.
昔に SIGFPE と名付け,今はその名前を変更できないというのは分かりましたが,昔のコンピュータでは SIGFPE が浮動小数点専用だったのかどうたまでは謎のままです.
当時,私がこの文書(加筆前のものです)を書いているときは,不正な浮動小数点演算で SIGFPE を発生させる方法を知りませんでした.が,ちゃんと方法があります.
Tips for the Numerical Computation using GNU/Linux にあるように,feenableexcept() を使用することで,不正な浮動小数点演算時に SIGFPE が発生するようになります.これを踏まえてこの文書の先頭にあるコードを書き直すと次の通りになります.
#include <iostream>
#include <fenv.h>
int main()
{
feenableexcept(FE_DIVBYZERO);
std::cout << 10.0 / 0.0 << std::endl;
return 0;
}
上記のソースコードをコンパイルして実行すると,きちんと浮動小数点演算の 0 除算に対して SIGFPE が発生します.
% g++ test.cc test.cc: In function `int main()': test.cc:6: 警告: division by zero in `1.0e+1 / 0.' % ./a.out zsh: 7083 floating point exception ./a.out %
September 24, 2004
[雑記] 「リポビタン D」のコマーシャル
タウリン 1000mg 配合
が売り文句ですが,単位を変えると「タウリン 1g 配合」になります.これではちょっと売れ行きに影響が出そうですね.
September 20, 2004
[Linux] さようなら /dev
研究室のマシンで sudo yum update を実行し,アップデート完了の後再起動すると... Linux が起動途中で固まります.
どうやら /dev のファイルがふっ飛んでしまったようです.
MAKEDEV コマンドでデバイススペシャルファイルを作成できるということで,急遽 KNOPPIX を起動し,mount -t ext3 /dev/hda1 /mnt/hda1 としてから MAKEDEV を実行しました.
実行しようとした MAKEDEV は,KNOPPIX に含まれていたものではなく,/dev/hda1 内の Fedora Core 3 test 1 に含まれているバージョンです.
それが災いして,libselinux.so.1 がリンクできない,と ld-linux.so.2 がお怒りに.
ライブラリの参照を解決し,MAKEDEV を実行するも,デバイススペシャルファイルが作成されません.あれぇ.
それから数時間が経過し... mknod で /dev/console, /dev/hda, /dev/hda1, /dev/fd0, /dev/fb0, /dev/ram0 等,一部のデバイススペシャルファイルを手動で作成してみました.
なんとか Fedora Core 3 test 1 はシングルユーザモードで起動するようになりました.しかし,これでは使いものになりません.
ダメもとで KNOPPIX に付属する MAKEDEV を使ってみようと思い,KNOPPIX を起動後,/dev/hda1 をマウントし,cp /dev/MAKEDEV /mnt/hda1/dev/MAKEDEV として再起動.すると...
なんと,Fedora Core 3 test 1 の起動時,自動的にデバイススペシャルファイルが作成されているではありませんか!
どうやら起動スクリプトで /dev/MAKEDEV を自動実行するようになっていたようです.知りませんでした.自分で実行する必要はない,ということですね... 一つ勉強になりました.
September 17, 2004
[映画] Today's Movie
「Godzilla」です.
漂着したのは日本の漁船,と言っていたのですが... その積荷であろう缶詰の文字はハングルですね.
時速 150 km でも追いつきません!
速っ!
本当の悪人はあの市長だ!(笑)
単なる怪獣退治だけの映画ではなく,色々な組織・人物がそれぞれ並行して動いている,というのが Good です.
見た目が全然違う,という点は私にとっては関係ありません.どちらもれっきとした一つの作品です.
[C++] C++ 例外の怪
エラー処理を C++ の例外を用いて次のような感じで記述したところ... catch されずにそのまま abort しました.
使用したコンパイラは gcc 3.4.1 です.
#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
try
{
cout << "throw" << endl;
throw;
}
catch (...)
{
cout << "caught" << endl;
}
return 0;
}
catch (...)
とすることで,あらゆる種類の例外を捕捉できると記憶していたのですが...
次のように記述することで,正しく捕捉されました.
#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
try
{
cout << "throw" << endl;
throw 1;
}
catch (int)
{
cout << "caught" << endl;
}
return 0;
}
throw には式を与えるようにします.
なお,次のコードで発生させた floating point 例外は捕捉されませんでした.
#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
try
{
cout << "throw" << endl;
cout << 10 / 0 << endl;
}
catch (...)
{
cout << "caught" << endl;
}
return 0;
}
% ./a.out throw zsh: 20268 floating point exception ./a.out %
何なんでしょうね.
[雑記] 変な夢でした...
45 分間の睡眠中,私は oohashi が自分のデータを吹っ飛ばして絶叫している夢を見ました.
September 16, 2004
[HTML] ちょっと点滅しすぎのような気が
The Powerpuff Girls の検索でヒットしたリソース の内容を Mozilla Firefox で見てびっくり.本文が点滅しているのです.
「</blink> の書き忘れか」と思い,ソースを眺めると... しっかり本文が点滅するように囲んでいます.あちゃ.
このリソース,属性が name="generator" content="Microsoft FrontPage 4.0" である meta 要素を含んでいます.製品の FrontPage は IE でレンダリングされない blink 要素を入れられたんですね... ちょっとびっくり.
でも,後から書き加えたってことも十分ありえますね.
September 15, 2004
[Windows] MPlayer インストール
MPlayer のサイトから,MinGW でコンパイルされたバイナリファイルが入手可能でした.Codec と共に入手して,解凍してみました.確かに MPlayer.exe が入っています.
手近な Mpeg ファイルを突っ込んでみますと... きちんと再生されました.Real Media のファイルも... OK です.
[雑記] CVS による管理 + シェルスクリプト
例によってやってみました.RCS の $Date$ から,シェルスクリプトを用いた更新日時自動更新を行うようになりました.
これで今まで通り,最終更新時刻が JST で記載されます.
[雑記] あれ... ということは Apache も更新された?
Apache 2.0.50 に更新されていました.2004 年 9 月 14 日 16 時 47 分に更新されたようです.めでたしめでたし.
last を実行すると,その時間にリブートしています.またサーバが落ちたようです.
September 13, 2004
[雑記] それにしても...
ニンテンドー DS の特徴としてワイヤレス
というのもありますね.次のように書いてあります.
保証到達距離は約10メートルですが、状況によってはさらに広がります。
「が」を用いているので変な感じがします.私は既におヒゲ様に洗脳されているようです.
さらに,同リソースの次の部分.
ゲームソフトによっては、ワイヤレス通信を使ってデータのやり取りを行うことで、1本しかゲームソフトがなくても多人数での対戦プレイが楽しめるようになります。通信を使って複数のプレイヤーにゲームソフトの"お試しプレイ"を体験してもらうこともできるでしょう。
1 人が買えばいい,というふうに読み取ることができます.ゲームソフトの販売利益は諦めたのでしょうか... もしかすると,ゲームソフトを持っていない通信相手の人は本当にお試しプレイ
しかできない,ということなのでしょうか.
[雑記] ん...
はっ,明日はゼミなのに! こんなことをしている場合ではない!
[雑記] 大量のデータを取っていると...
卒研で大量のシミュレーションプログラムを動かして,大量のデータをグラフにまとめようとシェルスクリプトを書いていると... 自分が何をグラフにするのかを忘れてしまうことがあります.
それにしても,シェルスクリプトって本当に便利ですよね〜
[雑記] RCS の $Date$ による更新日時自動更新
更新日時の更新が楽になりました.RCS 形式の表示になりましたので,多少見づらくなりましたが...
September 12, 2004
[雑記] リダイレクトと bash の for ステートメントの悲劇
本日 18 時 30 分,当サイトのリソースの文字列を置換しようとして... やってしまいました.全リソース 0 バイト! どうやって復旧しましょう.サイトトップだけは復元できましたが... それ以外のリソースは,研究室で使っていた Firefox のキャッシュには残っていませんでした.また CVS 導入でしょうか?
21 時 03 分,自室の Internet Explorer のキャッシュから vikey 以外のリソースは復活させました.
[HTML] HTML 4.01 Strict で物理マークアップ
物理マークアップは一切 HTML 4.01 Strict ではできないと思っておりましたが,今 HTML 4.01 Strict DTD を参照すると,TT, I, B, BIG, SMALL 要素は使用可能であることが分かりました.HTML 4.01 は現状に即しつつという目的があるので,バッサリ廃止というわけには行かなかったのでしょう.互換性は Transitional で確保しているだけに,Strict に入っていたのがちょっと残念でした.
[雑記] CORPSE PARTY の BGM
MAO さんのサイトで「CORPSE PARTY」の BGM をダウンロードできるようです.いいですね.懐かしいです.
September 10, 2004
[雑記] コープスパーティーの曲を聴き直す
昔,RPG ツクール Dante98 で作成された「コープスパーティー(CORPSE PARTY)」というゲームがありました.何気にふと思い出したので,ソフコンの CD トラック部に収録されていた曲を聞いてみたり.あれはやっぱり忘れられないゲームです.確か今でも「Dante98 for Windows」を使えばプレイ可能なはずです.
google でぶらぶらしていると,自作の MIDI をダウンロードできるリソースが見つかりました.Dante98 2 作品「FLORA」の MIDI も 1 つありますね.
September 9, 2004
[Windows] Windows XP SP2 の DEP 機能はもっと昔から作れたはず
研究室のノートマシンに Windows XP Service Pack 2 をインストールしてみました.何やら DEP なるものがインストールされたようです.
DEP とは,データ領域としてマークされたメモリの内容をコードとして実行しないようにする機能です.
AMD64, IA-64 アーキテクチャのプロセッサ,Prescott コアの Pentium 4,Pentium M プロセッサは,メモリのデータがコードかデータかをページ単位で設定することが可能(NX-bit を利用する)で,Windows XP SP2 のハードウェア DEP 機能は,それを利用しています.
ちなみに,今回 SP2 をインストールしたマシンは Celeron プロセッサでしたので,ハードウェア DEP 機能を利用することはできませんでした.
ここで私はふと疑問に思ったわけです.「IA-32 アーキテクチャはデータセグメントのデータを実行することはできないんじゃなかったっけ?」と.なお,ここから先は一般的な話ではありません.
調べたところ,IA-32 インテル(R) アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ および IA-32 インテル(R) アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 下巻:システム・プログラミング・ガイド に,次の事柄が明記されています.
命令フェッチは,コード・セグメントから実行しなければならない.
CS レジスタには,コード・セグメントのセレクタだけをロードすることができる.
命令は,実行可能セグメントに書き込むことはできない.
つまり,IA-32 アーキテクチャではデータセグメントのメモリデータをコードとして実行することはできないようになっていますし,プログラムからコードセグメントのデータを変更することも不可能なのです.
このように,プロセッサの仕様を見ると,セグメント機構によるハードウェア DEP が実現できそうな気がしますが,Windows XP SP2 ではページング機構によるハードウェア DEP のみを利用しています.これから 64 ビットのプロセッサに移行するので,32 ビットの世界を切り捨てて(コードを書くのが面倒?)しまおうということなのでしょうか? あるいは,DEP 機能を 64 ビットプロセッサのメリットとして売り出させて欲しいと,Intel から Microsoft への要望があったのでしょうか?
ところで,IA-32 アーキテクチャではデータセグメントのデータをコードとして実行できないと書きましたが,それなら何故 Windows のアプリケーションではバッファオーバーランが起こるのでしょう.
これに対して私は,Windows が外部プログラムに対して,同じリニアアドレスから開始し,属性(コード/データ)だけが異なる 2 つの異なるセグメントセレクタをそれぞれ CS と DS(=SS) にロードしているからだと考えています.Windows が IA-32 の提供するセグメント機構をフル活用していないのです.現行のアプリケーションで最も利用されているフラットモデル(昔でいうスモールモデル)はそういうメモリモデルなのですが,完全にコードとデータを切り離したメモリモデルを新たに作っていれば,バッファオーバーランは起こらなかったのでしょう.何だか勿体ない話ですね.
September 8, 2004
[雑記] 「ミーハー」の定義 (番外編)
September 7, 2004
[雑記] 世代のギャップと言葉の変化
ところで近頃,「現代の若者が使う言葉はけしからん」という批判の声があります.どうやらそれ相応の年齢と地位を持つ人が仰っているようです.確かに,最近生まれた言葉の中には,私が聞いても意味が理解できないものもあります.しかし,そこで批判しても仕方がありません.言葉とは,時代と共に新しく生まれ,そして時代と共に消えるものです.今テレビに出演して批判をしている人に言いたいですね.「あなたの若いころはどうでしたか?」と.
もっとも,登場人物の間に世代のギャップがある場や,正式な場ではもっと平易な日本語で会話しましょう,という意見には賛成です.
[雑記] 「ミーハー」の定義
ふと頭に浮かんだ単語「ミーハー」の定義を goo 国語辞典で調べると,「みいちゃんはあちゃんの略」とあります.そしてみいちゃんはあちゃんの由来を語源由来辞典で調べると,次のように記されていました.
みいちゃんはあちゃんは、「みよちゃん」や「はなちゃん」など、昔の女の子の名前の頭文字に「み」や「は」が多かったためとされる。
外国語とは思っていませんでしたが,まさか「みいはあ」だったとは...
[Linux] seq コマンドの存在を知る
卒研でシミュレーションをやってると,パラメータの変更をして再度実験,という作業を何度も行います.こんなとき私はシェルスクリプトを書くわけです.
例えば,「パラメータを 0 から 10 まで 1 ずつ増やしてコマンド hoge を実行」という場合に,私が今までに書くスクリプトは次のようなものです.
#!/bin/bash p=0 while [ $p -le 10 ]; do hoge $p; p=`expr $p + 1`; done
さて,これだけでも十分面倒でしたが,これが浮動小数点(例えば,0.0 から 1.0 まで 0.1 ずつ増加)になると... 私は次のように書いていました.
#!/bin/bash p=0.0 c=0 while [ $c -le 10 ]; do hoge $p; p=`echo "$p + 0.1" | bc -l | sed 's/^\./0\./'` c=`expr $c + 1`; done
expr コマンドと [ (test) コマンドは整数の比較しかできないので,整数のループカウンタ c を別途用意しています.そして,浮動小数点の加算は bc コマンドに行わせます.さらに,bc コマンドは計算結果の整数部が 0 の場合に ".3" といった出力をするので,sed コマンドを用いて "0.3" になるよう,頭に 0 を追加しています.
私が悲惨なシェルスクリプトを書いていたのは分かりましたね? それでは本題です.
こんな努力をしなくてすむコマンドを見つけてしまいました.seq コマンドです.
次のように入力するだけで,簡単に数列が生成できます.
% seq 0 1 10 0 1 2 3 4 5 6 7 8 9 10 %
嬉しいことに,浮動小数点数にも対応しています.
% seq 0 0.1 1.0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 %
あとはこれを for 文に食わせるだけです! これで私は変なシェルスクリプトを書かずに済みます.
September 4, 2004
[映画] Today's Movie
はい,本日も映画の時間がやってまいりました.今日は「バイオハザード(英題: Resident Evil)」です.
前に観たんですけどね.何度でも観ます.映画は回数を重ねる度に面白みが増します.
しっかし恐ろしいですね.そこら中に security camera があるんですよ.プライバシーもへったくれもあったもんじゃない(笑)
映画に出てくる武器ってのは大抵決まってます.Starwars,SST,BR のようにオリジナルにデザインされたものもありますけど.
まあ,みなさんは Hive のコンソール(?)まで頑張って歩いたわけですが,リモートで接続できればよかったんですけどね.機密施設なのでどこにも接続されてなかったのかしら?
しかしそうすると,この施設の異常にも気づかれず,S.T.A.R.S の皆さんも来ないわけでして... うーむ.
上層部のお偉方が Hive に向かって "Fire in the hole!" と叫べば... この映画も 2 分くらいに仕上がっていたことでしょう.
続編「Resident Evil: Apocalypse」も TV で放送があった暁には,もちろん観るんじゃないですか.予告編を観てると,Tomb Raider に似てるなー,なんて思ったり.
September 3, 2004
[雑記] 高校生クイズ
高校生クイズやってますね... いやぁ,改めて問題を見てると,別に高校生じゃなくてもええんちゃうかなー なんて思ってしまうワケですよ.
例えば「技科大生クイズ」というのはどうでしょう.出場校は 2 校.開始後即決勝戦.開始して 1 分で終了... ちょっと物足りませんね.
では,「高専生クイズ」を考えると... これは全国大会になりそうですね.いい感じです.スポンサーは NEC とか IBM でしょうか.そして,出題される問題は一般ウケしないこと間違いなし!(一般ウケする問題は解けない可能性が高いのです)
そんなこんなで,テレビは「高校生に立ちはだかる知の壁」ということで,高校生の憧れの職業「大学教授(大槻義彦),政治家(平沢勝栄),弁護士(橋本徹)」の人がそれぞれ出演しているわけですが... 政治家と弁護士って高校生の憧れなんでしょうかねぇ.
September 1, 2004
[Cygwin] Cygwin 上でのプログラムの起動が遅い原因
私は Cygwin をいつも愛用しているわけですが,1 つだけ気になっていることがありました.
何故かプログラムの起動が遅いのです.一旦起動すれば普通に動くのですが,起動に 5 秒くらい時間が掛かります.
さっと調べても原因らしい原因が分からなかったので,仕方なく 2 週間程前からこんな状態で使っていましたが,ついに我慢の限界に達しました.というわけで原因の究明とその排除です.
strace で追いかけるも不明.シェル zsh 上ではなく,シェル cmd 上から起動すると速いんです.
「環境変数 PATH が長いのかな?」と思いました(私は Cygwin から Visual C++ や C# のコンパイラをよく使うので,cl.exe や link.exe のあるディレクトリへのパス等を追加しています).というわけで,開発環境へのパスを取り除いてみました.
... 結果は変わりませんでした.
PATH の内容をいろいろ弄っていると,ふと目に付いた部分がありました.それは,PATH に /cygdrive/c/WINDOWS/system32 を追加している部分です.
「そういえば system32 ディレクトリには多数の実行ファイルがあるのよねー...」「これ消したら動くんちゃうかな」
消すと起動が速くなりました.なんということでしょう.Cygwin は自前で実行ファイルを検索しているのでしょうか.