2012-05-14

Unixにおけるインタフェースと実装の単純さと複雑さのトレードオフ

『rootから/へのメッセージ』には、Unixには、トレードオフがある時、実装が複雑になることをいとわない、という性格がある、とある。

(Thompson の "UNIX Implementation" の紹介中で)どちらかというと、UNIX は考え方のシンプルさとは逆に、プログラムのほうはけっこう複雑である。(略)。最初に話したように、私は本来ハード屋であり、私が OS を作るとメカニズムのシンプルさを優先しがちである。(後略)
(『rootから/へのメッセージ』p. 110 )

これは後半にあるように、プロのハードウェア技術者である筆者の感覚からの評価であることに注意。別のところで、

OS のオーバーヘッド
オーバーロードになった場合、まずできることは無駄を極力排除することである。無駄には、オペレーティング・システムに起因するものと、無駄遣いがある。私自身は“オペレーティング・システムは、それが存在することそのものが悪であり、オーバーヘッド以外の何物でもない”と考えている。暴言と思われるかもしれないが、当然それらが作られた目的や効果は十分認識したうえでの発言である。(後略)
(『rootから/へのメッセージ』p. 96 )

とあり、いわゆる「リアルタイムモニタ」のようなごく軽量なシステムのシンプルさが念頭にあるものと考えられる。
一方、「The Rise of ``Worse is Better''」には、Unixは、

The New Jersey guy said that the right tradeoff has been selected in Unix-namely, implementation simplicity was more important than interface simplicity.

