Skip to main content

ログ取得ツール

信用できない計算機の話

なぜバグがなくならないのか。そこにはいろんな原因があるんだけど…という話をしよう。今回は一言で言えば、計算機がバカだから、という理由。 世の中に、浮動小数点数を信用していない人は多くいると思うけど、実は整数演算も信用できるものではない。 #include int main(int argc, char **argv) { unsigned int a=10,b=20; unsigned int c; c=a-b; printf(“d: %d-%d=%d\n”, a,b,c); printf(“u: %u-%u=%u\n”, a,b,c); if(c > 3){ printf(“yes1! %u > 3\n”, c); } if(a-b > 3){ printf(“yes2! %u-%u > 3\n”, a, b); } return 0; } gcc -Wallでワーニングもなく粛々とコンパイルされたその麗しき実行ファイルは、以下のような出力をしてくれる。別に不思議なことは何も…ない!? d: 10-20=-10 u: 10-20=4294967286 yes1! 4294967286 > 3 yes2! 10-20 > 3 10-20 > 3なのだ。奴等はそう信じているのだ。整数はダメ! 疑え! ダウトだ! これだから計算機というものは信用できない(笑)。 実際にあった失敗例としては、タイムアウトを判定するときに時刻情報をunsignedな整数で定義していて、時刻情報同士で引き算をして比較する。でもって何かの拍子に時刻が狂うと(例えばntpはこういうことをけっこうする)、いきなりタイムアウトが発生してしまう。ntpが時刻を戻すときって、逆転しないように徐々に進みを遅くしていくって話を昔聞いたんだけどなぁ。そういうのは特別な設定だけなのかもしれない。 というわけで、「time_tを64bitにする前にとりあえずunsignedにして延命しよう」なんてバカな考えには賛同できない。人類の英知を持ってすれば、2038年までなら64bitにできるはずだ(地球では2038年1月19日にtime()==0x7fffffffを迎える)。 まあ、要はunsignedなんて使うなアホってな話になるだけなんだけど(笑)。なんでも「負の数はありえない=unsigned」だと思っていると、まんまと騙される。ファイルサイズとか。配列の長さとか。とにかくunsignedは使うな。っていうかむしろコンパイラがはやくunsignedを禁止するのがよろしかろう。若者よ、あんなのしょせんはゴマカシなのだ。はやく目を覚ませ(笑)。 賢い人は、size_tがunsignedなのを見て、バカばっかだな、と思うことだろう。size_tを引き算したらダメだ。これ基本。sizeof(x)も引いたらダメ。strlen()の戻り値も引いたらダメ。htonl() やhtons()も引いたらダメだ。幼稚な計算機に引き算などという高等なことはできないのだ。そこが人間様との大きな違いだ(笑)。 はやくC言語に標準で無限桁の整数演算を定義してほしい。そして国会議員は一刻も早くunsignedを法律で禁止してほしい。その法律こそがバグを半分に減らす魔法の法律として永遠に語り継がれるであろう。 …なんだそりゃ。 (追記) 2004-08-20 15:58 gccはsizeof()をunsignedにしますが、例えばtcc(Tiny C Compiler)(free.fr)はsizeof()をsigned intとして扱ってくれるので、sizeof() に関してはtccと心中する気のある人は引き算しても大丈夫です。どっちが仕様に従っていないのか、あるいはどっちでもいいのかは不明です。

ケーブル

PCから出ているケーブルと言えば、キーボード、マウス、サウンド、モニタ、盗難防止ワイヤー、ネットワーク、電源といったところだろう。このうちキーボード、マウス、モニタについては「CPU切替器」なるもので切替えて使っている人が多いと思う。 ケーブルの整理という面では、KB/Mouse/VGA以外にもEtherスイッチと電源、サウンド、盗難防止ワイヤーについても切替器の機能の一部として提供してはいかがだろうか。 つまり、PCから新切替器までを統一ケーブル(単に複数のケーブルを束ねたもの)でつなげる。新切替器から先はまたKB/Mouse/VGA/スピーカーの本物やUSBハブがつながって、Etherのアップリンクや電源コンセントもつながる(これは切替えるわけではないが)。これでかなりすっきりするのではなかろうか。あ、どうせならシリアルポートもつけてもらうか。 ワイヤレスLANやワイヤレスUSB、ワイヤレスキーボード/マウスと言ったところで、ケーブルが全部なくなるわけではなさそうだし、どうせならとりあえず1本にしてほしいよね。最後にその1本をどうにか工夫してワイヤレスにすればそれでいいじゃん。 夢の切替器、もうあるのかな。あってほしいが、いまだ見たことはない。

ダビデとゴリアテ

パタパタふろん太君とジャビット人形 私は日経新聞を読んでいるが、配達は読売系の新聞屋さんがやってくれている。その読売系の新聞屋さんが契約の更新にやってきて、こともあろうにジャビット人形を置いていった。背番号はなぜか888。原前監督由来のバージョンかな。けっこうでかい。とりあえず、**“ジャビット・ジャクソン”(Google)**と名付けてみた(なんだそりゃ)。川崎の至宝、パタパタふろん太君と比べてみてほしい(右図)。

WARNING: 一応言っておきますが、私はぬいぐるみマニアではありません。

