tag:blogger.com,1999:blog-60240944408663261732023-06-21T14:02:23.104+09:00旧・読むために生まれAnonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-6024094440866326173.post-37129743464869459152015-08-15T12:52:00.004+09:002015-08-15T12:52:47.636+09:00移転のお知らせはてなブロクに移転しました。今後ともよろしくお願いします。<br />
<br />
<a href="http://yshigeru.hatenablog.com/">http://yshigeru.hatenablog.com/</a>Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-26183146702669203412014-09-30T09:07:00.000+09:002014-09-30T09:07:07.826+09:00明日のための仕事本日をもってミラクル・リナックスを退職する。2年半という短い間だったが、たくさんの方々にお世話になった。お礼を申し上げる。<br />
<br />
私のミラクルでの仕事を振り返ってみると、最大の貢献と言えるものはLinuxに関連することではなかった。エンジニアリングですらなかった。それは人に関連することだった。すなわち、若者の育成であった。<br />
<br />
仕事を行う者にとって、学校を卒業して最初に入る会社は重要である。最初に入った会社で、仕事を行う者としての価値観を築く。仕事のやり方を覚える。それはその人の職業人生をとおして大きな影響を与える。<br />
<br />
私は、三菱電機でエンジニアとしてのキャリアをスタートさせた。私の配属された鎌倉の古い工場は私の原点である。私はいつでもそこへ戻ることが出来る。私のエンジニアとしての精神的バックボーンは今も鎌倉の工場にある。<br />
<div>
<br /></div>
<div>
私がミラクルへ入社した年は、ミラクルが本格的に新卒採用を始めた年でもあった。ミラクルでは、驚くほど新卒を受け入れる体制ができていなかった。学校を卒業して最初に会社に入る者への責任を果たしていなかった。</div>
<div>
<br /></div>
<div>
その年入社した女性には、最初の1年は非常につらい思いをさせてしまった。先輩たちはただ見守ることすらできなかった。見守るということを知らなかった。彼女は今では立派なエンジニアに成長したが、これは100%彼女自身の努力によるものと言ってよい。</div>
<div>
<br /></div>
<div>
明らかに改善の余地があった。そこで私は、人事部門と協力して若者のメンター制度を構築することにした。これは、三菱電機で私を教育してくれた人たちへの恩返しのつもりでもあった。<br />
<br />
この制度の特徴は、若者の後見人としてのメンターと、OJTで実務を教えるプロフェッショナルとしてのトレーナーを明確に区別することにあった。若者は様々な仕事を行わなければならない。それぞれの仕事にトレーナーが存在する。しかし、仕事を行う者としての若者の成長には一貫してひとりのメンターが責任を持つ。<br />
<br />
この制度のモチベーションとしては、日々の多様な業務に流されて、ただ慌ただしく時間が過ぎ去らないようにとの配慮がある。様々な業務を行う中で、自分を見失うことなく着実に成長し、価値観を築き、精神的バックボーンを築いて欲しいとの意図である。<br />
<br />
もちろん、この制度がベストだとは思っていない。この制度はまだ時の試練を受けていない。これから何年も運用して改善していかなければならない。</div>
<div>
<br /></div>
今日の仕事を行うのは我々の責任である。しかし、明日の価値を作り、明日の仕事を行うのは若い人たちである。したがって、人材の育成はそれ自体が価値をもつ成果であると言ってよい。今日の仕事として、明日を担う若者を育成しなければならない。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-41610938979224488102014-02-23T20:19:00.001+09:002014-02-23T20:19:43.461+09:00社会人としてここ数年、私が使うのを避けている言葉がある。「社会人」がそれである。この言葉は、「社会人として〜」という使われ方をする。人が(私も人である)「社会人として〜」と言っているとき、この「社会人」とはいったい何を意味するのだろうか?<br />
<br />
「社会人」こそ無意味な思考停止キーワードである。それは、「サラリーマン」と言っているのと同じ程度の意味しか持たない。試しに、「社会人として〜」を「サラリーマンとして〜」に置換してみるがよい。その言葉があまりにも何も定義しないことに驚くだろう。<br />
<br />
「会社に遅刻をしてはいけないよ」と、私はよく上司に言われたものだ。まだ若く世間知らずだった私は、当然の疑問として「なぜ遅刻をしてはいけないか?」と問うた。上司の答えは「社会人として」だった。若者は(私も若者だった)これでは納得しない。<br />
<br />
この上司は、「遅刻をすると約束の相手の時間を無駄にすることになる。誰もが他人の時間を無駄にし始めたら、誰も仕事を行うことはできない。現に今、あなたはこうして私の時間を無駄にしている」とは言わなかった。<br />
<br />
もし、この上司がこう答えていたならば、私は追求の第二弾に出ただろう。「では、誰の時間も無駄にしないのであれば遅刻をしてもよいのか?」と。<br />
<br />
私はまだこのときの上司の年齢には及ばないが、それでも後輩を指導しなければならない立場にはなった。私も後輩から追求の第二弾を受けるかもしれない。「社会人」などという無意味な思考停止キーワードを使わないように準備しておかなければならない。<br />
<br />
こう答えよう。「そのとおりである。本当に誰の邪魔もせず、かつ仕事ができるのであれば、会社に来る必要もなく、したがって朝起きる必要も、布団から出る必要さえない」と。ただし、「あなたにはそれが出来るのか?」と付け加えることを忘れない。<br />
<br />
遅刻をした若者に注意を与えるとき、大抵の人はここまで考えてはいない。なんとなく、皆が同じ時間に会社に来ているからあなたも(そして私も)そうしなければならないという程度にしか考えていない。そういうとき、つい「社会人」という言葉を使ってしまう。<br />
<br />
他にも「社会人」という言葉が出てくる場面はたくさんある。忘れ物をするな、小奇麗にしろ、飲み会で上司にお酌をしろ云々。要注意である。これらは実に些細なことであるが、しかし人が思考停止に陥る典型的パターンである。<br />
<br />
我々は仕事を行う人間として働いている。仕事を行うことこそ使命である。我々は単なる「サラリーマン」でないのと同様に「社会人」でない。<br />
<br />
私は、まったく会社に出社せず、メールだけで仕事をしている人物を知っている。しかし、誰かが、この人物を「社会人」でないと批判しているのを聞いたことはない。その人物は確かに仕事を行うことができ、それで十分である。<br />
<br />
あと1ヶ月ほどで「新社会人」が我々の仲間に加わることとになる。企業とは、学校とはまったく違う性質を持つ組織である。彼らは、かつての私がそうだったように、最初は大いに戸惑うことだろう。その時、私は「社会人」などといういい加減なものではなく、本当に仕事を行う人間としてよき手本となりたい。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-26734137869011768432013-12-03T20:47:00.001+09:002013-12-03T20:47:51.322+09:00若いエンジニアへエンジニアなら誰でも突貫工事に喜びを見出した経験がある。深夜2時の夜食を共にした同僚のことは、その職業人生を通じて忘れることはない。しかし、そこにいかなるドラマがあろうとも、突貫工事は例外である。これを常態としてはならない。<br />
<br />
メーカーの組込みプログラマとしてエンジニアのキャリアをスタートした私は、「よい製品はよいプロセスから生まれる」ことを頭に叩きこまれた。素晴らしい製品を生み出す工場は静かである。常に誰かが大声で叫んでいるような工場には明らかにプロセス上の問題が認められ、素晴らしい製品を生むことは決してない。<br />
<br />
本物のエンジニアは突貫工事を好まない。突貫工事とはプロセス上の誤りであり、つまり誰かが大声で叫ばなければならないということだからである。エンジニアの仕事は計画され、コントロールされたものでなければならない。<br />
<br />
長時間労働によって成果を生み出そうとすることも、やはり例外としなければならない。長時間労働もプロセス上の誤りである。長時間労働とは「体力勝負」の世界であり、技術の専門家たるエンジニアの地位を貶めるものである。<br />
<br />
エンジニアの創造性を引き出すものは、長時間労働ではなく集中である。誰もが知っているように、集中とは1日18時間持続するものではない。普通の人は2, 3時間がせいぜいである。<br />
<br />
どうすればこのわずか2, 3時間の集中に入れるのかを知る者こそ本物のエンジニアである。ある人にとっては深夜や早朝かもしれない。朝メールをチェックして、お気に入りのWebサイトを見て回ったあとでないと集中できないという人もいる。<br />
<br />
かつて、NHKで「プロジェクトX」という人気番組があった。そこで紹介されるプロジェクトは、ほとんどすべてが突貫工事と長時間労働のドラマだった。視聴者に、あたかも、突貫工事と長時間労働こそが素晴らしい製品を生み出すかの誤解を与えるものであった。<br />
<br />
あの番組を見て違和感を覚えたエンジニアは多いはずだ。私が駆け出しのエンジニアの頃上司から受けたアドバイスは、あのような番組を真に受けるなということだった。メーカーを退職した今でも、私は「よい製品はよいプロセスから生まれる」というこのコンセプトが正しいと思っている。<br />
<br />
若いエンジニアには、よいプロセスは退屈に見えるかもしれない。しかし、本物のエンジニアにとっては、日々の秩序の中にこそ素晴らしいドラマがあるのである。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com1tag:blogger.com,1999:blog-6024094440866326173.post-56461257926602477292013-09-13T22:35:00.000+09:002013-09-13T22:35:14.945+09:00エンジニアのジレンマ<div>
技術は何を作ればいいかは教えてくれない。技術は如何に作ればよいかを教えるのみである。世界で最も優れたエンジニアとは、何を作ればいいか教えてくれれば何でも作ってみせると約束する者である。</div>
<div>
<br /></div>
<div>
優れた技術を持つはずのエンジニアが、精巧なゴミを作り続ける理由はここにある。今日のゴミはWebインタフェースを持ち、明日はAndroidアプリとなる。だが、どんなにキラキラかがやいていようと、どんなにフワフワしたおまけが付いていようと、ゴミはゴミである。<br />
<br />
皮肉なことに、優秀なエンジニアは、自分の作っているものがゴミだと知っている。単に、ゴミ以外に何を作ればいいか知らないのだ。エンジニアのジレンマである。<br />
<br />
技術とは如何に作るかについての知識である。知識とは形式化され体系化され教育によって学ぶことができるものである。技術と教育システムの発達した現代においては、教育によって優秀なエンジニアを育てることができるようになった。<br />
<br />
現代に欠けているのは、何を作るかについての知識である。その知識を学んでさえいれば、系統的プロセスによって何を作ればいいか発見できるというようなものが必要とされている。そのような知識を手にすれば、エンジニアのジレンマを解決できるはずである。<br />
<br />
MOT(Management of Technology)と呼ばれているものがそうかもしれない。少なくともそういうものを目指しているのだろう。しかし、現時点では、自信を持ってそうであると言うことはできない。MOTにはまだ実績が乏しい。<br />
<br />
知識に頼ることができないということは、現場のエンジニアが自分で考えるしかないといいうことである。経験から学ぶしかないということである。<br />
<br />
古代ギリシアのアルキメデスは、まさに典型的エンジニアだった。彼は、支点さえ与えられれば地球をも持ち上げてみせると約束した。だが、結局アルキメデスが地球を持ち上げることはなかった。アルキメデスはどこに支点を置けばいいか知らなかった。<br />
<br />
技術とはてこの原理であり、何を作るかということはてこの支点である。支点なくしては、意味ある作用を及ぼすことはできない。現代のアルキメデスは、てこの原理よりはるかに進んだ技術を持ちつつも、支点を知らないがために本当に意味あるものを生み出せないでいる。<br />
<br />
優秀なエンジニアは如何に作ればいいか知っている。しかし、エンジニアの評価は、知識の量によって計られるものではない。どれだけ価値あるものを生み出したかによって計られる。エンジニアとは社会を豊かにする存在であるはずだ。<br />
<br />
エンジニアは技術を学ぶことに満足してはいけない。技術を学ぶと同時に、どこに支点を置けばいいか考えなければならない。おそらく、アルキメデスはどこに支点を置けば地球を持ち上げることができるか考えたのではないか。実験もしたかもしれない。良い結果は残せなかった。しかし、アルキメデスを笑うことはできない。</div>
Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-36882972653872669622013-05-25T13:58:00.000+09:002013-06-19T22:00:53.478+09:00Microsoftに捧ぐ理論的にはソフトウェアが壊れるということはない。長く使っているうちにビットがすり減ってしまうということはあり得ない。何かがうまく動かないのは、はじめから壊れていたのだ。それにも関わらず、世界中のプログラマが、ソフトウェアが壊れていくさまを目撃する。昨日までうまく動いていたものが、今日はコアを吐く。<br />
<br />
バグを見つけたら修正しなければならない。しかし、そのバグフィックス自体が、新たなバグを持ち込む可能性がある。したがって、ソフトウェアにはメンテナンスが必要である。このメンテナンスには終わりはない。ソフトウェアは「リリースしたら終わり」の製品ではない。<br />
<br />
ソフトウェアベンダーは植木屋と同じである。植木屋は、植木を「リリースしたら終わり」ではない。何十年、ときには何百年も成長し続けるという植物の性質上、植木にも終わりのないメンテナンスが必要である。この点では、日本の植木職人もヨーロッパの庭師も同じである。<br />
<br />
Microsoftこそ真の植木職人である。あるいは庭師である。来年には、Windows XPのサポートが終わる。Microsoftは、2001年発売のWindows XPを実に13年間メンテナンスし続けたことになる。変化の早いソフトウェアの世界での13年は、植物の世界では300年にも400年にも相当する。<br />
<br />
私のLinuxエンジニアとしての仕事も、まさしく植木職人のそれである。Linuxカーネルは、日々成長する巨大な論理の植物である。日々の成長は小さくとも、月日の流れの中でダイナミックに成長する。私は植木職人として、あちこちにパッチを当て、Linuxカーネルの剪定を行う。<br />
<br />
先日、カーネル2.6.9についての問い合わせを受けた。ファイルシステムのバグを踏んだかどうか調べて欲しいというものだった。さっそくカーネル2.6.9で現象が再現するかどうか調べようとした。驚いたことに、最新のgccでは、もはやカーネル2.6.9をビルドすることができなくなっていた。カーネル2.6.9のリリースは2004年である。<br />
<br />
MicrosoftはWindowsのすべてをコントロールできる立場にあるので、長期間のメンテナンスを行いやすいのかもしれない。そうだとしても13年は尊敬に値する。<br />
<br />
業界のもう一人の巨人であるAppleはどうか? OS Xのサポートを数年で打ち切ってしまうのは、花屋が切り花を売るのと同じである。切り花は、買ってから1週間はその美しさを楽しむことができる。しかしその後は、次の花に取って代わられる。Appleの花は常に美しいが、それは去年の花ではない。<br />
<br />
90年代はMicrosoftの天下だった。しかし、ここ最近はMicrosoftを侮る声が多く聞こえる。Microsoftの製品は、Windows XPの背景のように何の変哲もない芝生に見えるかもしれない。しかし、何の変哲もない芝生はよく手入れされた芝生である。芝生には2種類しかない。よく手入れされた何の変哲もない芝生か、手入れのされていない茶色い枯れた芝生かである。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-59472327953937983102013-02-17T18:57:00.000+09:002013-02-17T18:57:29.137+09:00『Operating System Design: The Xinu Approach, Linksys Version』を読んだ<div>
<div>
実際のOSのソースコードを示して解説する教科書といえば、TanenbaumのMINIXが有名である。本書は、Dougras ComerによるXINUというOSにつての同様の趣旨の本である。このような本があるという事は、以前から知ってはいた:</div>
</div>
<div>
<blockquote class="tr_bq">
XINU("XINU is Not UNIX"の略)オペレーティングシステムの開発について述べた優れた本。<中略>この本はオペレーティングシステム概論の授業の副読本としてうってつけで、UNIXカーネルの授業でLionsのテキストと一緒に使っても良いくらいだ。(『Life with UNIX』p.127) </blockquote>
この記述は本書の初版本に関するもので、LSI 11というPDP-11をワンチップ化したハードウェアを対象に書かれたものである。Amazonで調べてみると、本書はその後、PC版やMac版が出ていたようである。しかし、長いこと絶版となっていた。<br />
<br />
ところが最近、Linksys(今はCISCO?)のEL 2100LというというMIPSアーキテクチャのルータ向けに書き直された版が出ていることを知った。このルータを選んだ理由として、安価で入手しやすいことと、シリアルを備えていることが本書で述べられている。日本だと、「ブロードバンドルータ」と言って家電量販店で2万円くらいで売られている類のものではないかと思う。<br />
<br />
XINUは組込みOSとされている。今や組込み機器でもLinuxやBSDが動く時代なのでその定義は曖昧であるが、例えばMINIXと比較すると、以下の特徴がある:<br />
<br />
<ul>
<li>ユーザモードとカーネルモードを区別しない</li>
<li>システムコールは普通の関数呼び出し(ただし割り込みは禁止)</li>
<li>アプリケーションはカーネルと一緒にリンクされる</li>
</ul>
<br />
MINIX本では後ろ半分に付録としてソースコードを載せていたが、本書は関数1つ毎に解説とソースコードが交互に記載されている。したがって、MINIX本のように本文とソースコードを行ったり来たりする必要はない。シーケンシャルに読める。また、小さいながらもUDP/IPプロトコルスタックも実装されている。<br />
<br />
本書を読んだ感想だが、OSというのは、本当にまったく単なる巨大なCプログラムに過ぎない。これは、MINIX本を読んだときにも感じたことである。XINUの実装を読むことで、更にその思いを強くした。<br />
<br />
かつては、OSには何か魔法のようなものがあると思っていた。並行プロセスやファイルシステムなど、まさに現代の魔法だった。しかし、その実装を見てみれば、何の魔法もないのだ。アーキテクチャに関わるところも、割り込み処理とブートストラップの一部だけである。そして、OSの実装言語としてのCのスジの良さ。実行環境としてスタックさえ準備してやれば、後はおなじみのCの世界である。<br />
<br />
『Life with UNIX』にもある通り、本書はOSの授業の副読本として最適だと思う。例えば、アーキテクチャはパタヘネでMIPSを学べば、本書のアーキテクチャ依存部分もよくわかるだろう。<br />
<br />
大人になってから、「学生時代にこの本を読んでいたら、違った未来になっていたかも」と思わせる本に出会うことがある。本書もそのひとつだ。OSに魔法などない。<br />
<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=143988109X" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4756107834" style="height: 240px; width: 120px;"></iframe>
<br />
</div>
Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-33619176988062522822013-02-10T23:01:00.000+09:002013-02-10T23:01:11.801+09:00忍び寄る全体主義私が三菱電機を辞めた理由のひとつは、組織のもつ全体主義的傾向を嫌ってのことだった。全体主義とは、皆が同じ考えをもつことではない。そんなことは不可能だ。全体主義とは、皆が同じ考えをもつことを強制することである。従って、全体主義のもとでは、人は皆と同じ考えを持っているふりをするようになる。<br />
<br />
ひとつ象徴的な例がある。私のいた事業所では、改善活動が行われていた。いわゆる「カイゼン」活動である。製造業なら、どこでもやっていると思う。職員全員について、改善のノルマが課せられていた。技術者も、事務職員も、現場の職人も例外は認められない。通常は1月に1件以上だった。<br />
<br />
どういうわけか、改善の効果は、節約時間によって計られることになっていた。そして、年度ごとにトータルの節約時間が定められ、各セクションにその時間が割り当てられた。この時間は最低の基準とされた。<br />
<br />
誰の目から見ても、この改善活動は馬鹿げていた。一人毎月数十時間を節約する方法を考えだすことは、不可能とは言わないまでも、通常業務の中でできることではなかった。その結果どうなったか? 皆、改善したふりをするようになった。<br />
<br />
ソフトウェアのセクションでは、単体テストの自動化などはよく使われる手だった。単体テストを自動化したふりをして、時間と品質を改善したことにするのだ。嘘の報告をしているのではない。実際にテストは自動化されている。ただし、その効果を見積もるところで「ふりをする」。<br />
<br />
年度末に提出する報告書の上では、莫大な時間が節約されているはずだった。毎年のようにテストが自動化され、このままではテストの工数がマイナスになるのではないかと思われるほどだった。しかし、皆、本当は何も改善されていないことを知っていた。毎日残業し、デバッグする自分が一番良く知っているのだ。<br />
<br />
ちなみに、改善の内容については、一応の審査はされているようである。一度、毎月の報告書に、「陶器のマグカップから側面が魔法瓶でできているマグカップに変更することで、長時間美味しいコーヒーが飲めるようになり、作業が捗るようになった」と書いたことがある。改善の委員に、さすがにそれはダメだと言われた。<br />
<br />
私は、ここで改善活動そのものを批判したいわけではない。改善活動は必要だと思っている。実際、優れた改善のアイディアというものは存在する。私が批判したいのは、効果がないとわかっているのに、それに異を唱えることを許さない全体主義的な空気である。<br />
<br />
これは、三菱だけでなく、苦境に陥っている日本企業すべてに言えることではないか? かつての成功体験にしがみつき、無意味とわかっていることを続けているのではないか?<br />
<br />
<div>
まるで戦時中の日本軍のようだ。最初の神風特攻隊が成功を収めたという理由だけで、効果を挙げられなくなった後も飛行機による体当たりを続けた。(人道的問題はおいておくとしても)特攻隊の効果に疑問を呈することはタブーだった。日本軍が最終的にどうなったかは、よく知られるところである。結局、日本人のメンタリティとはこの程度のものかと思うと残念である。</div>
<br />
誰も「改善はインチキだ」とは言わない。私は言えなかった。もちろん、改善に異を唱えたからといって収容所に送られるわけではない。せいぜい、「害のない」ポジションに異動になるだけだろう。<br />
<br />
多くの大企業が大量リストラを行なっている。リストラされた人には気の毒だが、これが日本企業にとっての「終戦」になることを期待している。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com3tag:blogger.com,1999:blog-6024094440866326173.post-17562328501792479812012-12-22T15:47:00.000+09:002012-12-22T15:47:31.363+09:00LispでOSを書く(このエントリは、<a href="http://qiita.com/advent-calendar/2012/lisp">Lisp Advent Calendar 2012</a> の22日目である)<br />
<br />
ELIS復活祭のとき、ELISのTCP/IPプロトコルスタックを書いたという方とお話する機会があった。ELISのプロトコルスタックはもちろんLispで書かれていた。その方がおっしゃるには、「C言語はよい。BSDからソースコードを持ってくればいいのだから。しかし、Lispで書かれたプロトコルスタックなどなかった。自分で書くしかなかった」ということだった。それにしても、LispでOSを書くというのは、いったいどんな感じなのだろう?<br />
<br />
<span style="font-size: small;"><b><u>
OS記述言語としてのLisp</u></b></span><br />
<span style="font-size: small;"><br /></span>UnixがCで書かれて以来、OSは、伝統的にCとその派生言語で書かれることになった。BSDやLinuxを含むUnix-likeなシステムはもちろんCで書かれている。Windows NTはC++を使っている。BeOSもC++で書いたし、MacOS XはObjective-Cを使っているのかもしれない。もしかすると、IBMのメインフレームなどでは事情が異なるのかもしれない。<br />
<br />
Cとその仲間たちは、いわゆる高級言語の中でも抽象化のスペクトルのだいぶ下の方に位置している。つまり、ビットを操作するような処理が得意なのだ。だから、デバイスのレジスタを直接叩くような処理はCの得意とするところだ。<br />
<br />
OSを構成するサブシステムの中でも、プロトコルスタックやファイルシステムは、デバイスを叩くというよりは、ある種のロジックを実装するものだ。80年代から90年代にかけて研究されたマイクロカーネルでは、これらのサブシステムはユーザプロセスとして実現されていた。<br />
<br />
ソフトウェア工学の言葉を使うなら、OSのコア(マイクロカーネル)はデバイスへアクセスする「メカニズム」を提供する。上位のサブシステムは、そのデバイスをどのように使うか(例えば、ファイルシステムをどう構成するか)という「ポリシー」を実装する。<br />
<br />
複雑なロジックを実装するためには、できるだけ抽象化のレベルの高い言語を使うべきだ。そして、もっとも抽象化のレベルの高い言語(のひとつ)はLispである。したがって、OSのサブシステムも、ある部分はELISのようにLispで書いてもいいはずだ。<br />
<br />
<b><u>
FUSE + libfuse + Gauche + c-wrapper</u></b><br />
<br />
LispでOSのサブシステムを書くというのがどんな感じなのか、試してみる方法をご紹介したい。私はCommon LispよりもSchemeの方が慣れているので、Gaucheを使うことにしよう。<br />
<br />
1から新しいOSを設計するのは、楽しいかもしれないが時間もかかる。Linuxには、FUSE(Filesystem in Userspace)という、ファイルシステムをユーザ空間で実装するための仕組みがある。この仕組みを使って、Gaucheでファイルシステムを書いてみたい。<br />
<br />
FUSEにつて簡単に説明しよう。Linuxカーネルは複数のファイルシステムを持っている。ext3, ext4, btrfsなどなどだ。それぞれのファイルシステムの開発者のために、カーネルとファイルシステムとの間に標準的なインタフェースが決まっている。このインタフェースをユーザ空間からアクセスできるようにする仕組みがFUSEだ。<br />
<br />
最近のLinuxカーネルなら、FUSEは標準で組み込まれている。/dev/fuseがカーネルへのインタフェースだ。基本的には、普通のファイルアクセスのシステムコールを使って/dev/fuseを操作すればよいのだが、これをもう少し簡単に行うためのライブラリとして、libfuseがある。<br />
<br />
libfuseはCのライブラリだ。libfuseをGaucheで使うにはCへのバインディングを書けばよいのだが、もっと簡単な方法は…そう、魔法のc-wrapperである。<br />
<br />
<b><u>hellofs (The Hello Filesystem)</u></b><br />
<br />
ストレージを操作する本物のファイルシステムではなく(これは大仕事だ)、偽物のファイルシステム(Pseudo Filesystem)を実装してみる。これは、/procや/sysの一種と考えてよい。このファイルシステムは、FUSEのサンプルプログラムをほぼそのままSchemeで書きなおしたものだ(若干の手抜きをしたので、あまりいい例ではないかもしれない)。<br />
<pre>#!/usr/bin/env gosh
# hellofs.scm (The Hello Filesystem)
(use gauche.uvector)
(use c-wrapper)
(c-load "fuse.h"
:cppflags "-DFUSE_USE_VERSION=26"
:cppflags-cmd "pkg-config --cflags fuse"
:import '(fuse_operations
fuse_main_compat2
fuse_main
NULL)
)
(c-load "stdio.h")
(c-load "string.h")
(c-load "errno.h")
(c-load "fcntl.h")
(c-load-library "libfuse")
(define hello-path "/hello")
(define hello-str "Hello world!\n")
(define (hello-getattr path stbuf)
(memset stbuf 0 (c-sizeof (c-struct 'stat)))
(cond ((string=? (cast <string> path) "/")
(set! (ref stbuf 'st_mode) (logior S_IFDIR #o755))
(set! (ref stbuf 'st_nlink) 2)
0)
((string=? (cast <string> path) hello-path)
(set! (ref stbuf 'st_mode) (logior S_IFREG #o444))
(set! (ref stbuf 'st_nlink) 1)
(set! (ref stbuf 'st_size) (string-length hello-str))
0)
(else (- ENOENT))))
(define (hello-readdir path buf filler offset fi)
(if (not (string=? (cast <string> path) "/"))
(- ENOENT)
(begin (filler buf "." NULL 0)
(filler buf ".." NULL 0)
(filler buf ((#/^\/(.*)$/ hello-path) 1) NULL 0)
0)))
(define (hello-open path fi)
(if (not (string=? (cast <string> path) hello-path))
(- ENOENT)
(if (not (= (logand (ref fi 'flags) 3) O_RDONLY))
(- EACCESS)
0)))
(define (hello-read path buf size offset fi)
(memcpy buf hello-str (string-length hello-str))
(string-length hello-str))
(define hello-operators (make (c-struct 'fuse_operations)))
(set! (ref hello-operators 'getattr) hello-getattr)
(set! (ref hello-operators 'readdir) hello-readdir)
(set! (ref hello-operators 'open) hello-open)
(set! (ref hello-operators 'read) hello-read)
(define (main args)
(fuse_main (length args)
args
(ptr hello-operators)
NULL
))</string></string></string></string></pre>
マウントすると、マウントポイントにhelloというファイルが現れる。このファイルにはお馴染みの文字列が格納されている。<br />
<pre># mkdir /tmp/hello
# ./hellofs.scm /tmp/hello -d -s
...
# ls /tmp/hello
hello
# cat /tmp/hello/hello
Hello world!</pre>
マウントするときに、シングルスレッドモード(-sオプション)を指定することに注意して欲しい。libfuseは、その中で新たなスレッドを生成する。このスレッドはGaucheのスレッドではないので、この中からSchemeの関数をコールバックすることはできない。
<br />
<br />
FUSEを使ってストレージを操作するようなファイルシステムを作りたいのなら、デバイスノードを読み書きすればよい。また、ユーザ空間でできることは何でもできる。例えば、EvernoteやGoogle Driveにアクセスするようなファイルシステムを作ることもできるはずだ。<br />
<br />
<div style="text-align: center;">
* * *
</div>
<div style="text-align: center;">
<br /></div>
OSのカーネルはますます大きく複雑になっている。Unixの第6版のソースコードは、印刷したものをブリーフケースで楽に持ち歩くことができるほど小さかった。今日のLinuxのソースコードを印刷して持ち歩くことは、不可能ではないが紙の無駄である。<br />
<br />
Unix第6版の時代からプログラミング言語の世界は大きく進歩した(もちろんLispはUnix第6版の時代から存在したのだが)。ところが、今日のOS開発者は、これら進歩的プログラミング言語の恩恵に与っていない。
<br />
<br />
そろそろ、OS開発にも、次の世代のプログラミング言語を使ってもよいのではないかと思う。ELISは商業的には成功しなかった。しかし、ELISの開発過程で多くの知識が蓄積されたはずだ。(非常に失礼な言い方だが)ELISの開発者がまだ生きている今こそ、そのチャンスである(失礼しました)。
Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com1tag:blogger.com,1999:blog-6024094440866326173.post-36735598655468948202012-12-15T22:49:00.000+09:002012-12-15T22:49:53.338+09:00豊かな社会私の母校は、工学部のみの小さな単科大学だ。工学部のみの大学であっても、いわゆる一般教養の授業がある。そのための常勤の教員もいる。特に人文社会系の講義のことを、私たちは単に「社会系」と呼んでいた。<br />
<br />
私たちにとって、「社会系」の授業は悩みの種だった。これらの単位が、進級のための条件になっていたからだ。私たちは、エンジニアリングを学ぶために大学へ入った。そのために授業料も払った。確かに西洋思想史は興味深いかもしれないが、エンジニアリングとの接点を見出すことはできなかった。<br />
<br />
大人になってから、「あの時もっと勉強しておけばよかった」と思わない人はいない。私もその例に漏れない。30歳を過ぎて思うには、もっと真面目に「社会系」の勉強をしておけばよかったのである。<br />
<br />
実は、エンジニアリングと「社会系」は密接に関係していた。なぜなら、エンジニアリングとは、社会を豊かにする方法だからだ。学生時代の私は、エンジニアリングの方法論にばかり捕らわれ、その目的が見えていなかった。<br />
<br />
19世紀の経済学者は未来を悲観した。保守主義者もマルクス主義者も、産業革命の行き着く先はユートピアではないという点では意見が一致していた。しかるに、二つの世界大戦を挟み、ヨーロッパ、アメリカ、日本を含む国々には、豊かな社会が誕生した。これらの国々の共通点は、エンジニアがたくさん住んでいるということだ。<br />
<br />
失われた10年だか20年だか知らないが、日本企業が不調である。パナソニックが赤字という。シャープも赤字という。任天堂でさえ赤字という。日本の製造業は軒並み「オワコン」と言われる。どうしてしまったか?<br />
<br />
日本の製造業も、学生時代の私と同様、方法論にばかり捕らわれ、社会を豊かにするという当たり前の目的が見えなくなっているように思う。私も、ついこの間まで日本の製造業に身をおいていたのでよくわかる。もっとも、彼らが捕らわれている方法論は、経営学のそれであるようだ。<br />
<br />
何をもって社会の豊かさとするかは難しい。今年のはじめに、ロボット掃除機のルンバを買った。まるでSFの世界にいるようだった。ハインラインの『夏への扉』に出てくる家事ロボットのようだった。私の生活は豊かになった。<br />
<br />
今年ももう終わりだ。毎年、その年のテーマを設定することにしている。来年のテーマは「社会系」にしようと思っている。今年のうちに、古本屋行きを免れた教科書を発掘しなければならない。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-59429621593594551532012-12-13T18:21:00.000+09:002012-12-13T18:21:53.226+09:00『オペレーティングシステム 設計と実装 第3版』を読んだ1953年、ワトソンとクリックによりDNAの二重らせん構造が発見されたとき、生命には神がかり的なものは何もないことが明らかとなった。以来、生命をめぐる神学上の諸々の問題は、科学とエンジニアリングの問題となった。本書を読めば、読者は、オペレーティングシステムのカーネルについて同じ発見をすることになる。<br />
<br />
本書は、私の家の積読本コーナーにもう長いこと置かれていた。本書の原書が出版されたのが2005年。本書は、その翻訳として2007年に出版された。翻訳が出版されてすぐに手に入れたのだが、ずっと読めずにいた。何度か読もうと挑戦したものの、途中で挫折してしまっていた。読書会にも参加したが、途中で脱落してしまった。<br />
<br />
今回、何度目かの挑戦で、ようやく読み終えることができた。実は、この本を読むのには、少々コツがあったのだ。本書は、1000ページを超える大著である上、本の後ろ半分がソースコードという、かなり特殊な本である。<br />
<br />
本書では、カーネル、デバイスドライバ、メモリ管理、ファイルシステムのそれぞれのオペレーティングシステムのコンポーネントについて、それぞれひとつの章が割り当てられている。それぞれの章は、以下の順番で構成されている:<br />
<ol>
<li>オペレーティングシステム理論</li>
<li>MINIXによる実装の概要</li>
<li>MINIXのソースコード解説</li>
<li>ソースコード</li>
</ol>
ただし、ソースコードは、すべてまとめて本の後ろ半分に付録となっている。1と2は普通に(つまりシーケンシャルに)読むことができる。問題は、3と4を如何に読むかである。<br />
<br />
今まで私がどうやって読もうとしていたかというと、3と4を逐一対応付けながら読もうとしていた。つまり、ソースコードをちょっと読んで、該当する解説を読み、そしてまたソースコードに戻るという具合だ。<br />
<br />
この読み方は、非常にしんどい。本文とソースコードとを、頻繁に行ったり来たりしなければならないからだ。すなわち、コンテキストスイッチのオーバーヘッドが大きい。<br />
<br />
コツは、ソースコードを先に読むことだ。解説を読まずに、まず、ソースコードを読めるところまで読む。多少わからないところがあっても、本文で解説されていることを期待して、どんどん読み進む。ソースコードをある程度まとまった量(私には1ファイル分くらいが丁度よかった)読んだら、解説に目を通す。すると、自分の理解が正しかったり、あるいは間違っていたことがわかる。<br />
<br />
本書は、Linux誕生のきっかけとなった事で有名だ。しかし、オペレーティングシステムの教科書としても非常によい本である。本書の、オペレーティングシステムのソースコードを読むことで学ぶというアプローチは、オペレーティングシステムの真の姿を明らかにする。<br />
<br />
著者のTanenbaumは述べている:<br />
<blockquote class="tr_bq">
実際のOSの真の姿は、知性的な興奮に満ちたものとは程遠く、マイナーな雑用を行うコードの集まりである。しかし、このようなコードこそシステムの可用性を向上するためには非常に重要なのである。(p.637)</blockquote>
また、その少しあとで、こうも述べている:<br />
<blockquote class="tr_bq">
優れたシステムと平凡なシステムの違いは、スケジューリングアルゴリズムのすばらしさではなく、細部まで正確に仕上げる配慮にあるのである。(p.637)</blockquote>
私自身の学生時代を思い返してみると、オペレーティングシステムの授業では、スケジューリングやページングのアルゴリズムばかりが印象に残っている。そして、オペレーティングシステムとは、普通のプログラムとはどこか異なる、摩訶不思議な、何か神がかったものという印象を持ってしまっていた。<br />
<br />
ワトソンとクリック以来、生命は単なる有機化合物の塊となった。本書が明らかにしたように、オペレーティングシステムも、単なるCプログラムの塊に過ぎないのだ。<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4894717697" style="height: 240px; width: 120px;"></iframe>
Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com1tag:blogger.com,1999:blog-6024094440866326173.post-48148752371085593762012-11-17T15:39:00.000+09:002012-11-17T15:39:21.414+09:00Unixの自由TechLION vol.10に行ってきた。村井純さんのお話を聞いてきた。村井純さんといえば、Unixとインターネットを創った男だ。もう古い本だが、村井純さんは、Bachの『UNIXカーネルの設計』の翻訳者でもある。この本は、私が初めて読んだカーネルの本だ。この本でOSとは何かを学び、Unixとは何かを学んだ。今、私がLinuxの仕事をしているのも、この本のおかげだ。<br />
<br />
今や、Unixだらけだ。Linuxであり、BSDである。Solarisであり、MacOS Xである。WndowsですらPOSIX APIを備えている。IBMのメインフレームでもLinuxを使う顧客がいるという。スーパーコンピュータもそうだ。Androidもそうだ。どうしてこうなってしまったか?<br />
<br />
村井純さんが学生の頃、最初に教授に指示された仕事が、DECのPDP-11用OSであるRSX-11の逆アセンブルであったという。もちろん手作業である。村井純さんは、この作業でOSを学んだという。<br />
<br />
その後しばらくしてUnixが登場する。Unixの特徴には、ファイルによる抽象化がある。一見奇妙なfork/execモデルも特徴と言える。しかし、一番の特徴は、Cで書かれていること、そしてそのソースコードを読むことができるということだ。<br />
<br />
村井純さんがおっしゃるには、Cで書かれたUnixは遅かったという。ハードウェアベンダーがカリカリにチューンしたOSにはとてもかなわなかったという。しかし、それでもUnixを選んだ。なぜなら、Unixには自由があったからだという。<br />
<br />
あるソフトウェアが自由とはどういうことか? もっと単純で物質的な道具について、その自由を表明したら少し奇妙な印象を受けるだろう。例えば、「ハサミは自由である」と言ってみたらどうか?<br />
<br />
もちろん、ハサミは自由だ。アナタは、ハサミを使って自由に紙を切ってよい。封筒を開けるのに使ってよい。お菓子の袋を開けるのにも使ってよい。ハサミの使用目的は「切る」ことだ。ハサミが自由であるとは、アナタは何を切ってもよいということだ。もちろん、夜道で人を切りつけてはダメだ。犯罪行為は、道具に関わる自由の例外である。<br />
<br />
ソフトウェアも道具だ。Unixにもハサミと同様の自由を認めてよいはずだ。つまり、Unixの使用目的について、アナタは自由である。問題は、Unixの使用目的とは何かということだ。UnixはOSなので、OS一般の使用目的と言い換えてもよい。<br />
<br />
OSの教科書をめくると、OSには2つの機能があると書いてある。リソースの管理と、APIの提供だ。これらの機能は、アプリケーションプログラムを書きやすくするためにある。ナマのハードウェアを触るのはしんどい。<br />
<br />
したがって、OSの使用目的とは、その上でアプリケーションプログラムを書いて動作させることと言っていいだろう。つまり、アナタは、そのOSで、自由にアプリケーションを書いたり動作させてよい。<br />
<br />
どこかで何かを間違ったのだろうか? RSX-11上でアプリケーションプログラムを書いたり動作させることに関して、DECは自由を制限していたのだろうか? そんなはずはないと思う。村井純さんはどの自由のことを言ったのだろう?<br />
<br />
帰りの電車の中で、思うところがあってRaymondの『The Art of Unix Programming』を読み始めた(こういうときSafari Books Onlineは最高!!)。この本の、あるセクションのタイトルが目に止まった。それこそ、Unixに固有に認められる自由だった。すなわち、Raymondが言うことには、「Unix Is Fun to Hack」である。<br />
<br />
Unixには、アプリケーションプログラムを書いたり動作させたりするというOS一般に認められる自由の他に、ハックする自由がある。ハックの対象は、Unixのカーネルの内部まで及ぶ。つまり、Unixは中身を調べて、場合によっては改造してもいいということだ。そのためには、高級言語で書かれていたほうがいい。<br />
<br />
アプリケーションプログラマの中には、RSX-11を好む人もいただろう。Unixは遅いし、誰かのハックのおかげでクラッシュするかもしれない。しかし、多分ハッカーはUnixを好む。誰だって、RSX-11を逆アセンブルしたくはないだろうし、逆アセンブルしたとしてもRSX-11のハックは地下でやるしかない。<br />
<br />
道具に関する自由というコンセプトは、アメリカの銃規制の問題を思い起こさせる。アメリカでは合法的に銃を所持することができる。しかし、銃は犯罪にも使われるため、アメリカ人の中には銃を規制したほうがよいと考える人もいる。<br />
<br />
銃の使用目的は、何かを撃つことだ。つまり、銃の自由とは、アナタはその銃で何かを撃ってもよいということだ。もちろん、人を撃ったらダメだ。ハサミで人を切りつけては行けないのと同じだ。<br />
<br />
銃規制に反対する人は、単に銃を奪われることだけでなく、自由を奪われることを恐れているのではないかと思う。逆に賛成派は、多少の不自由を受け入れればよりより社会になるよ、と言っている。<br />
<br />
ハックする自由。なんだか当たり前の結論に至った。Richard Stallmanなんかが一生懸命主張しているのも、つまるところはハックする自由なのだろう。Linuxをはじめ、オープンソースのソフトウェアが普及したのもハックする自由があったからだ。結局みんなUnixの仲間なのだ。<br />
<br />
<table>
<tbody>
<tr>
<td><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4320025512" style="height: 240px; width: 120px;"></iframe>
</td>
<td><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=0131429019" style="height: 240px; width: 120px;"></iframe>
</td>
</tr>
</tbody></table>
Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-43285900984439514822012-05-06T18:50:00.000+09:002012-05-06T18:50:51.211+09:00リアルタイム・コンピューティングとカント主義ミラクル・リナックスに入社してちょうど3ヶ月が経った。試用期間が終わり、正式(?)に採用となった。散々遅刻したのにクビにならなかったので、ほっとしている。これからはフレックスタイムが使えるので、大いに寝坊できるとうものだ。<br />
<br />
4月末に、「実績レビュー」なるものがあった。社長以下各セクションのトップを集め、プレゼンを行い、この3ヶ月の仕事を見てもらって、継続して雇うかどうかを判断してもらおうというわけだ。これが、1時間も時間がとってあった。長い。<br />
<br />
困ってしまった。私のプレゼンのスタイルは、「瞬発力で勝負」というものであって、せいぜい15分がいいところ。そもそも、1時間もしゃべる話題がない。うっかり口を滑らせて、「Linuxでリアルタイム・コンピューティングをやりたい」と言ってしまったところ、思いの外盛り上がった。<br />
<br />
コンピューティングの世界で、「リアルタイム・コンピューティング」ほど誤解されている概念は無い。単に「レスポンスタイムが短い」という意味でリアルタイム・コンピューティングと言う人もいるし、「計算機内部の時間の流れと外部の時間の流れが同期している」という意味で言う人もいる。<br />
<br />
私が思うに、「処理のデッドラインが設定されている」というのが、リアルタイム・コンピューティングの定義だ。デッドラインとは、その間に処理が終わって欲しいという時間である。デッドラインを過ぎる(デッドラインミス)と、計算結果の意味が失われる。リアルタイム・コンピューティング技術とは、いかにしてデッドラインを守るかという技術だ。<br />
<br />
デッドラインミスが起きたときに何が起きるかはシステムによる。例えば、画像の乱れなど、一時的なパフォーマンスの低下として無視できる場合もある。飛行機の墜落や100億円の人工衛星が失われるなど、「大惨事」が起きるかも知れない。現実には、ほとんどのリアルタイム・システムは前者のグループに属する。ほとんどの場合、デッドラインミスは、単に無視できるか、上位のプロトコルでリカバリーできる。<br />
<br />
一般的に、コンピューティングの世界では、パフォーマンスとは「速さ」だ。一方、リアルタイム・コンピューティングの世界では、パフォーマンスとは、あくまでも「デッドラインの尊守」である。計算が速いこととデッドラインの尊守は矛盾する概念ではない。しかし、イコールではない。<br />
<br />
一般的なコンピューティングの世界にいる人には、この点をなかなか理解してもらえない。「リアルタイムだろうが何だろうが、速ければ文句ないだろう?」というわけだ。確かに文句はないのだが、それだけでは何か大事なものを見落としているような気がするのだ。<br />
<br />
そこで、ひとつうまい説明を思いついた。すなわち、一般的なコンピューティングは、ベンサムの「功利主義」の世界である。一方、リアルタイム・コンピューティングは、「カント主義」の世界である。<br />
<br />
功利主義やカント主義というのは、政治哲学の概念である。どうしてこんな比喩を思いついたかというと最近サンデル教授の本を読んだからなのだが、この喩えは、一般的なコンピューティングとリアルタイム・コンピューティングの違いをよく現していると思う。<br />
<br />
時代的にはベンサムのほうが古い。ベンサムの功利主義は、最大多数の最大幸福とも呼ばれる。幸福最大原理である。ベンサムは、よりよい社会のためには、「効用」を最大化せよと説いた。効用とは、社会のすべての快楽を合計し、それから社会のすべての苦痛を引き算することで得られる。<br />
<br />
ベンサムの視点でコンピューティングの世界を見てみよう。効用の定義は単純だ。効用とは「速さ」だ。すべての処理時間を合計し、それが最も短くなるようにすればよい。<br />
<br />
コンピューティングにおける功利主義的技術の例として、キャッシュメモリがある。キャッシュメモリを使用すれば、全体の処理時間を短縮できる。しかし、個々のメモリアクセスに注目するならば、キャッシュミスが発生した場合、そのメモリアクセスの処理時間はわずかに延びる。すなわち、まずキャッシュを見にいき、そこに目的とするデータが無いならば、キャッシュを無効にし、さらにメインメモリを見にいく。この一連の処理の後、レジスタにデータがロードされる。しかし、全体としては、効用(速さ)は最大化(最小化)される。<br />
<br />
さて、功利主義への批判は2つある。第1に、少数の意見が無視されることだ。第2に、そもそも論として、快楽や苦痛など人それぞれなのだから、それを「効用」なるある種のスカラー量に押しこむことができるのかということだ。<br />
<br />
カントは、「人は皆尊敬されなければならない」とした。少数の意見を無視したり、人によってバラバラの価値観をひとつの尺度に押しこむことは、人々を尊敬しないことだとした。<br />
<br />
カントの考えは難しい。尊敬とは何か? 尊敬を「デッドラインの尊守」と考えるならば、カント主義はリアルタイム・コンピューティングと似ているような気がする。少数の処理であれ、デッドラインは尊守されなければならない。プロセッサのパワーに対してタイトなデッドラインを設定する処理もあれば、余裕のあるデッドラインを設定する処理もある。いずれにせよ、デッドラインは尊守せねばならない。<br />
<br />
再びキャッシュメモリについて考える。リアルタイム・コンピューティングにおいては、キャッシュミスによってキャッシュメモリの恩恵を受けられない処理があることは、それ自体では問題としない。問題は、キャッシュミスの予測が非常に難しいため、キャッシュミスを考慮した設計ができないことだ。予期せぬキャッシュミスは、予期せぬデッドラインミスを招くかも知れない。カントの目には、キャッシュメモリは非常にリスキーだ。<br />
<br />
ベンサムもカントも理論家だ。しかし、多くの政治家は実務家である。現実の社会では、功利主義もカント主義も、どちらが優れているとは一概には言えない。実務家である政治家は、これらをうまく組み合わせ、最適のところでバランスするのである。<br />
<br />
我々プログラマも実務家である。リアルタイム・コンピューティングをやっているからといって、例えばキャッシュメモリを排除してしまうのは惜しい。タイトなデッドラインに処理を押しこむのはそれ自体一苦労だし、上にも述べたように、たまのデッドラインミスであれば許容されることが多いという現実もある。<br />
<br />
リアルタイム・コンピューティングの実務家としては、功利主義的技術とカント主義的技術をうまく組み合わせ、システムの仕様を睨みながら、最適のところでバランスするのである。<br />
<br />
<table>
<tbody>
<tr>
<td><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4150503761" style="height: 240px; width: 120px;"></iframe>
</td>
<td><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=1461406757" style="height: 240px; width: 120px;"></iframe>
</td>
</tr>
</tbody></table>
<div>
<br /></div>Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-36729559940797538312012-04-28T23:25:00.000+09:002012-04-28T23:25:14.654+09:00リアル本屋の楽しみ亀有に引っ越してきて非常に不便なのが、近くに大きな本屋がないことだ。藤沢には、駅前にジュンク堂と有隣堂があり、まさに本屋戦争の様相を呈していた。亀有だって住んでいる人の数はそれなりなのだから、もうちょっと大きな本屋があってもよさそうなものである。<br />
<br />
一時期は、本はすべてAmazonで買っていた。リアル本屋で面白そうな本を見つけても、家へ帰ってAmazonで注文していた。Amazonにはリコメンド機能があるからだ。Amazonで買い物をすればするほどリコメンド機能が賢くなる。このリコメンド機能をかなり頼りにしていた。<br />
<br />
しかし、最近、リコメンド機能などどうでもよくなってきた。要は、似たような本ばかり読んでもしょうがないのだ。読書も娯楽である。新しい知識と出会う楽しみがある。幅広い、ときには意外な本が読みたいのだ。<br />
<br />
この点において、Amazonのリコメンド機能は退屈だ。いわゆる「紙おむつとビール」理論は、売る側にとっての「意外性」であって、買う側にとっての「意外性」ではない。買う側は、そもそも、最初から紙おむつとビールを買いに来ているのである。<br />
<br />
リアル書店のいいところは、そこに人間の意思が働いていることだ。大きな本屋へ行くと、新刊書と売れ筋のコーナーの他に、様々な「フェア」が催されていることがある。<br />
<br />
例えば、「経済学の古典を読もう」みたいなフェアが開催されていて、そこにケインズの「一般理論」が置かれていたりする。非常に有名な本であるが、普通の人は読まない。そもそも、そういう本を読もうと思いつかない。しかし、そういう本が置かれていて目に入れば、読んでみようかなという気になるかも知れない。<br />
<br />
亀有に大きな本屋がないので困っていたのだが、よく考えたら神保町まで行けばいいことに気がついた。神保町は、三田線で大手町の一個隣りである。大手町までは定期で行ける。別に、希少な古本を探しているわけではないが、世界最大の古書の街なら、「意外性」に出会えること間違いない。<br />
<br />
3月末にリニューアルオープンしたばかりの、東京堂書店へ行ってみた。フロア面積としては、近くの三省堂本店などにははるかに及ばない。しかし、リアル本屋の楽しみを凝縮したような店である。1階から3階まで見て回ったら疲れてしまった。嬉しいことに、カフェが併設されている。<br />
<br />
Kindleの日本進出が近いと言われている。喜ばしいことである。しかし、そうなると、リアル本屋の存在はますます重要になる。はじめから欲しい本がわかっているのなら、人々はネットで買うだろう。リアル本屋は、「なんか面白い本はないか?」という人々に応えねばならない。そのとき、どういう本を出してくるか? 書店員の腕の見せどころだ。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com3tag:blogger.com,1999:blog-6024094440866326173.post-79042126730143695702012-03-10T20:46:00.000+09:002012-03-10T20:46:13.084+09:00技術者の倫理ミラクル・リナックスに入社して1ヶ月経った。3月からまた新しい人(NetBSDハッカー!!)が入ったので、昨日は歓迎会だった。つまりは飲み会なのだけれども、ミラクルの人たちと話していてひとつ驚いたことがある。彼らは、会社の飲み会で技術の話をするのだ。往年の親指シフトから、最新の(?)GNU Hurdまでが話題に上がった。<div>
<div>
<div>
<br /></div>
<div>
技術者には個性というものがある。強みである。もちろん、弱みともなりうる。前職の三菱電機では、マネジメント上の最大の焦点とされたものに、技術者の個性の無効化がる。無効化という言葉が過激すぎるなら、均質化と言い換えてもよい。逆に、ちょっと過激な言葉を使うならば、前職のマネジャーたちは、技術者を交換可能な標準化された部品とみなした。</div>
<div>
<br /></div>
<div>
天才的技術者がいたとする。すべての製品を彼の天才に頼っていたとする。ある朝、彼が交通事故に遭うようなことがあれば、直ちに事業は破綻する(スーパーコンピュータの父であるシーモア・クレイは交通事故で亡くなった)。したがって、天才的技術者への依存はリスクである。</div>
<div>
<br /></div>
<div>
前職のマネジャーたちは、シーモアの天才的コンピュータ設計能力のごときを利用しないという戦略によって、このリスクを回避しようとした。仕事を設計する際、シーモアの能力を最大限に引き出すようにはしなかった。シーモア以外の技術者でもできるように仕事を設計し、その仕事をシーモアに与えた。そうすれば、シーモアが交通事故に遭っても、別の技術者が引き継ぐことができる。</div>
</div>
<div>
<br /></div>
<div>
この戦略は、第1に、組織にとって不幸である。シーモアの能力が本当に価値ある製品を生み出すことができるものだとするならば、当然ながら、この戦略は価値ある製品を生み出さない。技術者の個性を無効化するということは、その組織の生み出す価値も無効化するということだ。</div>
<div>
<br /></div>
<div>
本質的に価値のない製品を売るためには、その製品があたかも価値があるかのごとく見せかけなければならない。例えば、無理な低価格化を行う。これは、多くの場合、技術者の賃金を下げる(サービス残業なども含む)ことによって行われる。一見、低価格は消費者にとってよいことのように思える。しかし、実際には、消費者はよりよい価値を得るチャンスを失っている。</div>
<div>
<br /></div>
<div>
第2に、シーモア自身にとっても不幸である。確かに、シーモアに与えられた仕事は、シーモアほどの天才をもってすれば容易にこなすことができるだろう。しかし、恐らく、シーモアは楽して稼ぐために技術者をやっているのではない。技術者なら誰もが知っていることだが、技術者は仕事そのものを報酬とみなす。自身が良い仕事をしたと思ったとき、最大の満足を得る。</div>
<div>
<br /></div>
<div>
仕事から満足を得られないならば、技術者は単に去るかもしれない(シーモア・クレイはいくつかの組織を転々としている)。もっと悪いシナリオは、技術者が、与えられた仕事に自らの能力を最適化してしまうことだ。余剰の能力を捨ててしまう。他へ移った技術者は、新しい組織で新しい価値を生み出すチャンスがある。能力を放棄した技術者は、もはやいかなる価値を生み出すこともできない。</div>
<div>
<br /></div>
<div>
今、日本企業に元気がないと言われる。なぜ、今の日本にはGoogleやAppleが生まれないのかと言われる。なぜ、日本にはこれだけ多くの企業がありながら、GoogleやAppleのような製品を生み出せないのかと言われる。</div>
<div>
<br /></div>
<div>
当然である。技術者の個性の無効化という戦略では、価値ある製品は生み出せない。技術者の個性の無効化によって、組織の産み出す価値は無効化され、技術者は能力を放棄してしまう。</div>
<div>
<br /></div>
<div>
本田宗一郎や松下幸之助の時代には、日本企業も価値を生み出していたはずだ。価値を生み出したからこそ、日本製が選ばれ、日本経済は発達した。しかし、彼ら戦後日本経済のヒーローが去った後、残された日本のマネジャーたちは、もう彼らには頼るまいと思った。そして、技術者の個性を無効化することを思いついた。その結果、日本製は急速に魅力を失い、退屈な技術者が残った。</div>
</div>
<div>
<br /></div>
<div>
<div>
私が、前職の同僚たちとの飲み会で最も不満だったことは、彼らが技術について話そうとしないことだった。少なくとも、親指シフトが話題に上ったことはなかった。彼らは、そもそも技術に興味がなかった。技術など、とっくに放棄してしまっていた。話題の中心は、会社の愚痴だった。</div>
</div>
<div>
<br /></div>
<div>
昨日の飲み会で、ミラクルの技術者は、少なくとも現時点では技術を放棄していないことがわかった。ミラクルのマネジャーは、技術者を標準化された部品とは考えていないのだろう。私はたまたまミラクルを選んだが、若い企業はどこもそうなのかもしれない。</div>
<div>
<br /></div>
<div>
若い会社は、市場規模は小さいかも知れない。前職とミラクルとでは、売上の単位が違う。しかし、人々は何のために市場を生み出したのかを思い出さなければならない。企業とは何かを思い出さなければならない。</div>
<div>
<br /></div>
<div>
技術とは、昨日よりよい明日を得るために今日行う活動である。市場とはこの活動を加速させる舞台であり、企業とは舞台で踊る主体である。</div>
<div>
<br /></div>
<div>
企業の規模は目的ではない。売上とは、企業がどれだけ価値を生み出しているかを評価するベンチマーキングであって、それ自体が企業の目的ではない。テストの点数それ自体が勉強の目的ではないのと同じである。</div>
<div>
<br /></div>
<div>
どんなに売上を上げていても、もはや価値を生み出せなくなった企業は速やかに市場から退場しなければならない。あるいは、その売上を、価値を生み出す活動へと注入しなければならない。絶対にそうしなければならないというわけではない。これは、倫理の問題である。</div>
<div>
<br /></div>
<div>
ミラクルに入社して1ヶ月、技術者として、私は何だか救われた気がしている。前職では、私は、自身が十分な価値を生み出していないことに気づいていた。このことに後ろめたさを感じていた。仕事とはそういうものだと、自分を誤魔化していた。</div>
<div>
<br /></div>
<div>
ミラクルでは、そのようなバツの悪い思いをしなくても済みそうだ。雇用とは契約である。企業は労働者に何物かを求め、労働者はそれに答える。しかし、労働者も企業に何物かを求める。企業はそれに答えなければならない。</div>
<div>
<br /></div>
<div>
私は、ミラクルに、個性を潰さないで欲しいと要求する。個性を持った、強みと、当然ながら弱みも持った技術者として扱って欲しいと要求する。そうすれば、私は最高の仕事を約束する。少なくとも努力はする。これが、技術者としての倫理である。</div>Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-85862980078787003212012-02-26T03:56:00.000+09:002012-02-26T03:56:27.430+09:00タクシードライバー先日、飲み過ぎて上野で終電を逃したことがあった。仕方がないので、上野から亀有までタクシーで帰った。4000円ほどだった。普段、私はあまりタクシーに乗ることがないのだが、そのとき私の乗ったタクシーには、後部座席に小さな液晶モニタが設置されていた。色々な広告が流れていた。<br />
<br />
そこで流れていた広告で知ったのだが、今都内のタクシー会社数社で、タクシーを呼ぶためのスマートフォンアプリを作っているらし。広告によると、スマートフォンに内蔵されたGPSの位置情報を用いることで、今までのように電話で呼ぶのに比べ、よりよい配車が可能になるとのことだった。<br />
<br />
私の父はタクシードライバーだった。かつて、タクシードライバーとえば、一種の自由業であった。父や父の友人は、9時から5時まで会社に縛られるのが嫌でタクシードライバーになったのであった。自分の気の向くままに車を走らせることができるし、疲れたときは橋の下で休憩することができた。お客を乗せることさえできれば、何をするのもドライバーの自由だった。<br />
<br />
父は働くのが嫌いだった。お酒は飲む方ではなかったが、よく、友人たちと麻雀をやっていた。パチンコも好きだった。私も、小学校へ上がる前から、よくパチンコ屋へ連れていかれた。景品のお菓子をもらえるのが楽しみだった。<br />
<br />
父は不まじめなドライバーであったが、そんな父でも家族を養うことができたのは、これはもちろん母の多大なる苦労があったわけだが、父がタクシードライバーとして必要なスキルを持っていたからであった。<br />
<br />
タクシードライバーは、第1に、道を知らなければならない。第2に、交通情報を知らなければならない。道を知っているだけでは不十分だ。お客を運ぶというのは、地図を見て最短距離を走ればいいというものではない。時間帯によって、道の混雑具合は変わる。どこかで道路工事が行われているかも知れない。<br />
<br />
第3に、お客について知らなければならない。地域によっては流しのタクシーが禁止されているところもあるが、「本物の」タクシードライバーは流しの客で稼ぐ。空港や駅で客待ちするのは素人だ。お客がちょうどタクシーに乗りたいと思ったときにタイミングよく現れるのが、プロのタクシードライバーである。<br />
<br />
父の時代には、タクシーという産業はドライバー個人のスキルに大きく依存していた。タクシードライバーとは、職人的職業であった。タクシー無線は存在したが、個々のドライバーは組織化されているとは言えなかった。実際、組織に属さない個人タクシーはかなりの売上をあげていた。売上を独り占めできるからだ。意欲のあるドライバーは、個人タクシーをやりたがった(父はやりたがらなかった)。<br />
<br />
ところが、2000年くらいから様子が変わってきた。カーナビとGPSの導入である。カーナビが80年代から存在したことを考えると、2000年というのはちょっと遅い気もする。しかしこれは、あらゆる職人に共通する気質で説明できる。産業革命当時、ヨーロッパの職人たちは機械を破壊する運動を行った。現代のタクシードライバーにとって、カーナビの存在は、交通のプロである彼らのプライドを傷つけるものだったのかも知れない(ちなみに、タクシーへのAT車の導入も遅かった)。<br />
<br />
ともあれ、タクシーに革命が起きた。職人的ドライバーの時代は終わり、カーナビとGPSによる配車システムの時代がやってきた。どんなに優秀であっても、橋の下でサボるドライバーは必要とされなくなった。<br />
<br />
小泉政権下でタクシーの自由化が行われた際、多くの若いドライバーがタクシー業界に入ってきたそうだ。彼らがタクシーに入ってこれたのも、この新しい配車システムのおかげである。新しいドライバーには、かつてのようなスキルは必要とされない。必要なのは、安全運転とサービス精神だ。<br />
<br />
技術者としての私は、このような技術によるイノベーションを歓迎する。昨日よりよい明日を手に入れた。これこそ技術の目指すものである。件のスマートフォンアプリは、さらに良い明日をもたらすだろう。<br />
<br />
一方で、父の気質を受け継ぐ者として、なんとなく寂しい感じもする。今のタクシーに父の居場所はない。父はもう亡くなったが、今父のような人間がいたとして、つまり私のことだが、どのような職業に就けばよいのだろうか? 誰だって、ときには橋の下でサボりたいのではないのではないか?<br />
<br />
私が上野で乗ったタクシーの運転手は、年配の男性だった。父と同じ時代を生きたのではないかと思う。彼も、かつては職人的スキルで稼いだのかも知れない。車には、もちろんカーナビが搭載されていたし、ギアはATで、後部座席には液晶モニタまであった。もはや、かつてのスキルは必要ない。<br />
<br />
時代が変われば、働くものに要求されるものも変わってくる。当然である。それを寂しく感じてしまうのは、単に変化に追従できていないのかも知れない。もちろん、昔にもよいところはあったろう。しかし、我々はよりよい明日を選んだのではなかったのか。<br />
<br />
父の時代は終わった。今は私の時代である。父の時代は父の時代として、懐かしむことはあっても、寂しく思う必要はない。私は技術者として、昨日よりよい明日のため、新たなる技術に挑戦するのみである。ちなみに、そんな私は、awkとsedでシェルスクリプトを書いている。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com1tag:blogger.com,1999:blog-6024094440866326173.post-71442899533071599992012-02-08T21:22:00.000+09:002012-02-08T21:22:08.935+09:00タンメンのうまい店転職に伴い、藤沢から亀有に引っ越してきた。そろそろ2週間半が経つ。ようやく、亀有にも慣れてきたので、最近はタンメンのうまい店を探している。<br />
<br />
藤沢には「千里」という中華料理屋があって、そこのタンメンがなかなか美味しかった。藤沢駅前のダイヤモンドビルの横の道を曲がったところにある。大船にもあるらしいが、そこは行ったことはない。<br />
<br />
私は中華料理にはまったく詳しくないのだが、ラーメンの中でも、タンメンは味付けが難しい方なのではないかと思う。塩ラーメンに茹でた野菜を乗っけただけだと思ったら大間違いだ。<br />
<br />
タンメンの味付けのポイントは、スープの塩分だと思っている。普通のラーメンは麺が主体であるから、麺と一緒に食べてちょうどよい塩加減にすればよい。ところが、タンメンの場合、野菜と麺があるので、どちらにとってもちょうどよい塩加減というものを追求しなければならない。これが難しい。<br />
<br />
野菜にあわせてしまうと、麺を食べたときに塩分が強すぎる。逆に、麺にあわせてしまうと、野菜を食べたときになんだか水っぽい。藤沢の千里のタンメンは、このあたりが絶妙であった。<br />
<br />
店によっては、野菜を軽く炒めて味をつけてから麺に乗っけるところもある。しかし、これだと、どうしても炒める時に使った油がスープに浮かんでしまう。私としては、タンメンはあっさりしていたほうが好みなのだ。<br />
<br />
亀有駅前に、チェーン店の「日高屋」がある。値段も安くて遅くまで開いているので非常に便利なのだが、ここのタンメンは非常に塩分が強い。野菜を食べるのにはいいのかもしれないが、正直私の口には合わなかった。<br />
<br />
今日は、駅前のイトーヨーカドーのそばにある「和」という中華料理屋に行ってきた。「和」というとなんだか日本料理屋みたいだが、これは「かず」と読むらしい。早速タンメンを食べてきたわけだが、野菜と一緒に食べるにはちょっと塩分が足りない印象を受けた。しかし、スープ自体は美味しくて、日高屋よりはこちらのほうが好みだ。<br />
<br />
やっぱり千里のタンメンはやっぱり偉大である。亀有でタンメンのうまい店があったら教えてほしい。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-60563700330169562032012-02-05T16:17:00.001+09:002012-02-05T16:17:24.654+09:00ランチの話題は?2月からミラクル・リナックスで働いている。まだ3日しか働いていない。この3日間は、ほとんど研修だった。来週から、本格的に業務に入るのだと思う。実は、入社して早速、非常に困難な事態に陥っている。それは、エンジニアリング上の問題ではない。ヒューマン・リレーションズに関わる問題だ。すなわち、ランチの話題である。<br />
<br />
前職では、この問題は簡単だった。山奥の工場だったので、周りにランチをとるような店はなく、会社の手配する弁当を食べていた。また、省エネのためと称して、昼休み開始から15分ほどで消灯された。したがって、電気のついている15分間で弁当を黙々と掻き込み、午後の業務が始まるのを自席で静かに待つ(大抵の人は寝る)のである。<br />
<br />
ミラクルでは事情が異なる。ミラクルでは、ランチとは、各自が自由に食べるものだ。弁当を持ってくる人もいれば、コンビニに買いに行く人もいる。近くのお店に食べに行く人もいる。ありがたいことに、私も、近くへ食べに行くグループに入れてもらっている。<br />
<br />
ここで、驚くべきことに、ミラクルの人たちは話をしながらランチを食べるのである。難しい話題ではない。どこの回転寿司がおいしいとか、そういったことだ。しかし、黙々と掻き込む事に慣れている私には、これが難しい。私にとっては、「話す」か「食べる」かのいずれかであって、「話しながら食べる」は無いのだ。<br />
<br />
さらに、困難極まるのが、このときの話題である。何を話していいのかわからない。昼休みに仕事の話を持ち出すのは、なんだか野暮ったい。じゃあ、他に何を話すかというと、とくに思いつかない。その結果、はじめは他の人の話題に相槌を打っていたつもりが、いつの間にか黙々と掻き込んでいる。そして、私だけ早く食べ終わってしまう。<br />
<br />
外にランチを食べに行くなど、夢にまで見たサラリーマン生活だ。ミラクルでは、ランチのメニューまで会社に支配されることはないし、食べてる途中に消灯されることもない。しかし、あらゆる自由には責任が伴う。ランチの自由には、適切な話題を選択する責任が伴う。<br />
<br />
世のサラリーマンは、この困難をどうやって乗り越えたのだろう? アドバイス求む。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com2tag:blogger.com,1999:blog-6024094440866326173.post-54871401022448813272012-02-01T02:09:00.001+09:002012-02-01T02:09:56.158+09:00三菱を去る日1月いっぱいで三菱電機を退職した。新卒で入社してから、この4月で丸6年になるところだった。実は、退職にあたってのエントリを、同じタイトルで前々から用意していた。三菱の官僚主義に辟易していた私は、三菱のやり方について、そのエントリでこき下ろす予定だった。だが、気が変わった。<br />
<br />
最後の出勤が終わったあと、6年間住んだ独身寮へ行った。部屋の鍵を返すためだ。まだ部屋に置いたままになっていたゴミを処分し、掃除機をかけた。そして、鍵を返すために管理人室へ行った。管理人さんは、なぜかいつも私をフルネームで呼ぶ。私は鍵を返し、簡単にお礼を述べた。管理人さんも何か言った。<br />
<br />
瞬間、私は、目から涙が出そうになっていることに気づいた。私は慌てて管理人室をあとにし、駅へと向かった。管理人さんが何を言ったのか、正確には覚えていない。しかし、励ましの言葉だったのは確かだ。<br />
<br />
管理人さんのその言葉は、私の頭脳で解釈される前に、私の心の中の大きく膨らんだ風船を突き刺してしまった。風船は弾け、中の物が溢れ出し、私はうかつにも涙を浮かべてしまった。風船の中身は何だったのか?<br />
<br />
退職当日というのは意外と忙しい。あれやこれやの手続きに、机周りの整理。それが終わったら、お世話になった人への挨拶だ。しかし、上に書いたように、私は三菱が嫌で辞めるのであるから、特に誰かに挨拶して回ろうとは思っていなかった。親しい友人には事前に退職を知らせてあったし、同期入社の仲間たちにはメールで知らせた。手続きや机の整理は午前中でほとんど終わってしまったので、午後は缶ジュースなど飲みつつのんびり過ごした。<br />
<br />
定時になって、課の人たちの前で挨拶をした。挨拶が終われば帰っていいわけだが、持ち帰らなければならない荷物が多かったので、フロアの友人にあげてしまおうと思った。形見分けというわけだ。そこで、私は「形見」を持ってフロアを歩きまわった。<br />
<br />
フロアを見渡すと、色々な人たちの顔があった。私は、その中の実に多くの人と、この6年の間に一緒に仕事をしてきたことに気づいた。一緒にデスマーチを乗り越えた人もいたし、一緒にお酒を飲んだことがあるだけの人もいた。挨拶回りなどしないと決めていたはずなのに、私は彼らに声をかけた。彼らは気持よく送り出してくれた。<br />
<br />
私の三菱電機での6年間は、常に不幸だった。デスマーチも経験したし、体調を崩したこともあった。そもそも、担当する仕事が退屈極まりなかった。しかし、ひとつだけ素晴らしいことに、私がどんなに苦しい時でも、私のそばには常に誰かがついていてくれた。私はひとりで置いておかれることはなかった。疎外されることもなかった。<br />
<br />
これが風船の中身だった。駅へと向かう道で、このことに気づいた。私は、薄暗い路地へ駆け込み、静かに涙を流した。私は、再び駅へと歩き出した。途中のコンビニでコーヒーを買おうと思った。寮の近くの、馴染みのコンビニだった。コンビニの外に、大きな黒い犬がつながれていた。飼い主は買い物中なのだろう。私は、その犬の頭を撫で、ようやく落ち着きを取り戻した。<br />
<br />
私は三菱の官僚主義を嫌った。これを書いている今も嫌いだし、そういうやり方は私には合わないと思う。しかし、私が見逃していたことに、その官僚主義の中にいる人々は皆善人だった。もしかすると、彼らも官僚主義を嫌っているかも知れない。さらに、官僚主義と日々戦っているのかも知れない。<br />
<br />
彼らは残り、私は去った。何だか、私だけがさっさと逃げ出してしまったような気もする。退職を後悔しているわけではない。だが、すごく不思議な気持ちだ。彼らのためにも、というのは変な表現だが、次の職場ではがんばろうと思う。<br />
<br />
ありがとう、三菱電機。この6年間は本当は幸せだったのだ。素晴らしい人達と過ごせたのだから。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com1tag:blogger.com,1999:blog-6024094440866326173.post-4780405643302966722012-01-15T22:36:00.000+09:002012-01-15T22:36:13.930+09:00『一般意志2.0』を読んだ今年の正月休みも実家へ帰っていた。1日だけ地元の友人たちと会い、あとは本を何冊か読んで過ごした。その中に、東浩紀さんの『一般意志2.0』というのがあった。帰省前に、藤沢のジュンク堂で見かけ、Twitterで話題になっているのを思い出して購入したものだ。<br />
<br />
この本は、GoogleやTwitterといった現代のWebテクノロジーを、ルソーやフロイトなどの過去の思想家の視点から解釈してみせる。これは、Webテクノロジーを、社会的・政治的・人間的側面から眺めてみることである。<br />
<br />
私はプログラマだ。だから、どうしても技術的な側面ばかりに注目してしまう。もちろん、社会的側面があることはわかっている。しかし、具体的に社会にどう影響を与えたか、あるいは今後与えうるかと問われると、答えに窮してしまう。せいぜい、「10年前、20年前とはずいぶんと違った世の中になったな」としか答えられない。<br />
<br />
この本は、ひとつのヴィジョンである。アラン・ケイのダイナブック、スティーブ・ジョブズの美しいコンピュータと同じだ。あるいは、60年前の人が空想した、原子力で動く自動車だ。未来は、この本のとおりになるかもしれないし、ならないかもしれない(多分ならない。ヴィジョンの平均値は「実現しない」である)。それでも、この本は我々の想像力を大いに喚起する。<br />
<br />
この『一般意志2.0』だが、Amazonでのレビューは、星1つから星5つまで評価が割れている。こういう本は議論を呼ぶ。議論を呼ぶ本は面白い。私も、大いに楽しんだ。<br />
<br />
だから、このエントリを読んでいてまだ本書を読んでいない人は、ぜひ読んでみてほしい。あなたは大いに感銘を受けるかもしれないし、東浩紀は何という大ばか者だと思うかもしれない。しかし、何も印象に残らないということはないはずだ。<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yshigeru-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4062173980" style="height: 240px; width: 120px;"></iframe>Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-92131050948172189022011-12-21T18:52:00.000+09:002011-12-21T19:23:30.796+09:00ハッカーセントリックな企業文化TechLION vol.5に行ってきた:<br />
<br />
<a href="http://www.usptomonokai.jp/wp/?p=2068">http://www.usptomonokai.jp/wp/?p=2068</a><br />
<br />
自称プロの酔っぱらいである楽天のよしおかさんが、「ハッカーセントリックな企業文化」について語るということだった。Twitterを見ていると、すでに楽屋でビールを飲んでおられたようだった。さすがプロである。<br />
<br />
よしおかさんはこう言う:<br />
<blockquote class="tr_bq">
良いソフトウェア、良いシステムを作りたいなら、最高のプログラマを雇うべき。見も蓋もない話なんですよ。</blockquote>
ここで言う「最高のプログラマ」というのが、ハッカーということなのだろう。<br />
<br />
では、ハッカー的モノづくりと、非ハッカー的モノづくりを隔てるものは何だろうか? どうして、ハッカーのほうが素晴らしいモノづくりができるのだろうか? これは、ハッカーと非ハッカーがモノづくりに対してとる態度の違いに現れているように思う。<br />
<br />
モノづくりにおいて、リスクを回避する最も簡単な方法は、モノを作らないことだ。もちろん、モノがなければシステムは作れないので、実際にはコンポーネントを買ってくることになる。これは、実際に私の現場でも行われていて、COTS(Commercial Off The Shelf)というカッコイイ名前で呼ばれている。<br />
<br />
COTSを利用するメリットは、そのコンポーネントに関するあらゆるリスクをベンダーに転嫁できる(と非ハッカーは考える)ことだ。COTSのバグが見つかったら、ベンダーへ怒りの電話を入れればよい。彼らが徹夜で直してくれるはずだ(と非ハッカーは考える)。<br />
<br />
ハッカーは、既存のコンポーネントを組み合わせてシステムを作る事自体には反対しない。むしろ、そのようなモノづくりは「巨人の方に乗る」ものとして賞賛されさえする。実際、ハッカーはオープンソースのコンポーネントをよく利用する。問題は、そのコンポーネントに対する「態度」だ。<br />
<br />
例えば、あるコンポーネントでバグが見つかったときに、「そのコンポーネントはCOTSなので私には関係ありません」と言って責任逃れをするのは非ハッカー的態度だ。このような言い訳はハッカーとしてのプライドを大きく傷つけるものだし、こういう言い訳をする人間はハッカーではないと他のハッカーから見なされる。<br />
<br />
ハッカーがオープンソースを好む理由もここにある。ソースがあって自分でいじくり回すことができるからこそ、すべての責任を取ることができる。すべてをコントロールすることができる。責任逃れはできないのだ。<br />
<br />
ここからわかることは、ハッカーは自分の作った製品やサービスに対して非常に責任感が強いということだ。これは、ハッカーの一見自由奔放なイメージとはかなり違う。実は、非ハッカーのほうが責任感がない。非ハッカーは、いかにして責任を取らずに済むかを考える。<br />
<br />
だから、もし本当に素晴らしいモノづくりがしたいのなら、ハッカーの態度を真似るべきだ。次に何か責任逃れをしようと思うときがあったら、グッとこらえて「自分の責任」にしてしまおう。自分でデバッグに乗り出そう。そして、いつでもそうできるようにオープンソースを採用しよう。<br />
<br />
でも、どうしてもハッカーセントリックな企業文化が自分の会社に根付かないのなら、他のハッカーを探して別の会社に移るというのも手かもしれない。世の中には、ハッカーはたくさんいるはずだ。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-52089647285082720192011-12-17T19:16:00.000+09:002011-12-17T19:16:48.432+09:00xv6を読む:メモリアロケータ実行時に、プロセスやカーネルにページを割り当てるため、xv6はメモリアロケータを使用する。メモリアロケータは、未使用のページのフリーリストを管理している。カーネルからの要求に従って、フリーリストからページを割り当てる。<br />
<br />
カーネルの起動処理で、フリーリストを未使用のページで満たさなければならない。ここで、鶏と卵の問題が生じる。すなわち、フリーリストの初期化処理を行うためにはカーネルに物理メモリが割り当てられていなければならず、カーネルに物理メモリを割り当てるためにはメモリアロケータが動作しなければならない。<br />
<br />
xv6では、フリーリストの初期化を二段階で行うことで、これを解決している。main関数から呼び出されるkinit1関数と、kinit2関数がそれである。関数呼び出しの関係を以下に示す:<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">main</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">:</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">+->kinit1</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">| +->initlock</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">| +->freerange</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">| +->kfree</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">+->kvmalloc(前回説明。kinit1で初期化したページを使用する)</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">:</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">+->kinit2</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">| +->freerange</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">| +->kfree</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">:</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
<span style="font-family: 'Courier New', Courier, monospace;">ここで、xv6のアドレス空間について少し説明する。仮想アドレス空間を左に、物理アドレス空間を右に示す:</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> 4G->+----+</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> /| |\</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> Device | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> \| |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">0xFE000000->|----|</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> /| |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">Free Memory | | Kernel Space</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> \| |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> end->| | +----+<-4G</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> | | | |\</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> +0x100000->| | | | Device</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> KERNBASE->| | | |/</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">/</span><span style="font-family: 'Courier New', Courier, monospace;">|----|</span><span style="font-family: 'Courier New', Courier, monospace;">/</span><span style="font-family: 'Courier New', Courier, monospace;"> |----|<-PHYSTOP</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |\</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | | Extended Memory</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> User Space</span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | |----|/</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |<-0x100000</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |<-I/O Space</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;"> </span><span style="font-family: 'Courier New', Courier, monospace;">| | | |<-640k</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> \</span><span style="font-family: 'Courier New', Courier, monospace;">| | | |<-Base Memory</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> 0-></span><span style="font-family: 'Courier New', Courier, monospace;">+----+ +----+</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> Vertual Physical</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
仮想アドレス空間では、カーネルは上位2GBにマップされる(KERNBASE=2GBに定義されている)。したがって、ユーザプロセスは2GBまでのアドレス空間を利用できる。カーネルのテキストとデータは、仮想アドレスでKERNBASE + 0x100000〜endの間にロードされる。これは、物理アドレス0x100000〜end - KERNBASEにマップされている。<br />
<br />
物理アドレス空間で、カーネルの後ろ、すなわちend - KERNBASEからPHYSTOPまでの空間をページとして利用する。メモリアロケータは、この部分をフリーリストとして管理する。PHYSTOPは240MBに定義されている。<br />
<br />
xv6はブート時のページテーブルとして、entrypgdirを持っている。entrypgdirは、仮想アドレスの0〜4MBを実アドレスの0〜4MBへ、仮想アドレスのKERNBASE〜KERNBASE + 4MBを実アドレスの0〜4MBへマップするよう設定されている。前回説明したkvmallocでカーネルページテーブルが作成されるまでは、カーネルはこのページテーブルを用いてアドレス変換を行う。すなわち、xv6は、カーネルのサイズは少なくとも4MBより小さいものと仮定している。<br />
<br />
さて、kinit1では、end〜4MBまでの物理アドレス空間を4KBのページに分割し、フリーリストに登録する。この処理を行うのが、freerange関数とkfree関数である。kinit1は、main関数内で以下のように呼び出されている:<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">kinit1(end, P2V(4*1024*1024));</span><br />
<span style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
ここで、P2Vマクロは物理アドレスを仮想アドレスに変換するマクロである。このマクロは、単に引数 + KERNBASEに展開されるだけである。<br />
<br />
freerange関数は、以下の処理を行う:<br />
<ol>
<li>引数vstartとvendで渡された仮想アドレス空間(範囲)についてPGSIZE(4KB)ごとにkfree関数を呼び出す</li>
</ol>
kfree関数は、以下の処理を行う:<br />
<ol>
<li>引数vで渡された仮想アドレスが以下の条件にない場合、パニックする:</li>
<ul>
<li>ページ境界に合っていない</li>
<li>endより小さい</li>
<li>v2p(v)がPHYSTOP以上である</li>
</ul>
<li>vから1ページ分、メモリ領域を1で埋める</li>
<li>vをフリーリストにつなぐ</li>
</ol>
<div>
ここで、v2p関数は、上記のP2Vマクロの親戚で、仮想アドレスvからKERNBASEを引き、仮想アドレスを物理アドレスに変換するものである。同種の関数・マクロには、他にp2vとV2Pがある。</div>
<br />
以上で、フリーリストの初期化の第1段階が完了した。これで、4MBまでの範囲で、メモリアロケータはページを割り当てることができる。<br />
<br />
フリーリストの初期化の第2段階であるkinit2関数は、main関数のかなり後のほうで、以下のように呼び出されている:<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">kinit2(P2V(4*1024*1024), P2V(PHYSTOP));</span><br />
<br />
<br />
4MBからPHYSTOPまでの物理アドレス空間を、フリーリストに登録する。以上でフリーリストの初期化はすべて完了し、メモリアロケータを使用することができる。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-52017886283997806572011-12-13T22:51:00.001+09:002011-12-14T00:30:58.592+09:00xv6を読む:アドレススペースの作成xv6というOSがある。これは、UNIX V6をベースに(?)MITで開発された教育用のOSである。x86アーキテクチャで動作する。MITなどのアメリカの大学が凄いと思うのは、授業の教材や講義の録画をネットで公開してしまうことである。xv6もテキストとソースコードが公開されている:<br />
<br />
http://pdos.csail.mit.edu/6.828/2011/xv6.html<br />
<br />
xv6のテキストは、解説とソースコードがLions' Commentaryのように2分冊になっている。それぞれ100ページ以下である。テキストを読み進めてみると、xv6は、x86アーキテクチャとその応用であるOSを勉強するのに格好の教材になりそうだ。<br />
<br />
そこで、勉強の成果を忘れないようにメモしておくため、そして、もしかしたら私のメモが役に立つという人もいるかもしれないので、このブログでまとめていくことにする。もちろん、ツッコミは大歓迎である。今回は、アドレススペースの作成である。<br />
<br />
<span class="Apple-style-span" style="font-family: inherit;">OSのブート後、main関数が呼ばれる。最初に、main関数では、アドレススペースの作成が行われる。ここでは、仮想アドレスから物理アドレスへマップするページテーブルを作成する。</span>x86での仮想アドレスは3つの部分を持つ。以下に、mmu.hから引用する:<br />
<div style="font-family: 'Courier New', Courier, monospace;">
<br /></div>
<div style="font-family: 'Courier New', Courier, monospace;">
+--------10------+-------10-------+---------12----------+</div>
<div style="font-family: 'Courier New', Courier, monospace;">
| Page Directory | Page Table | Offset within Page |</div>
<div style="font-family: 'Courier New', Courier, monospace;">
| Index | Index | |</div>
<div style="font-family: 'Courier New', Courier, monospace;">
+----------------+----------------+---------------------+</div>
<div style="font-family: 'Courier New', Courier, monospace;">
\--- PDX(va) --/ \--- PTX(va) --/ </div>
<div style="font-family: 'Courier New', Courier, monospace;">
<br /></div>
<div>
<span class="Apple-style-span" style="font-family: inherit;">仮想アドレスは、それぞれ10ビットのページディレクトリインデックスとページテーブルインデックス、そして12ビットのページ内オフセットからなる。それぞれの意味を以下に示す:</span></div>
<div>
<ul>
<li><span class="Apple-style-span" style="font-family: inherit;">ページディレクトリインデックス:当該仮想アドレスに対応する物理アドレスをマップするページディレクトリエントリを指す</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">ページテーブルインデックス:当該仮想アドレスに対応する物理アドレスをマップするページテーブルエントリを指す</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">ページ内オフセット:上記2つによって指定されるページ内のオフセット(このページのアドレス+オフセットが物理アドレス)</span></li>
</ul>
</div>
<span class="Apple-style-span" style="font-family: inherit;">アドレススペースの作成は、main関数からのkvmalloc関数の呼び出しで行う。setupkvm関数でページディレクトリを作成し、それをswitchkvm関数でCR3レジスタに設定する。関数の呼び出し関係を以下に示す:</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">main</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">:</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">+->kvmalloc</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">| +->setupkvm</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">| | +->mappages</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">| | +->walkpgdir</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">| +->switchkvm</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">:</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;">setupkvm関数では次の処理を行う:</span><br />
<ol>
<li><span class="Apple-style-span" style="font-family: inherit;">ページディレクトリ用に1ページ(4KB)を割り当てる</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">次の各カーネル領域について、mappages関数を呼び出すことで、ページテーブルを作成し、ページディレクトリエントリに書きこむ:</span></li>
<ul>
<li><span class="Apple-style-span" style="font-family: inherit;">I/O空間</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">カーネル(テキストと読み込み専用領域)</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">カーネルデータ</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">その他デバイス</span></li>
</ul>
<li><span class="Apple-style-span" style="font-family: inherit;">作成したページテーブルを、1のページディレクトリに書き込み、返す</span></li>
</ol>
<div>
<span class="Apple-style-span" style="font-family: inherit;">ここで、各カーネル領域は任意の大きさでよい。mappages関数に領域のサイズを渡すことで、必要な分だけページテーブルが割り当てられる。</span></div>
<div>
<span class="Apple-style-span" style="font-family: inherit;"><br /></span></div>
<span class="Apple-style-span" style="font-family: inherit;">mappages関数は次の処理を行う:</span><br />
<ol>
<li><span class="Apple-style-span" style="font-family: inherit;">walkpgdir関数を呼び出し、引数で渡された仮想アドレスに対応する、ページテーブルエントリを取得する</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">エントリにマップする物理アドレス、アクセス権、存在ビットを書きこむ</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">領域全体をマップし終わるまで1から繰り返す</span></li>
</ol>
<div>
<span class="Apple-style-span" style="font-family: inherit;">walkpgdir関数は次の処理を行う:</span><br />
<ol>
<li><span class="Apple-style-span" style="font-family: inherit;">ページディレクトリから、ページディレクトリインデックスに該当するエントリを引く</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">1で引いたエントリの存在フラグが立っていれば、ページテーブルを取得する(エントリに記述されているアドレスに存在するはず)</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">2でない場合、関数の引数でallocフラグに真が渡された場合(この場合はそうである)、新たに1ページ取得し、これをページテーブルとする。このページテーブルの物理アドレス、存在ビット、書き込み可ビット、ユーザ空間ビットを、1で取得したエントリに書きこむ</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">2または3で取得したページテーブルから、ページテーブルインデックスに該当するエントリのアドレスを返す</span></li>
</ol>
<div>
以上で、アドレススペースを作成した。ただし、ここで作成したのはページテーブルまでで、物理ページの割り当ては行っていない。次回は、テキストに従って、物理メモリの割り当てに進みたい。</div>
</div>Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-33886997144807494122011-12-08T19:54:00.001+09:002011-12-08T22:36:23.766+09:00スキルかセンスか?ちょっと前の話になるのだが、「デザイナ&エンジニア交流会」というのに参加してきた:<br />
<br />
<a href="http://design1.chu.jp/setucocms-pjt/?p=1770">http://design1.chu.jp/setucocms-pjt/?p=1770</a><br />
<br />
SetsucoCMSというオープンソースのCMSがあって、それを作っている子たちによく遊んでもらっている。今回、彼らが勉強会をやるということで、私も誘われた。デザイナやエンジニアと言っても、ここでは「Web」デザイナ、「Web」エンジニアである。Webにとんと疎い私としては、そこはまったくの異文化圏である。そこでの交流は、なかなか刺激的であった。<br />
<br />
中でも非常に新鮮だったは、普段接することのないデザイナと話す機会を持てたことだ。そして、彼らと話してわかったことには、どうやら彼らは、デザインがセンスだとエンジニアに思われていることに強い不満を持っているらしい。<br />
<br />
確かに、「デザイン」というと、何だか芸術的なものを連想してしまう。実際、私もデザインはセンス、つまり才能によるところが大きいのだろうと何となく思っていた。しかし、デザイナの彼らに言わせれば、デザインには理論があり、練習によって習得できるものであって、したがってデザインはスキルであるという。<br />
<br />
ここでちょっと野球を考えてみる。長嶋茂雄さんといえば往年のスター選手だ。あるとき、ホームランの打ち方を聞かれた長嶋さんは、「ボールが来たら、よく見て打て」と大真面目に答えたそうだ。長嶋さんにとっては、それがホームランの理論であり、練習によって習得したということだろう。<br />
<br />
デザイナが、デザインがセンスだというエンジニアの思い込みに不満を持つということは、その裏返しとして、彼らは、エンジニアリングはスキルだと思っているのかもしれない。しかし、この思い込みが必ずしも正しくないことは、プログラマなら誰もが知っている。<br />
<br />
確かに、プログラミングには理論が存在する。ソフトウェア工学と呼ばれているものがそれだ。プログラミングの外にいる人の目には、プログラミングとはソフトウェア工学の実践であって、練習によって習得できるものと映るかもしれない。しかし、そうだとしたら、どうしてこんなにも多くのソフトウェア開発プロジェクトが失敗するのだろう? プログラマはみんなあまりにも怠惰過ぎて、練習を怠っているということだろうか?<br />
<br />
私が思うに、プログラミングは野球みたいなものだ。ソフトウェア工学は長嶋さんのホームラン理論に似ている。この理論は間違ってはいないが、本当にホームランを打とうとするなら、理論以外の何かが必要だ。そして、重要なことは、あの長嶋さんでさえ、毎回ホームランを打てたわけではないということだ。<br />
<br />
交流会の後の懇親会で、私はデザイナの一人に、「エンジニアリングはスキルですか?」と聞かれた。私は、「ある部分はスキルでしょう。しかし、センスが必要な部分もたくさんありますよ」と答えた。この時は酔っ払っていたのでうまく説明できなかったが、私が言いたかったのは、つまるところエンジニアリングとはホームラン理論だということだ。<br />
<br />
だから、デザイナは、自分たちがやっていることがスキルかセンスかなんて悩む必要はないと思う。たぶん、デザインもホームラン理論だ。部外者から見るとセンスに見えるかもしれないが、実際にはスキルとセンスの混合物なのだろう。<br />
<br />
最後に、今回の交流会を主催し、そして私を呼んでくれたSetsucoCMSのみんなにお礼を言おう。彼らはとても若く、パワフルで、情熱に溢れている。そして何より、彼らはものづくりに対してとても真面目である。彼らの今後の活躍には私は大きく期待するし、また、今後もこういった交流会に呼んでほしいと思う。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0tag:blogger.com,1999:blog-6024094440866326173.post-31945363331447905422011-11-20T15:24:00.001+09:002011-11-20T17:13:54.403+09:00電子書籍は安い?Amazon Kindleの日本語版が年内登場とか言っている。日本でも書店や出版社などが独自に電子書籍を出していたが、各社ばらばらで足並みが揃っていないようで、私は買い控えていた。Kindle DXですでに英語版を利用している身としては、今回のAmazonの発表は非常に嬉しい。もっとも、私のKindle DXで日本語書籍が読めるのかという心配はある。400ドルもしたのに…。<br />
<br />
よく、電子書籍の値段はいくらが適当かという話題を見かける。書店や出版社も、適正な価格付けに困っているのかもしれない。消費者にとっては、中間に書店や卸業者が入らない分、電子書籍は紙の書籍に比べるとコストが安いように思える。したがって、当然、電子書籍の値段は紙の書籍より安くしろということになる。実際、Amazon.comのKindle書籍は、紙の書籍に比べて圧倒的に安い。<br />
<br />
しかし、ちょっと待ってほしい。モノの値段というのは、はじめに利益ありきで決まるものではない。物の値段は、「消費者がいくらなら買うか」によって決まるものではないのか? 消費者が1万円出してでもほしいと思うものなら、たとえ原価が100円であっても1万円で売っていいはずだ。だから、いったん中間の書店や卸業者のことは忘れて、いくらなら電子書籍を買うか考えてみよう。<br />
<br />
私が英語版Kindleを使っていて、これは便利だと感じた機能はざっと以下のようなものだ:<br />
<br />
<ol>
<li>(当然ながら)普通に読書できる</li>
<li>ブックマークできる</li>
<li>ノートをかける</li>
<li>わざわざブックマークしなくても直前にどこを読んでいたか記憶しており、次に端末を起動したとき、そのページを開いてくれる</li>
<li>Kindle端末以外にも、PC、Webブラウザ、スマートフォンなどで読める</li>
<li>上記端末等で、書籍、ブックマーク、ノート、直前に読んだページを同期できる</li>
<li>検索ができる</li>
<li>1000ページを超えるような技術書でも楽に持ち歩くことができる</li>
<li>保管に場所をとらない</li>
<li>誤植等があった場合、本のアップデートができる</li>
</ol>
さて、以上のような機能を備えたKindle端末(単なる端末というよりは、Amazonのサーバを含めたKindleシステム?)があったとして(初期投資としてこれは買わなければならない)、その上で読める電子書籍は紙の書籍より高いだろうか、安いだろうか? 紙の書籍と比較してみよう。<br />
<br />
まず、1についてだが、これは紙の書籍でも可能だ。媒体が何であろうともコンテンツは同じはずだからだ。また、2と3も、従来から紙の書籍で我々がやってきたことだ。ノートを取るときに本に直接書きこむのが嫌な人は、ポストイットを使うとよい。4はブックマークで代用できる。<br />
<br />
では、5と6はどうか? 私のKindle DXは9.7インチある。重量もそこそこで、通勤電車でつり革に掴まって読書するには大きすぎる。そこで、私は電車内ではスマートフォンで読んでいる。会社に着けばPCがあるので、PC版を使うことができる。そして、素晴らしいことに、これらはすべて同期されているのである。実際、私は、通勤時にKindleで読書をするのに、ポケットにスマートフォンを入れているだけでKindle端末や、それを入れるかばんは持ち歩かない。<br />
<br />
これが紙の書籍だったらどうか? 文庫や新書であれば電車の中でも読むことはできる。しかし、分厚い技術書の場合、つり革に掴まったまま読むのは難しいだろう。もちろん、紙の本は会社でも読むことができるが、家で続きを読みたいのなら、持って帰らなければならない。そして、本を持ち運ぶためにはかばんが必要だ。したがって、紙の本は電子書籍より不便そうだ。<br />
<br />
次に7だ。検索といえば、ディジタルのお家芸である。もちろんKindleでも可能であるが、全文検索しているのか、それとも事前に決めてあるキーワードのみ検索しているのかはちょっとわからない。もっとも、全文検索したとして、どれだけ意味のある結果が得られるかは疑わしいが。<br />
<br />
一方、紙の書籍の方は、後ろに付いている索引が検索に相当するだろう。索引は、ご存知の通り、事前に決めてあるキーワードのみが記されている。ただし、最近の本はそうでもないようだが、稀に、索引に記されているキーワードの少ない、あるいはそもそも索引自体のない書籍が存在する。技術書でこれをやられると非常に困る。というわけで、検索についても、電子書籍に歩があると言っていいだろう。<br />
<br />
次に、8と9である。これは、言うまでもなく電子書籍の勝利だろう。技術書や技術系の教科書は分厚いものが多い。特に洋書はそうである。アメリカの学生などは、あんなに分厚い教科書を毎日学校まで持っていくのだろうか? そして、分厚いということは、当然保管場所に困るということなのだ。その点、電子書籍であれば保管場所はまったく問題にならない。そもそも、データをローカルに保管する必要すらない。Kindleの場合だと、ノートやブックマークも含めて、すべてAmazonのサーバ上に管理されている。<br />
<br />
最後に、10だ。誤植などは本にはつきものである。これは、紙だろうと電子だろうと変わらない。紙の場合は、誤植があった場合、正誤表をWebサイトなどで公開することになる。この正誤表の問題点は、公開されたことがわからないことだ。何となく出版社のサイトを見ていて正誤表に気づくことがある。<br />
<br />
一方、電子書籍であれば、アップデートをネット経由で配布すればよい。誤植が発見された時点で、逐次配布することができる。実際、私の持っているKindle書籍の1冊は、端末付属の3G回線を介してアップデートされた。事前にアップデートに関するメールもきたし、大変満足している。したがって、この点も電子書籍のほうが便利だ。<br />
<br />
さて、こうして電子書籍と紙の書籍を比べてみると、電子書籍のほうが消費者にメリットがありそうだ。もちろん、紙の書籍にも良い点があるということは私も認識している。例えば、芸術的な装幀や、芸術的な装幀や…うーん…そうだ、乱暴な扱いにも強い!<br />
<br />
だが、一般的な読書であれば、少なくとも私は電子書籍を好むだろう。だから、私は電子書籍を安くしろとは言わない。紙の書籍と同じか、あるいはちょっと高くても電子書籍を選ぶ。実際、電子書籍には、サーバの運用や、原価より低く設定された端末本体の値段(カミソリ本体とカミソリの刃の話と同じだ)など、紙の書籍にはなかったコストもかかっているのだ。<br />
<br />
電子書籍の値段を考えるとき、これらのメリットを中心に考えれば、自ずと適当な値段がわかるだろう(上記のように、私の答えは、紙と同等かちょっと高くてもよい)。書店や出版社の立場で考えると、電子書籍でできることを更に増やせば、これはつまりサービスを充実させることであるから、値段を上げてもよいだろう。<br />
<br />
もう何十年も前から、これからは電子書籍の時代だと言われてきたが、ようやくその時代がやってきた。電子書籍を中心に、本のあり方というのも変わってくるのかもしれない。なお、出版社や書店が、どうしても電子書籍を紙の書籍より安くするというのなら、私はもちろん大歓迎である。Anonymoushttp://www.blogger.com/profile/10103288204412552566noreply@blogger.com0