とある。
『rootから/へのメッセージ』の記述と相反するようにも見えるが、こちらで話題にされていたのは、ディスクからの読み書きのような、プロセスがシステムからの応答を待つようなシステムコールの実行中に中断があった場合、そこからの回復をどうするか、という話である、という点に注意が必要かもしれない。
プロセッサの設計にもよるが、たとえばユーザプログラムの側で errno を見てエラーが起きていたら再実行する、というような、面倒をユーザ側のプログラマに押し付けるような解決法以外(曰 MIT guy の主張するような、なんとかしてユーザプロセスのコンテキストを復元し、システムコールの処理をやり直すような)は、かなり実装が大変ではある(不可能な場合もあるほどに)。
(追記)なお、実際の仕様でこの話を確認すると、read や write でのブロック中にシグナルの処理が入った場合には、昔(研究所時代)の Unix や System V、初期の Linux では( http://www.coins.tsukuba.ac.jp/~syspro/2005/No5.html を参照)、ブロックを抜けて(データを読み書きしてなければ) EINTR を返す、という仕様であった。BSD では、データを読み書きしてなければ r/w 待ちのブロックにシグナルの処理後は戻る、という仕様に改良され( http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html によれば 4.3BSD から)、Linux でも現在は BSD 風の動作だという。(「Linux は SysV」とその昔は言われた、という伝説の水源の一つかもしれない)

2012-05-14

はてなブログで MathJax を利用して、MathML で数式を表示する

この記事で紹介するのは HTML の内容を書き換えるような JavaScript の導入方法ですので、何らかのトラブルを起こす可能性があります。十分に注意して実行してください(特に、過去に書いた記事中に LaTeX の数式記述が含まれていた場合、それが表示の際に書き換えられる、という副作用があります)。
MathJax は、Ajax 的な技術により、LaTeX 記法で HTML 中に書かれた数式を、ウェブブラウザで印刷物のような見た目になるよう変換してくれるツールです。詳しくは http://www.mathjax.org/ や、黒木さんによる MathJax の使い方 を参照してください。
これを、はてなブログで使う方法を紹介します。はてなダイアリーでは( JavaScript は使えませんでしたが)ヘッダやフッタとして、かなり自由に HTML のボディをいじることができましたが、はてなブログではそういった自由はあまりなくなっています。
ここでは、モジュールから JavaScript を読み込むことにします。ダッシュボードの「設定」ボタンを押すと開くメニューから、「デザイン」を選び、サイドバーで「カスタマイズ」タブを選択します。カスタマイズ項目の「サイドバー」を展開すると、「モジュールを追加」という項目がありますので、それを選択します。すると追加するモジュールを選択するダイアログが現れます。
モジュールの種類として、一番下にある「HTML」を選ぶと、内容を自由に編集できるカスタムのモジュールの編集になりますので(画像)、
f:id:metanest:20120514120518p:image
適当に名前を付けて、内容を、

<script type="text/javascript"
  src="http://cdn.mathjax.org/mathjax/1.1-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
></script>

のようにします。パス中の 1.1-latest や config=TeX-AMS-MML_HTMLorMML は、カスタマイズしたい方はマニュアルを見て適宜確認してください。また、外部から読み込むのが不安であれば、ダウンロードして自分のウェブサイトなどに置き、それを指定しましょう。
あとは本文中に \[y = ax^2 + bx + c\](←ここでは全角文字を使って変換を回避している)のように書けば、
\[y = ax^2 + bx + c\]
のように表示されるはずです。うまくいきましたか? (というかそもそもこれがうまく見えていますでしょうか?)
なお、はてなブログの編集中のプレビュー表示では変換が働きません。また、MathJax が MathML 対応のブラウザと認識できなかった場合は画像での表示になります。

2012-04-20

最近の pkgtools (portupgrade) 事情

FreeBSD の pkgtools (portupgrade) の ruby 1.9 対応版に入れ替えるとかの作業

  • まず make.conf に RUBY_VER=1.9 を書いて FreeBSDRuby 環境を 1.9 化しておく (なにをやっているのかわからない人は以下の作業も含めて、やらないように)

pkgtools (portupgrade) の最新の情報は以下のような所にある

1.9 対応してるのは portupgrade-devel のほうなので、そちらの ports を入れる
アップデート作業 (インストール) を始める前に portsnap (ないし portshaker) で ports ツリーを最新にすること (最低限 ports/ports-mgmt/portupgrade-devel/MakefileCVS リビジョンが 1.280 (Apr 20 05:44:16 2012 UTC) 以降であること)

2012-03-27

不正確例外でシグナルを発生させてみる

まず karetta の『Gaucheプログラミング(立読み版)』にある「正確数と非正確数」( http://karetta.jp/book-node/gauche-hacks/010883 )を見てください
IEEE 754 では、オペランドを正確数(浮動小数点表現ですが、厳密にその値であるとみなす)であるとした時、得られた結果が非正確であるような演算、たとえば 1.0/3.0 のような演算をしたような場合についての例外「不正確例外」を定めています
この例外は頻繁に起きるものですので、通常は FPU 内部のフラグがセットされるのみで、シグナルは発生しません。これを、C言語のコードから発生させてみます
まず、最適化避け用の、double を引数に取るダミー(printf で表示するのは printf 内部での浮動小数点処理でひっかかるため不可)

/* dummy.c */
void dummy(double _){}

C99 では、こういった浮動小数点関係の詳細も標準化されましたので、それを使います

/* sample.c */
#include <stdlib.h>

#include <fenv.h>

void dummy(double);

int
main(int argc, char *argv[])
{
  if (argc != 2) {
    exit(1);
  }
  {
    double b = (double)atoi(argv[1]);
    feenableexcept(FE_INEXACT);
    dummy(1.0 / b);
  }
  exit(0);
}

fenv.h が標準のヘッダ、feenableexcept(FE_INEXACT) によりプロセッサの例外になるように設定しています。コンパイルして実行すると以下のようになります

$ gcc -c dummy.c
$ gcc sample.c dummy.o -lm
$ ./a.out 1
$ ./a.out 2
$ ./a.out 3
Floating point exception: 8 (core dumped)
$ ./a.out 4
$ ./a.out 5
Floating point exception: 8 (core dumped)
$ ./a.out 6
Floating point exception: 8 (core dumped)
$ ./a.out 7
Floating point exception: 8 (core dumped)
$ ./a.out 8
$ ./a.out 9
Floating point exception: 8 (core dumped)
2012-02-09

油性ボールペンに関していくつか

だいぶ古いボールペンを復活させようとしてあれこれやったり検索してわかったことなど

溶剤が飛んでしまったら復活は無理

油性ボールペンの溶剤はものすごく絶妙の配合になっていて、そこらのアルコールとかペイント用溶剤とかを染み込ませたら最後、まともにボールにインクが絡まなくなります
ですので、ノック式油性ボールペンが古くなって、溶剤が揮発してしまっていたら、お湯であっためたり遠心力でインクをボールに寄せたりして、だましだまし使えるだけ使って、それでもダメなら諦めましょう

三菱ジェットストリーム

三菱重工とかの三菱とは関係ないことで知られる三菱鉛筆の「ジェットストリーム」という、新配合の油性インクのボールペンが出ていることを検索していて知りました。 http://www.nikkeibp.co.jp/style/biz/abc/forefront/080220_jetstream1/ こちらの記事によると、油性インクの改良は、それまで他に誰もやろうとしなかった、というように読めますが、検索してみると、たとえば http://www.j-tokkyo.com/1997/C09D/JP09217037.shtml という 1996 年のパイロットの特許申請が出てきます(ちなみに、配合しているポリビニルピロリドンという樹脂は、固形タイプの事務用糊の成分のようです)。いくつかのキーワードで検索してみると、さらに他社のものなど何件か出てきます。というわけで、どうやら製品レベルにまでできたのが三菱、ということのようです。検索で出てくる文房具ブログを見るに、他社が追随して出してきたものは今一歩という評のようなので、相当難しいのでしょう