共に(?)川崎を本拠地とするプロスポーツチームではあるが、都市部では不人気の、しかし田舎ではなぜか異様な人気のある極悪金持ち大巨人軍と比べて、青黒に、ひたすらに、ぱたぱたと輝くフロンターレの美しさはどうだろうか。必然的に、おまえ、巨人のくせにオレンジかよ! と無理なツッコミを入れたくなる。 このぬいぐるみのサイズの差は、今の力の差と言ってもいいだろう。しかし、10年後にはおれらのほうが大きいサイズになっているに違いない。 ジャビット人形は友人に引き取ってもらいました。しかしこの人形、買ったら意外とけっこう高いのかもしれないなぁと思います。

雨と無知

いつの間にか雨が降ってきていたわけで。こんな日に限って天窓を開けっぱなしで出てきていたわけで。必然的に部屋はびしょ濡れなわけで。雨漏りになってないかちょっと心配な気もするな。しかも開けて出たにも関わらず、部屋は30℃を越えていたわけで。 なんかもう、どうでもいいや。今日はどこで寝ようかな。どこから拭いて、何から乾かすかを決めなければ。

メモ:Pythonで代替関数の定義

存在しないメンバを参照しようとするとAttributeError例外が出るので、単にそれを受け取って代替の関数で上書きしちゃえばいい。

try:
  get_major=os.major
  get_minor=os.major
except AttributeError:
  def get_major(x):
    return x/0x100
  def get_minor(x):
    return x%0x100
  os.major=get_major
  os.minor=get_minor

os.majorとos.minorはPython2.3から入った。2.2ではexceptの中が実行される。中身は、たぶん妥当に動く場合が多いと思うけど、もちろん保証の限りではない。 ここで軽い注意。

def os.major(x):
  return x/0x100

と直接書くことはできない(まあ、書かないとは思うけど)。 モジュールの関数の場合はmodule.func()で呼んでも第1引数はselfにならないようだ。クラスの場合はいわゆるC++でもおなじみの暗黙の第1引数ということでobj.func()は第1引数がobj(いわゆるthisとかselfとか呼ばれるモノ)になるのだが。で、classの中にクラスの外で定義したfuncを押し込むときは、引数にselfを書けばいい。 ちなみに(関係ないが)Pythonではselfは予約語ではない。

いつでも、どこでも。

ユニフォームストラップ これまでいくつかグッズを買ってきましたが、なにげに普段持ち歩くようなものを持っていないことに気づきました。というわけで、ユニフォームストラップセット(calciatore.jp)を買って、通勤用の鞄につけてみました(右図)。 これで、朝の電車の中でもそれとわかります。なかなか、よいです。これさえあれば、毎朝の通勤も少しは快適になりますね(笑)。 会社のIDカードホルダーのネックストラップにアウェイ版のものをつけたので、やはりそれとわかります。ネックストラップは元々コレ(calciatore.jp)で、最初はユニフォームのオブジェがついてたんですが、ユニフォームの部分がいつの間にか消えてしまって、なんとも空虚な状態だったのです。 ユニフォームシリーズとして、次はマグネット(calciatore.jp)が欲しいなーと思ってます。しかもこのマグネットは番号を選べる(!)ようなので、誰のにするか今から迷ってます。私としては鬼木さんが有力ですが…デフォルトは憲剛なのね。最近凄いからな。

\0

30年弱ほど生きてみて、やっぱりこの結論に至った。といきなり大きく振りかぶったわりには小さな結論だが、、、 やっぱりC言語の文字列は間違いだよ。null terminateされた文字列…間違いだよ、やっぱり。文字列が\0を含んじゃいけないのか? strlen()は暴走してもいいのか? djbあたりもそう言ってる(たぶん)。

その先には必ず人がいるということを知って欲しい

本日のお言葉。 富士通アイソテック、地元小中学生にパソコン組立教室を開催(大河原克行の「パソコン業界、東奔西走」)(impress.co.jp)より、富士通アイソテックの川勝社長の挨拶。

パソコンは生活に役立つものだが、そのパソコンの先には必ず人がいるということを知って、使いこなしてほしい

…深いな。対象が小中学生ということだが、子供がこの言葉を理解できるだろうか。あるいはいつか大人になって思い出して何かを思うのだろうか。どんなことも、そうなのだよな。世の中のどんな製品の先にも必ず人がいる。製品に限らずともそうだ。 先にいる人のことを想像できない人ってけっこう多いような気がする。

制裁

根来コミッショナー、巨人制裁の方向(asahi.com)より。

根来コミッショナーは16日の12球団代表者会議で、スカウト活動で明大の一場投手に現金を渡していた巨人に対し、コミッショナーもしくは豊蔵セ・リーグ会長から制裁金などの処分を科す可能性があることを各球団に伝えた。

制裁金でおいくら万円? という処分はあまり名案とは思えないな。ドラフトにまつわる違反なのだから、ドラフトで制裁するのが理に適っていると思う。1位と2位の指名から巨人を除外して逆指名を受けられなくするとかさ。…思ったことは、そんだけ。 別に逆指名の見返りにカネ渡しても悪いことじゃないような気もするけどね。確定申告すればそれでいいよ。少なくとも、オーナーが辞任するほど悪いことじゃない。