My Daily Programming Life...

悩むということ

今日、ある人からちょっとした相談を受けた。マネージメント的な話だったので僕に相談してきたようだ。
彼女は本当に悩んでいるようだった。ただ、いまいちその本質までは掴み取ることができなかった。話はするのだけれど、いまいちどこに問題の核があるのかがはっきりしない感じがした。
その理由の半分は、僕に当たり前のことが彼女にあたり前ではないからとか、そういう差からくること、もう半分は、どこに答えがあるのか彼女自身もよくわからないということ、じゃないかと思った。
(完全な僕の想像なので、僕の頭が悪いだけなのかもしれない。)

やりとりの中で、何となく「どういう風になったら、よいと思う?」と聞いた。まあ、その答えや、その後の結論は置いておいて、この質問が結構いろいろなことを教えてくれる質問なんじゃないかと思った。

僕は悩んでいる。これは確かで、ずっと悩みながら生きている。でも、正直何に悩んでいるのかが分からないのが現実だ。なぜ毎日、何かが足りないと思いながら生きているのか。それが何なのかが分からない。

さて、僕は「どういう風になったらよいと思う?」のだろうか。
「すごいソフトウェアの開発」ができれば幸せか、「グーグルに就職」できれば幸せか、「ノーベル賞をとった」ら幸せか、「日本一周旅行」ができたら幸せか。
なんとなく、こんな風になったらすごいなぁ、なんてぼんやりと考えているものを並べてみても、実はぜんぜんそれで幸せにならないことに気がつく。

一方で僕が悩んでいなかったころのことを思い出すと、この問いにはっきり答えられていた。
高校生の時は「勉強していい大学に入る」ことができれば幸せだったし、大学に入ってからは「ジャグリングが上手くなる」ことができれば幸せだった。だから、その当時僕にこの質問をしていたら、僕は間違いなく、この答えを言っていた。100%これを言っていた。そういうものがあったということだ。

そういう状態の人間は強いと思う。すべてのことに解決の道が見出せるし、そこに向かっていける。

あまり気にしすぎても答えはでそうにないが、「どういう風になりたいのか」という問いから自分を考えていくのもよいと思う。

再帰処理と再帰手続き

「処理と手続きが混同される一つの理由は、ほとんどの一般的な言語(Ada, Pascal, C)の実装がすべての再帰手続きを手続き呼び出しの量だけメモリを消費するように設計されている空である。たとえ、その手続きが原理的に繰り返しであったとしても。その結果、これらの言語はdo,while,forなどの助けを借りてでしか繰り返し手続きを表現できない。」

SICPより(一部省略)。

再帰呼び出しを行う関数が、必ずしも再帰手続きではないということだ。つまり、再帰呼び出しをしても、たくさんのメモリを使わずに済む場合があり、それは繰り返し手続きとなる。

やっぱり、Cとかそういうものでプログラムを学ぶとこういったことに気づくことができない。それがすべてだと思ってしまう。文字列がNULLで終わるものだと思っているという類の、もうちょっとコンピュータの原理に近い部分の話の気がする。
つまりCなどの実装に影響を受けすぎて、それがコンピュータの動作だと思ってしまう。

こういうことを理解しておくことは重要だ。

続・3年で読む本

以前に3年で読む本をリストアップした。もうそれから半年・・・全然進んでない気がする。
というわけで、何頁進んでいるのか確認
  • アルゴリズムイントロダクション  (18 / 1292 )
  • 計算理論の基礎 1~3  (139 / 507)
  • 暗号の数学的基礎 (29 / 243)
  • 離散数学 コンピュータサイエンスの基礎数学 ( 0 / 275 )
  • Windows Internals 5th Edition ( 0 / 1152 )
  • モダンオペレーティングシステム ( 144 / 986 ) 
  • 詳解 TCP/IP Vol1 ( 0 / 631 )
  • コンピュータの構成と設計 上下 ( 254 / 576 )
  • 分散システム ( 0 / 822 )
  • Database Management System ( 0 / 1065 )
  • 構造化コンピュータ構成 ( 121 / 746 )
  • セキュアソフトウェア ( 533 / 533 )
全体では 1238 / 8828 = 14 %  ... 本来は16%ぐらい終わっていないといけないんだけど。
しかも、一部はこの3年で読むと決める前に読んだ部分も含まれていたりするので、ペースは遅い。Windows Internals二関しては、4th editionの日本語版を半分ぐらいは読んでいるので読み始めれば結構早く理解していけるとはいえ、もうちょっと読む時間を増やさないと。

UCBerkeley CS61A Structure and Interpretation of Computer Programming Week2

だいぶ間が開いてしまったがSICPのWeek2。
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewiTunesUCollection?id=354818464#ls=1


教科書はオンラインで読むこともできる。
Structure and Interpretation of Computer Programs(SICP)http://www-mitpress.mit.edu/sicp/full-text/book/book.html

宿題や試験の内容はこちら。(宿題はCourse Reading Vol1にある。)
http://www-inst.eecs.berkeley.edu/~cs61a/fa10/

Lecture 3

主な内容
  • Function as Arguments( Higher-order function )
  • 関数の表記について( |-> という表記 )
  • lamda関数

関数の表記 |-> "maps to"についての説明はなんとなく聞くことになるけど、SICP 69ページのFixed-Pointの計算でsquare rootを計算するところでその理解が必要になる。(詳しくは後述)

lamda関数については、その歴史から話が始まる。アロンゾチャーチという人が、数学を関数を元に説明しようとしたところから始まっている、というような話だった。その後、AI研究者のジョンJohn McCarthyが、その考え方をLispに取り入れたとのこと。

Lecture 4

主な内容
  • First Class Data
  • Functionを返すFunction
  • letについて
基本的には高階関数の話

宿題

宿題はSICPのSection1.3を読むこと。Section1.2は飛ばしてあとでやるとのこと。読むに当たって知っておいた方が良さそうな英単語は
converge 収束する
differentiable 微分可能
derivative 導関数

いくつか注意が必要なところがあったので、メモ。
まず、SICP67-68は飛ばしてもよい。これは宿題の指示にも書いてある。

それから、その次の「Finding fixed points of function」というところ。まずFixed pointが何なのか分からないといまいちピンとこない。日本語では不動点 http://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9 となるらしい。これを一通り見ればどういうことなのか分かる。
それから、69ページのこのFixed pointの計算を使ってルートを解くところで、y |-> x/y とかなっていて、x,yの二つの変数が出てきてそれでどうして計算ができるのかと一瞬戸惑うのだが、よく見ればこれはyの関数であって、xは定数であることが分かる(このことに気づかないと理解するのに時間がかかる。)。
これは、まさに授業中に言っていたことだ。ax+bとかあったら、勝手にxを変数だと思い込むくせが悪いのだろう。正確な関数の記述はx |-> ax+b ということだ。

読み終わったら、指示にしたがってSICPの練習問題を解く。
教科書の練習問題は、基本的なことが主なので問題ない。
難しかったのはCourse ReaderのWeek2のExtra for expertsの問題。
これはできなかった。なんとなく考え方としては関数を返す関数を書いて・・・2重にすれば・・・などと考えたけどうまくいかなかった。決して方向性は間違っていなかったようなきがするけど。

これはY Combinatorというものらしい。詳しくは以下を参照
http://www.ece.uc.edu/~franco/C511/html/Scheme/ycomb.html

Ubuntu 10.04 LTSでgDeskletsが起動しないとき

Ubuntuをメインマシンにインストールして約3週間。いろいろ改造しながら使っているが、ガジェットを置いてみたいと思って調べたらgDeskletなるものに行き着いた。
さっそくインストール
sudo apt-get install gdesklets
なんとも簡単だ。何が起きているかは知らないが、とりあえずインストールされる。

さっそく起動してみたが、なんとなくバックグラウンドで動き始めているようだけれど、すぐに死んでしまっているようだ。
コマンドラインから立ち上げると、tiling module not foundみたいなのが出ていたり、よく分からない。

Googleというものの威力をこういうときに思い知る。
http://www.rabblerouser.info/blog/?p=834
まったく同じだ。そして、この通りPythonプログラムを修正したら動いた。

Googleって空気みたいな存在になりつつある。あって当然過ぎて、なくなった瞬間にきっとみんな死にたくなるはずだ。
・・・でも考えてみたら僕はインターネットを1996年から使っている。まあ、当時の検索でも、それなりに使えていた気がするが、どうだろう。実際にはそのころトップ10に表示される検索結果で満足できることっていうのは少なかったのかもしれない。

話がずれた。とにかくgDeskletが動かないときは、言われた通り、プログラムを修正すればよい。たとえその意味がまったく不明でも。

工大祭へ

昨日から東工大の文化祭をやっている。ほぼ毎年ジャグリングサークルの様子を見に行っている。
だれか一人ぐらい知っている人がいるだろうと思って行ってみたが、一人もいず・・・。完全なaway感。
途中で知り合いを見つけて、話すと、やっぱり誰も分からない・・・と言っていた。

さて、最近はジャグリングだけじゃなく、研究発表なんかも見にいくようになっている。
今回は主に機械学習の研究室の説明を聞きに行った。

聞きに行って何か得られるということはほとんどないけど、どんなことをやっているのか聞くのは楽しい。そして、うらやましかったりもする。やっぱり僕もあそこに行くべきだった、と思う。
でも、もしかすると直接行っていたらそうは思っていなかったかもしれないし、難しい。

研究室発表で少し残念なのは、やっぱりあんまり詳しくは説明してもらえない所だ。誰を対象にするかによってしまうので、難しいとは思うけど、もう少し一つ一つ順を追って、どういうことが目的で、どうしてこういうことができるのか、というところを説明してもらえると嬉しい。

どうも、研究そのものの意味とかを、きちんと理解せずに説明しているところがあるようにも思う。何が大切なのか、何が新しいのか、他の同様の研究と何が違うのか、そんなところがもう少し分かりやすく説明されていると嬉しい。
何が新しいとか、他とどう違うか、というのは、説明し始めると難しくなりすぎてしまうのかもしれない。

Twitterの情報をまとめて、つぶやきのランキングをつけるなんていうシステムを作ったりしたらしい。もうすぐ公開されるらしい。

簡単には理解できる話ではなかったけど、彼らに負けないように勉強しようと思えたので、よかった。

VirtualBoxからVmwareへ

最近メインマシンをUbuntuに変更して使っている。
たまにどうしてもWindowsが必要になることがあるため、Virtualマシンが欲しいと思って、いままでVirtualBoxを使っていた。

ただ、なんとなくいまいちな感じがして、お試し版でVmware Workstationも入れてみた。

やっぱりVmwareの方が良い感じがする。

で、問題はもともとVirtualBoxで作ったハードディスクをVmwareにどうやって移行すればよいのかということ。

以下の方法で出きるらしい。

まず、qemuをインストール


sudo apt-get install qemu

その後で以下のコマンド


qemu-img convert -O vmdk SRC.vdi DEST.vmdk


それなりに時間はかかるけど、これでいけた。あとはVmwareでマシンを作って、このHDDをつなぐだけ。しかし、VirtualMachineてよくできてるよあぁ、と感心する。

だいたいあってた

昨日の試験。どっかの学校が出してる模範解答みたいのがあったので採点してみた。
http://www.itec.co.jp/siken/sokuho/2010a/pdf/2010aAPpm.pdf

午前はIPAが出してるのでそれを使った。

結果は
午前は73/80なので、問題無し
午後は、はっきりとした間違いが4問。あとは、記述式がどう採点されるかだけど、趣旨はほとんど同じことをかいているので、まあ問題なさそう。

あとは、マークシートとか変な間違いさえしていなければ大丈夫だろう。

さて、次は・・・CCNAあたりを考えている。

応用情報技術者試験

応用情報技術者試験を受けてきた。
今回は比較的楽だった。たぶん受かってるだろう。

UCBerkeley CS61A Structure and Interpretation of Computer Programming Week1

いろいろな大学が授業の様子をYouTubeやiTunesUで公開しているというのは、いままでもブログに何度か書いてきた。
ここへ来て、真面目に順番に授業を受けようと思い、始めている。
一つ受ける度に、ブログにそのまとめを載せていこうと思う。これから、この教材を使って勉強しようとする人のガイドになればと思う。

第一段はUCBerkeleyのCS61A(Structure and Interpretation of Computer Programming)。授業は以下のサイトにある。
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewiTunesUCollection?id=354818464#ls=1



教科書は有名な本だが、Structure and Interpretation of Computer Programs(SICP)となっている。教科書はオンラインで読むこともできる。
http://www-mitpress.mit.edu/sicp/full-text/book/book.html

また、宿題や試験の内容がここにある。(宿題はCourse Reading Vol1にある。)
http://www-inst.eecs.berkeley.edu/~cs61a/fa10/

スケジュールを見ると、大体一週間に2~4講義分ぐらい進むらしい。Course Reading Vol1には、Week1、Week2とかかれていて、それぞれやることが書いてあるので、それに併せて、ビデオを見ながら進めようと思う。
やり方としては先に教科書を読んでビデオを見て、宿題をやってもよいし、先にビデオを見て宿題をやってから本を読んでもよいし、教科書と授業の順番はどうでもよいと思う。
僕はビデオを見て、教科書を読んで、宿題を行うという順で行った。

この授業にはCourse Reading Vol1とVol2という二つがある。
Vol1はセメスターごとに少しずつ変更になる内容のもので、宿題などが載っている。先ほどのサイトからダウンロードできる。Vol2は、セメスターごとにほとんど変更のないもので、毎回同じものを使っているらしい。これもダウンロードできる。ただし最初のうちは関係なさそうなので、用意するのは教科書とVol1があれば大丈夫。(残念ながらビデオの授業のCourse Readingそのものは手に入れることはできそうにないので、現在配られているものを利用している。)

授業で使われているSchemeプログラムはSTkというものらしく、さきほどのコースのウェブサイトからダウンロードできる。

今回はWeek1
  • 教材Vol1: Week1
  • 教科書: Section 1.1
  • iTunesU: Lecture1 - Lecture2

Lecture1

主な内容は
-Schemeの使い方
-- 簡単な計算
-- 関数定義
-コースオーバービュー

Schemeの使い方では、たった40分程度だが、先生は「これでSchemeの90%はみんな理解したことになる」と言っている。それぐらい簡単なものだということを言っている。

コースのオーバービューとしては、「プログラミングは"very very easy"だ。中学生でもできる。それは天才だからじゃなくて、簡単だからだ。」というのを強く言っていたのが印象的だった。
残念ながらこのiTunesUのビデオはなぜか途中で切れたようになっている。


Lecture2

おもな内容は
-コースオーバービューの続き
-- Functional Programmingを学ぶ意味
-- コンピュータの抽象化
- -宿題や試験についての注意
-Schemeの使い方その2
-- 条件分岐
-- Applicative orderとNormal order

「Functional Programmingを学ぶ重要性の一つは、今日のプログラムが並列性を持つようになってきているからである。」とか、コンピュータの抽象化についての話と続く。
さらにSchemeの使い方が続く。主に条件分岐やApplicative OrderやNormal Orderなどの話がメイン
Functional Progurammingを行っている限り、Applicative OrderかNormal Orderかは関係ない。つまり結果が計算の順番によらないということを強調していた。並列処理プログラムを書くときの重要な考え方なんだろう。

宿題

さてビデオを見た後で、宿題に取りかかる。
Homework Week1を読むと、まず、教科書のセクション1.1と1.3を読むようにと書いてある。おおよそビデオで習ったことなので話はスムーズにす進む。ただし、1.3の内容は来週の予習となっている。

宿題はプログラムを書くものが多いので、環境を整える必要がある。コースのウェブサイトにあるリンクから各環境用のSTkをインストールする。授業で使われているScheme処理系はfirstやbfといった関数が予め定義されている。これはstk-simplyというプログラムを利用すればよいことになっている。(普通のSTkにはこれらの関数はない。)

宿題には教科書の一部の問題を解くようにと指示されていたり、その場に問題が載っていたりする。
ひとまず、Week1の宿題の問題をすべて実際に解いてみた。簡単なものもあれば、難しいものもある。
デバッグの方法がよくわからないので、うまく動かないと頑張ってどこが悪いのか探さなくてはいけない。慣れてくると意外とすんなりと書けるようになってくる。

アプリケーションの同期

腰を悪くして、しばらく自宅から離れて実家で生活している。

ノートパソコンを使ったり、実家にあるパソコンを使ったり。

いろいろやっているうちに、いろんな設定やらファイルが自宅のパソコン、ノートパソコン、実家のパソコンとばらばらになってくるようになってしまった。

というわけで、当然流れで、簡単にこれらを同期できないものかと考えた。

まずはブラウザ。最近Chromeを使い始めた。幸いなことにChromeはGoogle Accountさえあれば、同期機能を持っているため簡単に同期できる。


さて、次にVimの設定。ユーザーフォルダに_gvimrcをいつもコピーして貼り付けて使っていたのだが、この際同期してみようと考えた。手っ取り早そうなのはDropBoxを使った方法。というわけでさっそくDropBoxアカウントを作成。これは簡単だ。
普通にインストールすれば"My DropBox"フォルダがMy Documents内に作成される。この中のファイルは自動的にDropBoxが同期してくれる。

ということで、DropBoxのフォルダ内に_gvimrcを作成しておいておく。

これで同期はできるけれど、Vimがこれを読んでくれない。というわけで、ユーザーフォルダ下からリンクを作成する。
Windows Vista, 7ではmklinkコマンドが使える。Windows XPではfsutil hardlinkコマンドが使える。

Windows Vista,7なら
mklink [ユーザフォルダ]\_gvimrc [DropBoxフォルダ]\_gvimrc


Windows XPなら
fsutil hardlink create [ユーザフォルダ]\_gvimrc [DropBoxフォルダ]\_gvimrc

となる。

とりあえずこれでVimの同期は完了した。


さてこれからは、Thunderbirdやらなんやら、はじから同期の方法を考えていこうと思う。

セキュアソフトウェア


「セキュアソフトウェア」 Greg Hoglund / Gray McGraw トップスタジオ訳 日経BP社
を読んだ。

結論からいうと、読む価値はあまりない本だった。
自分のレベルに比べて、内容的に不十分であるとか、簡単すぎる内容であるとか、一般的すぎる内容であるなどという意味ではない。
文章の構成、説明の仕方、翻訳これらの悪さが相乗効果的に内容を分かりにくくしており、さらにそこから得られるものを極端に減らしている。

まず翻訳が悪いのは一目瞭然で、おそらく訳者も自分が何を書いているのか分かっていないのだろう。単純に英語をそのまま翻訳しただけになっており、そのためこちらにも何を言いたいのか分からないところだらけになっている。
「SQL Injection」→「SQL挿入」と訳すなど明らかに分かっていない訳が多々見られる。

原著でどうなっているかは分からないが、サンプルとして載っているソースコード一つとっても酷い。技術的に間違っているとかではなく、インデントがきちんとされていない。ifブロックの中身の一行目はifと左がそろっていて、2行目はインデントされている。こんなの基本中の基本だろ。

構成面でも物事の順番が一貫しておらず、まったく意味不明になっている箇所が多い。さっきまでの話の流れと今読んでいる部分の話の流れが全然つながっていない個所が多い。なぜ、いまそれを説明しているのか全く分からない。その場で筆者が思いついたことを並べて書いているようにしか見えない。

そういったことを顕著に表わしていると思う例としては、「boronタグ」という言葉について180ページで「boronタグがあるかどうか調べたいことがあります。」とあり、それまで一切boronタグの説明がないにもかかわらず当然分かっているかの如く文章が続く。そして300ページには「もう一つ、時間を節約する優れた技法として、boronタグという手法があります。この手法では、・・・」とboronタグの説明が始まる。言葉の説明の前に、それを使った内容が出てきてしまっている時点で、何も考えられていないとしか思えない。

こんな調子で、ばらばらと知識が適当な順番で並べられていて、翻訳も意味の分からない部分が多いため、ある程度の前提知識(ああ、これはあのことだろうと分かるような)がないと読み進められない。
すでに様々なソフトウェアの攻略法について知識があれば、なんとなくああ、これはあれのことかとか想像しながら読める。

リファレンス的な本にできるかといえばそうでもなく、何か新しい知識を体系的に身につけるために読める本かといえばそうでもなく、役に立たない。すでに分かっている人がフルに頭を使って著者の言いたいことを想像し、そのうえで知らないことを身につけていくという読み方ができないと、ここから何かを得るのは難しい。

最後の方のバッファオーバーフロー、Rootkitに関しては内容が比較的あるのである程度わかっている人なら読む価値のある部分だと思う。というか、なんとなくこの人たちが書きたかった部分は、ここだけであって、そのほかはあとから埋め合わせただけなんじゃないかとも感じられる。

個々の内容は知らないことも多いし、得るものも多いと思うので、もう一度構成をし直して、何をどういう順番で伝えるかということを考えて、翻訳もセキュリティやコンピュータについてある程度分かっている人が関って、作り直せば十分価値のある本だとは思う。

Amazon.comの原著のレビューを見ると、やはり技術的な視点で見ると期待外れだというところが大きいようだ。どちらかというとソフトウェア攻略の概要であったりどんなものかを知るという点で評価されている。しかし、実際にはIDAのプラグインの書き方が載っていたり、自作のデバッガの作り方が載っていたりと、やはりそのあたりのこの本の方向性がはっきりしていないことが見て取れる。

出るかわからないけど第2版に期待。

ラムダ関数

Visual Studio 2010の新機能にラムダ関数のサポートがあるらしい
http://msdn.microsoft.com/ja-jp/library/dd293608.aspx

個人的にあんまりラムダ関数に慣れ親しんでいないせいか、C++で書いてて、こういう風に書こうという発想にならないような気がする。

ただ、ラムダ関数自体はRubyとかでプログラム書いていると便利なのは確か。このドキュメントにあるように、C++で同じことやるには関数オブジェクトとかになるけど、わざわざクラス定義が必要になる。

でも、C++ではちょっと使うのが気が引ける。他人が読めなくなるだろう、きっと。

描画キャンパスと図表番号 その2

昨日の続き。

Wordの描画キャンパスとその図表番号をきれいに配置する方法を考えていたのだが、結局結論としては、描画キャンパスを右クリックして図表番号の挿入をすることをやめるべきということのようだ。

右クリックで図表番号を挿入してしまうと、勝手にオートシェープが作られてしまうだけでなく、図表番号がテキストボックスの中に入って、そのテキストボックスはレイアウトが「全面」になる。非常にレイアウトしにくい。また、なぜかテキストボックスの中の図表番号は、文章全体選択時に、範囲外になってしまって、「フィールドの更新」で番号が更新されない。これは致命的だ。

図表番号は図表番号用のスタイルを作って、一つの段落で表せばよいのだという結論になった。

描画キャンパスも、図表番号も一つの段落として配置して、それぞれに適当なスタイルを適用しておけば、比較的きれいに行く。(両方とも中央揃えにするなど)

描画キャンパスの段落のスタイルには、「段落」→「改ページと改行」の「次の段落と分割しない」にチェックをしておけば、描画キャンパスと図表番号がページの境界で分割されることがなくなるので、そうしておくのがよい。

描画キャンパスと図表番号

Word2007の理解できない仕様が一つ。

描画キャンパスをつくって、それに対して図表番号を挿入した時にバックグラウンドで起きる挙動について。

まず描画キャンパスをつくると、それは行の一要素として挿入される。わかりやすく言えば描画キャンパスは1文字として扱われる。一つの段落にすることもできるし、文章の行の一部にすることもできる。


このように、1行の一要素となる。

それだけを段落にすることもできる。



この場合その前後の行間などは、その行に適用するスタイルを変更すれば変えられる。そして、描画キャンパスの高さを変えたとしても、行の高さが変わるので、前後の文章は自動的に描画キャンパスの前後にきれいに配置される。

また、描画キャンパスは文字の回り込みなどの指定ができる。説明したように、デフォルトでは、1文字としてレイアウトされるが、周りを文字が囲むように配置することもできる。描画キャンパスを右クリックして「描画キャンパスの書式設定」→「レイアウト」を選択する。こうするとデフォルトでは「行内」が選択されているが、「外周」とすることで、以下のように文字の回り込みができるようになる。





ここまではよい。

さて、通常私が描画キャンパスを使うときは、それだけを一つの段落にして、レイアウトはデフォルトの「行内」にした状態で使う。仕様書などで図を入れるときにはこのように回り込みなどさせず、独立して図を配置して図表番号を付ける。
図表番号は、描画キャンパスを右クリックして「図表番号の挿入」を選択すればよい。次の図のようになる。


図表番号は、一つのテキストボックスとして作成され、ちょうど描画キャンパスの真下に配置される。しかし、この図のように、前後の行間が十分でないと、次の段落の文字に図表番号がかぶってしまったり、近づきすぎてしまって体裁が悪いことがある。
ここで考えられる対策としては、描画キャンパスの前後の行間を空けることというとこになる。行の上も下も均等に空けたいと考えて、たとえば2行分上も下も行間をあけることにして、描画キャンパスのある段落を設定すると次のようになる。


うまくいかない。上下とも2行空けたつもりが、描画キャンパスの下側だけ大きく開いてしまっている(これは4行分空いている)

今回の例ではこれだけのことなのだが、実際にレイアウトをいろいろしようとすると、とにかくごちゃごちゃになる。

これは、図表番号を描画キャンパスに付けた瞬間に先ほどの「行内」という設定が変わってしまうことが原因である。描画キャンパスの書式設定をみるとわかるが、「前面」になっている。「前面」というのは文字と重なって前面に表示されるということだ(文字のレイヤより上のレイヤに浮いているイメージ)。では、なぜ、描画キャンパスに図表番号を入れたときに、描画キャンパスの後ろ側に文字が入りこまずにそのまま表示されていたのかというと、図表番号を入れた瞬間にWordは、「前面」に変更するとともに、その場所にまったく同じ大きさの透明のオートシェープを作っているためだ。
その結果、先ほど上下の行間を空けたのはその透明のオートシェープの上下ということになり、描画キャンパスは「前面」なので当然その場にとどまる。つまり下の図のような関係になってしまう。


そして、なんだかわけがわからなくなってしまう。仮にこのオートシェープを消してしまうと、「前面」が保たれたままであるために他の文字と重なってしまう・・・。



もうここまでくると、これらの関係性をしっかり理解していないとレイアウトできなくなってしまう。

修正するのは簡単で描画キャンパスのレイアウトを「行内」に戻して、オートシェープを消し、上下の行間を適当な量空けて、そこに先ほど入れた図表番号を入れればよい。

これはどういう仕様なのだろうかと、戸惑うが、このように使ってほしいということなのだろうか。はっきり言って図表番号を描画キャンパスに付けた時、これだときれいにレイアウトできないと思うけど、そうじゃないんだろうか。私が知らないだけか。なんかもっと違った考え方があるのだろうか。

apt-getのファイルのインストール先表示

apt-getでインストールしたパッケージのインストール先一覧を用事するには以下のコマンドを使うらしい。

 > dpkg -L packagename

答えにたどり着くまで結構時間がかかった。

Linuxを少しずつ使い始めてから2週間。おそらくUbuntuというよくできたディストリビューションのおかげだと思うが、不便であることはない。むしろ、いろいろできて便利だ。

Ubuntuではapt-getというコマンドを使ってパッケージというのをインストールしてソフトウェアの管理をするらしい。Windowsでいうところの、「プログラムの追加と削除」だ。で、いろいろインストールして、そのインストールしたファイルを確認する必要があったのだけれど、ファイルがどこにあるのか分からないという自体が発生した。
Windowsは基本的にプログラムのファイルは全部"Program Files"にインストールされるし、そうでなければ、Cドライブ直下などのわかりやすい場所にあるし、迷うことはない。
慣れの問題なのかもしれないが、はっきりいってLinuxはどこにインストールされるのかが全然わからない。一つのプログラムがいろんなところに散らばってインストールされるというのも、長年Windowsを使っているとなんだかよく分からない。長年使っていれば、実行ファイルはここで、設定ファイルはここで、と分かるのかもしれない。

とは言っても、apt-getというコマンドがあるんだから、きっとパッケージのインストール先一覧を表示してくれる機能があるだろうと思って、apt-getの使い方を見たけど、インストールやらアンインストールのかの操作しかできない。

apt-getをたよりにWebの検索をしてしまうと意外にこの答えにたどり着けない。結構時間がかかってようやくdpkgでそれができると分かった。

apt-getコマンドを使うんじゃないのか。なんだか分かりにくいなぁなんて思うけど、結局慣れの問題だ。apt-getはその名のとおり取ってくるだけなのか。

最短経路の本



「最短経路の本」R.ブランデンベルク P.グリッツマン シュプリンガー・ジャパン株式会社

を読んだ。

基本的にはグラフ理論を現実的な側面から解説している本。レナという女の子が、コンピュータと話をしながら、グラフ理論やアルゴリズムについて学んでいくというストーリー。

最短経路
アルゴリズムの時間計算
最小全域木
オイラーグラフ
マッチング問題
中国人郵便配達問題
ハミルトングラフ
巡回セールスマン問題

といった内容を、図などを交えて、対話形式の話を読みながら学べる。
教科書のような作りではなく、章が比較的短くまとめられていて、しかも一つ一つの章の内容も難しすぎないため、非常に読みやすい。しかもいつの間にか一通りのグラフ理論の概要は理解できるようになっている(と思われる。)

グラフ理論ばかりではなく、チューリングや、オイラーなどの人物の逸話なども載っていて飽きない作りになっているし、何よりそれによって頭が疲れないようになっている。頭を使って考える部分と、少し休んで読める部分が交互にあるため、また次の章を読むときにも、エネルギーが残っている。

ただし、一つ一つ理解するには、それなりに時間がかかる部分もある。たださっと読んだだけでは理解できない部分もあり、頭を使って読み進めないと、次の瞬間には何を言っているのかわからなくなるようなことも多い。そういう意味では、教科書を進めるときのように、1ページ1ページ確実に理解して前に進むべき本だと思う。

主人公のレナは、数学が苦手な女の子の役割だが、少なくとも数学がそれなりに得意だった僕よりもよっぽど数学ができるという点はちょっと・・・と思うところはある。なので、まったく数学が苦手な人にはちょっと難しいかもしれない個所もある。(数学的に難しいというより、その場で自分で論理的に考えて、そこで言われていることを理解する力が必要になる。)

この本を読んだ後に、グラフ理論の教科書的なものを読んでいるが、この本を読んだ後で、教科書を読むのは非常に効率が良いと思う。教科書は数学的に正確な言葉で書かれていたりして、概要をつかむには、一つ一つを理解するのに時間がかかる。一方で概要が分かっていると、教科書はその概要を数学的に正しく書くとこうなるという説明として読めるので、頭の中のイメージをすぐにその式につなげることができる。式からイメージをつくるより、今あるイメージが式の中でどう表現されているかを考えるほうが楽だと思うし、この本はよい入門書になると思う。

最後の3章(全体の1割程度)は僕には難しすぎて理解できなかった。というより、個人的にはちょっと説明が雑すぎるんじゃないだろうかと思うところもある。おそらくこれですべてを理解してもらおうと思っていないというところはあると思うが、理解できない言葉(「1-木」ってなに?)ができたりして、説明されているようだけれど、理解できない。というわけで、最後の3章は読んでいない。

全体として、現実的な問題を解決するということを題材にして、説明されているので、その意味もはっきりしていて目的をもって読める。グラフ理論がどんなものか知りたい人、アルゴリズムに興味がある人は読んで損はない本だと思う。

Ubuntuでキーボードの配置変更方法

環境はUbuntu 10.4

xmodmapを使えばキーを入れ替えられる。

設定ファイルを指定して
> xmodmap file

とコマンドを入れればよい。設定ファイルの中身は、たとえば、CtrlとCapsを入れ替えるなら


remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

と書かれた「file」を用意すればよい。ただし、gnomeの場愛、xmodmapを使わなくても入れ替える機能がある。「システム」->「設定」->「キーボード」->「レイアウト」->「オプション」->「Ctrlキーの位置」といくことで、Capsとの入れ替えを選べる。なので実際にxmodmapの使い方は、この「オプション」のリストに内容なキーの入れ替えを行いたい場合に使うのが良さそう。

今回は、日本語キーボードの「無変換」を「Windowsキー」と同じ挙動をさせようとした。Gnomeの場愛「Windowsキー」は「Super」というKeysym(キーの名前)になっているようで、これを使うといろいろショートカットが設定できるで、スペースのすぐ左にある「無変換」をこのキーとして利用できるのは便利だ(それに、個人的にWindowsでもそのような設定にしているからそうしたい。)

設定ファイルには
keysym Muhenkan = Super_L
とした。(各キーがどのようなコードだったりKeysymに割り当てられているかはxevコマンドで確かめられる。)
設定ファイルの書き方はここが詳しい

さて、しかし、これだと毎回ログインの度にこのコマンドを行わなくてはいけない。
Ubuntuの場合ログイン時に勝手にこのxmodmapを読み込んでくれるようになっている(UbuntuというよりGnomeの機能か)
ホームディレクトリに「.Xmodmap」というファイルを作成して置いておく。その中にキー設定を書いておけばよい。
このファイルを作って再ログインすると、下のようなダイアログが表示される。


「.Xmodmap」を選択して「読み込む」をクリックして、自動的に読み込まれるようにする。「次回からこのメッセージを表示しない」をチェックしておけば、それいこう「.Xmodmap」がログイン時に自動的に読み込まれる。あとは好きなようにこのファイルを設定すればよい。

ところで、このダイアログでの設定はどこに保存されているんだろうか、と疑問になり、それも調べた。実は、自分でやっているときに、このダイアログが表示されて何も読み込まない設定にして、OKを押してしまった。それ以降ダイアログは出ないし、どこで読み込む設定をしてよいのか結構時間がかかった。

この設定にはgconf-editorを使う。ターミナルから、そのまま起動すれば出てくる。


Windowsでいうならレジストリみたいな感じだろうか。ツリーから
「desktop」->「gnome」->「peripherarls」->「keyboard」->「general」
を選んで、その中の二つの値を見る。
「known_file_list」と「update_handlers」の二つ。
「update_handlers」は起動時に読み込むファイル名を書けばいいらしい。リストなので複数のファイル名を書き込める。あとから、他にも読み込むファイルを追加したい場合にはここに書けばよい。

「known_file_list」はおそらく先ほどのダイアログに出てくるすべてのファイルのリストだと思う。このリストを空にすると、また起動時に読み込むファイルを選択するダイアログが表示されるようになる。

これで、読み込むファイルを変更したくなったりしてもまたできる。

screenコマンドでVisual Bellを無効にしたいとき

最近Ubuntuを使い始めていろいろやっている。Linux自体まともにクライアントとして使うのは初めてで、いろいろ設定して使いやすくしている中で、問題がでてくるので、解決したものからブログに。

環境はUbuntu 10.4

screenコマンドは一つのターミナルで複数の対話シェルを使えるようにするようなものだけれど、切り替えたときから、VisualBellが有効になってしまっていて、ちょっと間違えると画面がチカチカしてよくない。

最終的に行き着いた結論は
$HOME/.screenrc
を作成しその中に
vbell off
と書いておくこと。これでscreen起動時にこれを読み込んでVisualBellをオフにしてくれる。


(2010/10/23 .screen -> .screenrc に修正。間違ってた。)

暗号技術入門



「暗号技術入門」結城浩 ソフトバンク クリエイティブ株式会社
を読んだ。

対称暗号
公開鍵暗号
ハッシュ関数
メッセージ認証コード
デジタル署名
疑似乱数生成

これらを題材に順番に説明して、現在の暗号技術のなかでどのように使われているかを説明している。

どのように使われているか、どのような意味を持つか、なぜそれを使うのか、またこの技術で解決できない問題は何なのかということを順番にわかりやすく説明している。
暗号の作成者、実装者視点ではなく、利用者視点で書かれている。
という意味で、自分でプログラミングで直接暗号を使う必要はないけど、なんだかいまいち暗号通信がどうなっているのかよく分からない、HTTPSがどうして安全なのかよく分からない、そもそも安全なのか不安だという利用者向けの入門書だった。

個人的にはもう少し暗号技術その物の導入を期待したので、ちょっと物足りない感じだった。公開鍵暗号、デジタル書名の使われ方が分かっている人であれば、得るものは多くはないかもしれない。もう少し暗号そもののの説明が欲しい感じがした。ブロック暗号の話はかかれているが、ストリーム暗号は言葉が出てきているだけで具体的な説明はなかったりもする。

暗号技術全体の像を掴む上ではいいかもしれない。ただし、ちょっとページ数をかけすぎている気がする。それだけ丁寧だということはあるけれど。

もう少し簡単に、全体像を掴みたい人は「マスタリングTCP/IP SSL/TLS編」がよいと思う。プロトコルに関する本ではあるけど、最初に基本的な暗号全体に関する説明がある。これを読んで、もうちょっと詳しく、または丁寧な説明が欲しい人は「暗号技術入門」を読むのがいいと思う。

東大でもOCW

ここのところオンラインの授業について書いているが、東大でも数年前から授業を配信しているらしい。

今日のニュースにはiTunes Uに参加するという記事があった。
iTunes Uは大学の授業や教材を配信する目的で設けられたものらしい。

東大のコンテンツはStanfordとかUCBerkeleyに比べるとちょっと少ない感じがするけど、これからきっといいものが出てくるんだろう。

こんな素晴らしいコンテンツはみんな利用すべきだ。東大に行けなくたって東大の授業受けられるんだから、すばらしい。まあ実際にそこで入学して受けるのとは、環境などの点で異なるかも知れないけど、これだけの教育機会が得られるというのは本当に素晴らしいと思う。

ただで授業を!

前回のポストで、フリーで受けられる授業をまとめるといいかもしれないということを書いた。

やっぱり、すでにやっている人がいて
http://freescienceonline.blogspot.com/
にかなりたくさんまとまっている。僕が知っている奴は全部ここにあるし、ここにあってこれいい、っていうのも多々ある。

すごいのは、これを書いている人はこのほかにもブログを持っていて、それはプログラミングに関するブログだったりする。そして、その中で実際にこの授業を端から受けてそのノートや、内容を公開している。かなりシリアスにオンライン授業を受けていて、そのノートは普通の授業を受けるのとまったく変わらないような内容になっている。
アルゴリズムの授業を受けた内容は以下にまとめられている。(約1年かけてすべての授業を受けて、それぞれブログに書いている!すごい。)
http://www.catonmat.net/category/introduction-to-algorithms

ぜひ有効活用したいとともに、どうようのまとめページを作りたいと思っている。

パズル

ヘルニアで寝込んでしまった。早1か月。いまだに10分以上立ったり座ったりはできない。
つらい・・・。

まあ、そんなことを言っていてもどうもならないし、病院に行ってはいるので、そこで言われるようにするしかないということで、勉強をしようと思って、本なりビデオなりを見ている。

そんなとき、以前にFacebookの採用情報欄にパズルが載っていたのを思い出した。プログラミングの問題が載っていて、それを解いて送ると、まあ、採用に少しは考慮してくれるみたいな感じのやつ。
ただし、結構難しい。

というわけで、今回はこれをやってみることにした。
http://www.facebook.com/careers/puzzles.php#!/careers/puzzles.php?puzzle_id=8
Peak Trafficという問題。

いろいろアルゴリズムなどを調べながらやった。
今回はちょっと1日当たりパソコンを触っていられる時間も限られているので、2週間ぐらいかけてちょっとづつ調べたり、プログラム書いたりして完成させた。

Facebookにこのトピックに関しての掲示板があったのでそこも参考にした。すでに解いている人が、テスト用データやどのくらい処理に時間がかかったかなどを載せている。
http://www.facebook.com/careers/puzzles.php#!/topic.php?uid=15325934266&topic=6943

とりあえず、今日Facebookに送ったところ、正解とのこと。扱ったことのないデータ構造やアルゴリズムだったのでそれだけでもかなり勉強になった。

ただ、何日か前に一応答えを出せるプログラムは書いたのだけれど遅いのが気になって少し何とかならないかと挑戦したけど、だめだった。
さっきの掲示板に投稿している人は、あるテストデータ(60MB程度)を処理するのにPythonで書いて、10秒以内だそうだ。ちなみに僕のはRubyで書いて6分;;。お話になりません。

どうしたらいいんだろうと考えたけど、だめだった。まだまだ考えられる余地はあるので、まだがんばる。
PythonとRubyの差も多少はありそうだが、そんなレベルの違いじゃないな。

ちなみに、そんなときに出会ったのが以下のレクチャー
(これ自体はこのとはの直接の答えではないけど、何か得られるものがないかと思って見た。)
この前のMITの授業といい、こんなのが見られるなんて何て素晴らしいんだ。
ほかにもUCBerkleyのStructure and Interpretation of Computer Programを使った授業もYouTubeで見られる。
この辺は、どこかのページにテキストブックとともにまとめておく価値がありそうだ。



Vimの不明な挙動

今日、とあるファイルをVimを使って編集しようとしたら、なぜかテキストフォーマットが効かない。
XMLだったのだけれど、色がついたりいつもなら自動的にするはずなのに。

いつもと使っているPCが違ったので、なんかVIMRCとかがおかしいんだろうとか、そんな風に思って、
いつもの設定にファイルを上書きしたりして、戻した。

んー、でも治らない。なんでだ。
Vimはここから落としてきたもの。
http://www.kaoriya.net/

んで、仕方なくいつも使っている環境と見比べながらいろいろ試した。
バージョンが違うのか、VIMRC,GVIMRCの場所や名前がおかしいのかなど調べたけどよくわからず。

新しい環境は、Windows 7で、僕はVimのファイルをProgram Files下に全部コピーしていた。
なんとなくそれがだめなのかなと思って、すべてC:\直下に移動。
するとうまくいった。
あら、どういうことだ。でもなんかおかしい。
で、今度は、Program Files下だけれど名前を変えてみた。そしたらうまくいった・・・。

結局行き着いた先はVimを入れているフォルダの名前を1文字変えるだけ。それだけでうまくいく。

C:\Program Files\Vim72

C:\Program Files\Vim7
にするだけでいい。というかこうじゃなくてもVim72じゃなければいいみたい。
ということで
C:\Program Files\Vim
とした。そういえば前の環境もこの名前にしていた。

でも、これだけで状況がこんなに違ってしまうってどういうことだ?
Vim本体がC:\Program Files\Vim72という名前に対してセンシティブなのはなんでだ。

ちなみに環境変数なんかも見てみたけど、とくにこれらの値はなかった。ほかに考えられるのはなんだろうか。

誰か知ってたら教えてください。

ViEmuでCtrl+CやCtrl+Vを有効にする

Visual StudioでViと同様のキー操作を可能にするためのツールにViEmuがある。これを使うとほとんどViと同様の操作でテキスト編集ができるため、Viを普段使っている人にはとっても便利。

ただし、デフォルトだとCtrl+CやCtrl+VはViのキーバインドではなく、標準のコピー、ペーストになっている。
Ctrl+Cやコマンドキャンセル、Ctrl+Vはブロック選択なので、使いたい人は使いたいだろう。

実は、これらを有効に(つまりViと同様のキーに)するのは簡単。

Visual Studioのメニュー
「ツール」→「オプション」と選択し、ダイアログで
「ViEmu - General」のタブを開く。「Keyboard...」を選択し以下の画面へ。





重要なのは右下の「Key scanned, with Ctrl...」とあるテキストボックス。
ViEmuはここにある文字とCtrlの組み合わせが、VisualStudioとViとぶつかるかどうかをスキャンする。

たとえば、このテキストボックスに「C」とある場合、ViEmuは「Ctrl+C」がVisualStudioとViとで衝突が起きるかどうかを検出する。逆にこのテキストボックスに「C」がなければViEmuはそれについては何もしない。つまりVisual Studio標準のままにする。

デフォルトでは、このテキストボックス内にはVとCは含まれない。つまり、そのまま放置しているということだ。

というわけで、この中にCとVの文字を上の画像のように入れる。そして「Apply」キーを押す。

ただし、これだけではViEmuはまだこのキーバインドを入れ替えない。
このダイアログボックスの右上のリストには、衝突が検出されたもののリストがある。

これを置き換えたい(つまり、Viのキーバインドにしたい)場合には、その下にある「Save and Remove」を押す。

これで、完了。


このダイアログのなかのリストとボタンの関係は、若干直観的ではない。理解するまでにちょっと時間がかいかる。
とりあえず、Ctrl+VやCtrl+Cを有効に(Viと同じに)したければ上のことだけやればよい

Windows 7でSMBサーバにつながらないとき

Windows 7から、Linuxで動作しているSMBサーバにつなげようとしたらつながらないという問題に遭遇した。
Windows XPとかならちゃんと見える。

いろいろ調べた結果よくわからないけど、以下のような解決方法

http://www.tomshardware.com/forum/75-63-windows-samba-issue



Control Panel - Administrative Tools - Local Security Policy

Local Policies - Security Options



Network security: LAN Manager authentication level
Send LM & NTLM responses

Minimum session security for NTLM SSP
Disable Require 128-bit encryption



とりあえず、これでつながるようにはなった。セキュリティ上問題があるかどうかは知らないけど。

たまには頭を

最近はあんまり理系っぽいことしていないなぁということで、数学の問題に挑戦しようと考えた。

大学入試問題なんて解けるかなぁと思って今年の東工大の入試を見てみた。
で一番取っつきやすそうなやつを選んで解いた。これ。
http://www.j3e.info/ojyuken/math/php.php?name=titech&v1=1&v2=2010&v3=1&v4=3&y=2010&n=3

きっと、途中で分からなくなって終わるんだろうなぁと思ったら、20分程度で解答できた。答え見たらあってた・・・。

あれ?こんなに簡単だったっけ?入試・・・。もっと苦労した覚えがあるんだけど。これが特別なのかな。

んー、それにしてもさすがにこの問題はサービス問題すぎる気がする。

久しぶりの授業

今日は会社から早めに帰れたので受講。
この前見つけたアルゴリズムのやつ



うーん、すばらしい。勢い余って線形代数も受講



これまたすばらしい。英語なのに大学の時に受けた授業より分かりやすいってどういうことだ。まあ、まだ簡単な内容だからかもしれないけど。

これからも続けて受けていきたい。

MacでHHKBキーボード

iPadの購入を機に、ちょっと昔買ったMac Miniをいじっている。
キーボードはHHKBなんだけど、なんか接続すると英文字列入力時に配列がAsciiになってしまう。
Shift + 2が@になる感じ。
僕はずっと日本語キーボード配列だから、そうしたい。
でもなんだかぜんぜん設定いじってもできず、かれこれ数ヶ月放置していた。

んで今回、またチャレンジ。
http://plus-alpha-space.cocolog-nifty.com/blog/2009/12/windowsjisleopa.html
ありました。やりかた。
ただ、・・・なんでこんなに難しいことしなきゃいけないのって感じはするけど。

しょうがない。やりました。慣れないファイルシステムやらなんやらで、とにかく時間がかかった。
(Finderでルートディレクトリを見ても、ターミナルから見るルートディレクトリと様子が違うのはなんで?見る人が見れば一緒なのか)

でも、くじけずがんばった。意味わからないところだらけだけど、やった。

できた!

これからちょっとずついじっていく。次はOpenLDAPのインストールに挑戦

合格

プロジェクトマネージャ試験受かった。これはかなりラッキーだ。
午前2 60点 午後1 60点
大学からこの点数は変わらないな・・・。

あと、RSA Conference Japan 2010で講演することになりました。

コードレビューの仕方

今日自分の書いたコードをレビューしてもらった。

ほんの数十行のコード。
コードレビューをお願いする直前に、もう一度よく見直した。そしたら1つバグが見つかった。
で、ちょっと思った。このバグはコードレビューに出したら見つかっただろうかと。
見つかったかもしれないし、見つからなかったかもしれない。

それは分からないのだけれど、もし自分がこのコードのレビューをしたとしたら、見つけられた可能性は・・・やっぱり5分5分だと思う。(少なくとも僕は見逃しそうになったわけだし)

問題はコードレビューの意図だと思った。僕が見つけたバグはそのコード全体の全体の動きに比べると小さなもので、ある意味そのバグがあっても、ほとんどの場合うまく動いてしまう。

1つ1つの命令の詳細をレビューで追っていくと、ものすごく時間がかかるから、たいていの場合、自分が普段気をつけているいくつかのポイント(ポインタがNULLだったらどうかとか、メモリは開放されているかとか)を中心に見ていくことが多い。
やっぱり細かいところを1つ1つ追っていくのは骨が折れる・・・って最初から思って、やっぱりあんまり真剣に頭を使ってひとつひとつ追っていかない。(これは人のコードを修正するときの、最初のオーバーヘッドの重たさに似ている)

で、ちょっと考えた。なんとか頭を使って読んでもらう方法はないか。レビューアーには嫌われる方法かもしれないけど、以下の方法。

「あらかじめバグを仕込んでおいて、それを伝える」

最低1個はバグがあると言っておけばいい。そうすれば少なくとも1つはバグを見つけてもらえる。同じ所かもしれないし、違うところかもしれない。でも、きっと頭を使ってやってくれるはずだ。

コード量がある程度多いなら、3つとかでもいいと思う。最低3つはバグが存在するのだから見つけられる。コード領が多ければ、別の3つを見つけてくれる可能性が高い。
バグが見つからなければ、見つかるまでやってもらう。でも、見つけられるだけの情報(関数の仕様とか)はちゃんと伝えなくちゃいけない

あと、埋め込むバグは難しいものにしなくてはいけない。簡単なのだとみんなそれを見つけてくる。

整数オーバーフローとか、オフバイワンとか、ちゃんと考えないと見つからないやつがいい。

誰かやってみてください。で、どれくらい嫌がられるか報告ください。

結婚式二次会

明日は、結婚式二次会。
メールのお知らせにて
「当日は堅苦しくない服装でお越しください(男性スーツ、女性ワンピース、スーツなど)」
・・・え、スーツって堅苦しい部類に入りませんでしたっけ?w

素数

RSA暗号の話を読んでいて、ついつい素数のところで寄り道してしまった。
Wikipedia読んだり。
素数なんて最初聞いたとき、これに何の意味があるんだ?って感じがするけど、おもしろい数の集合なんだなぁと思う。
きっと数学をやっていくと、どんどんこういうおもしろさにはまるんだろう。

Wikipediaにある素数は無限個あることの証明なんて、高校の時にやった記憶があるけど、僕もこんなことを勉強していたときがあるのか、と思うと不思議だ。・・・何の役にも立ってないw

でもこれからRSA暗号の話を読んでいけばきっと役立つはずだ

技術力とは

技術というものを追求するとか、生かすとか、ITの世界では求人などでもよく使われるし、人と話しているときもよくでてくる。

さて、技術力を付けるというのはどういうことか。Windows APIをすべて覚えることか、Linuxのソースコードをすべて読むことか、数あるページングアルゴリズムについてそれぞれのメリット、デメリットを理解することか。

僕のアプローチは、技術力とかそういうものだけでなくてだいたい以下のようになる。
なぜ、今の形になったかを知ること。

「どうなっているか」を知ることよりも「なぜ、そうなったか」を知ることの方が重要じゃないか、というのが今回とりあえず言っておきたいこと。

だから、Windows APIがどうなっているとか、Googleのサーバーがどうなっているとか、そういうことは、まあまず知ることとして、なぜそのような作りになったのか(他のやり方の候補があったはずであるにもかかわらず)ということをしっかり理解できるだけの知識を身につける必要があるんじゃないかと思う。

3年で読む本

今後3年で読むべき本をリストアップしてみた。
いろいろなサイトを参考に。すでに持っている本がほとんどだった。
特に参考にしたのは以下のサイト
http://leoclock.blogspot.com/2009/09/blog-post_21.html

一番上にMolecular Biology of the Cellが紹介されていて、これは自分が求めているサイトではないと一瞬思ってしまった。(この本は生物の本で僕も持っていたけど、すでに後輩にあげてしまった。たぶん、生物やってる人で持っていない人はいないんじゃないだろうか)

さて、というわけで読むべき本リスト
  • アルゴリズムイントロダクション 1~2
  • 計算理論の基礎 1~3
  • 暗号の数学的基礎
  • 離散数学 コンピュータサイエンスの基礎数学
  • Windows Internals 5th Edition
  • モダンオペレーティングシステム
  • 詳解 TCP/IP Vol1
  • コンピュータの構成と設計 上下
  • 分散システム
  • Database Management System
  • 構造化コンピュータ構成
  • セキュアソフトウェア

数えたら全部で 6979ページあった。

すでにある程度読んでいて、分かっている分もあるので、本当にすべてを端から読むわけではないけど、きちんと理解していくには相当時間がかかりそう。
3年=1000日として、1日平均7ページだ。1週間に1回読むとすると、50ページほど読まないといけない。いままでの経験から、技術書を一度に50ページ読むことはほとんどできない。1週間に3回は時間を取らないといけないかもしれない。平均して1回17ページならなんとかなるだろうか・・・。1回辺りの時間は2時間。厳しいか。内容によるし、どれだけ自分で整理しながら読むかにもよるけど。

「コンピュータの構成と設計」と「構造化コンピュータ構成」はかなり内容がかぶりそうなので、とりあえず前者を中心に。
とにかく、基礎的なところを中心に。

この中でもっとも異色なのは「セキュアソフトウェア」。一応セキュリティ技術者なので、この分野のことを、具体的に一通り経験した方がいいだろうということで選んだ。教科書的な存在ではないので、ちょっと基礎からははずれる。そういう意味では優先度は低い。

ところで、このリストを作る過程ですごいものを発見してしまった。といっても、当然といえば当然なのかもしれないけど。
http://video.google.com/videoplay?docid=-2333306016564732003#
おそらくこれ、リストに一番上に上げたアルゴリズムイントロダクションの授業だと思う。
ただでMITの授業受けられるのか。感動的だ。
まだ、ちょっとしか見てないけど、役に立ちそう。

何より僕は本を読むより、授業の方が好きなので、これは助かる。

コンピュータセキュリティへの興味

CanSecWestで話をしたSEH Overwriteのエクスプロイトテクニックとそれに対する対策。
これはこれで、セキュリティという面でなんらかの貢献のできる内容なのかなぁとは思うけど、基本的にはやはり技術ありきでの話の内容になっている。
何らかの問題があって、それを解決するために調べてこの話をしたのではなくて、技術的にこういうことが可能であることを知ることが楽しいから、これを書いたということ。

コンピュータの利用や通信が安全になることには意味があると思う。ただ、現在存在するハードウェア、ソフトウェアの上に、安全性を築こうとする行為は、僕はあまり意味があるとは思っていない。
つまり、今回のSEHの話も、ものすごく小さな目先の話であって、こういうことをいくらやったところで、コンピュータを安全に(情報を盗まれないとか、不正アクセスされないように)使うことは無理だと思っている。

さて、一方ですばらしく安全なシステム、ハードウェア、インターネットが整備されていたら、僕はきっと楽しくないから、こういった内容について調べたりはしないだろう。

そういう適当さのある世界が好きだからインターネットやコンピュータが好きなのだと思っている。インターネットの世界も、僕が初めてインターネットを使い始めた当時(1996ねんごろ)の方が面白かったと感じる。
いろんな驚きがあったし、いろんな自由があった。いまでも自由だけど、あまりにも社会に影響しすぎている。

twitterとかも、みんなそんな自由さを求めているんじゃないかと感じることもある。(なんとなく適当に一言感じていることを言って、特に責任ある発言を求められるわけではない。)

今のネットワークや、個人PCに、それだけの安全性や責任を求める行為そのものに、僕は抵抗を感じているのかもしれない。今のままで十分楽しいと思ったり。

それは僕は基本的に性善説的な考え方をしているせいかもしれない。みんなで楽しく使えばいいじゃん、みたいな気楽なのりなのだ。

形式ばった、なんのミスも許されない、ちょっとしたミスでみんなからいろいろ言われる、そんな社会じゃ面白くないし、何にもしたいと思えない。悪い人もいるかもしれないけど、コンピュータそのもので人は殺せないし、いいんじゃないかって思う。

僕が大企業が向かない理由はこういうところにある。僕にとっては楽しく生きるうえでどうでもいいことが多すぎるんだ。
コンピュータの世界は中小企業のような自由さから、だんだんと大企業的な世界に変わっていっているように思う。

そのうち、コンピュータやインターネットにも興味を持たなくなるときがくるかもしれない。

情報の伝わり方

CanSecWest2010で話したことが少しだけ下の記事で参照されている。

問題は、ちょっと書いていることが、僕の言ったことと変わってしまっているということ。
"SEH OverwriteでASLRとDEPやその他のメモリプロテクションがバイパスできる"みたいなことを言ったように書かれているが、僕が言ったことの中にはASLRは含まれていない。
実際に、この発表の結論は、ASLRがこれらのバイパスを防ぐために重要な役割をしているということだった。スライドを一枚使ってきちんと説明したのに・・・。
おそらく、会場にいた技術的なバックグラウンドがある人たちにはきちんと伝わったはずだと思う。実際にその後のディスカッションでも何も認識に違いはなかった。

この前も、一部のニュースでASLRとDEP回避のゼロデイが出たみたいなのがあって、実際にはASLR回避は含まれていなかった。

話はだんだん大きくなってしまうのかもしれない・・・。

ところで、ASLRは単純に回避するのは難しい。
SEH Overwriteの場合、SEHOPと組み合わせると、かなり効果的だる事は間違いない。
ただ、ここの記事でも書かれているように、難しいことと不可能なことは違う。
実際にはDEP+ASLRの回避方法自体は例がある。まあただこれもSEHOPを組み合わせると難しくなる。
ASLR+SEHOP回避も、少しはExploit確率をあげるような方法はあるかもしれない。そのあたりを今度は調べてみようか。

CanSecWest2010 その4



日本人の方が写真を撮ってくれていました。ありがたい。というわけで一部アップロード

CanSecWest2010 その3

3日目。(CanSecWestは二日目)

今日の最初のプレゼンテーションが僕ということで、昨日から緊張しっぱなしでひどかった。
全然眠れないし、何も食べられないし、こんなに緊張したのはいつぶりだろうか。

ただ、不思議なことにプレゼンテーションが始まってからは意外に落ち着いていた。始める直前までの緊張がひどかった。

さて、肝心のプレゼンテーションはというと・・・いまいちどういう反応なのかはよく分からず。英語なので、とにかく自分の話をすることに集中してしまっていて、周りを見ながら話ができないので、反応を確認しながらプレゼンテーションをする余裕はなかった。まあ、こういう風にすると、内容が伝わらなくなることが多いのだけれど。

最後に、質問ありますか?って聞いたら誰もいなかった^^;
まあ、なんというか、いまいち反応がよくなかったのは確かですね。

でも、終わってから結構いろんな人が話しかけてくれて、よかった。Twitterでもそれなりにいいこと言ってもらえてたみたいだし。
結構有名な企業の人たちも、あとから話に来てくれた。

というわけで、とりあえずこれで落ち着いて、あとはCanSecWest2010を楽しめる。
うーん、まあこんな感じなら、また発表しても悪くないような気がしてきた。させてもらえるかどうかは別として。
ただ、個人的には今回の発表は本当に大したことない内容なので、これより全然いいもの出せる自信はある。・・・時間があればね。

続く

CanSecWest2010 その2

二日目。

とりあえず朝ごはん。ホテルで食べる。
海外に来るとつい金銭感覚が狂う。30ドル近くしても平気で食べていたりする。2500円とかそういう値段なんだけど、日本だとちょっと食べる気しないかな。

朝食後はレジストレーションへ。10時開始のはずが10時30分に延期。
結構たくさんの人が集まってきていた。
んで、長い列に並ぶ。
全部で4列ぐらいきて、そのうちの一つに何ランで、受付近くに来て、気がついた。なんかみんな番号を言っている。そして列ごとに番号の範囲が割り振られている。
・・・ちょっと待て。番号なんてしらないぞ。どうやらスピーカーには伝えられていないらしい(笑)
んで、受付にそれ言ったら、一番左の列に並べとか言われた・・・おい。

というわけで並びなおし。

んでレジストレーションはなんのことはなく終わり、さてどうしようかとスケジュールをみると、1時まで何もない。今11時。その間何しよう・・・。

なんかみんなはそれぞれ知り合いがいるみたいで、いろいろしゃべったりしている。
僕は知り合いなんぞいないので、とりあえずホテルの前の公園でひなたぼっこ。気持ちがいい。

なんだか、イメージしていたのよりだいぶゆったりしているんだけど・・・。
周りは結構今は、まったり感全快な感じがする。

さて、もうすぐ最初のセッションが始まる。
どんな感じのプレゼンテーションなのだろうか。会場にもまだ行っていないので、明日のプレゼンテーションの参考にしよう。

続く

CanSecWest2010 その1

昨日からバンクーバー。CanSecWest2010に参加するために。

うれしいことに、飛行機がビジネスクラスになってくれたので、かなり楽に来られた。8時間のフライトもあっという間だった。
機内で「ゼロの焦点」という映画を見たのだけれど、推理小説的な映画なのに最後のほうが見られずに到着してしまった・・・。一番見なきゃいけないところなはずなんだけど。帰りの飛行機で見られたら見よう。

一日目は、とくに何もせず。朝10時について、昼ご飯を食べて(日本時間だと夜中なので夕ご飯)、とりあえず眠かったので寝た。

夕方からはCanSecWest2010のスピーカーが集まっての夕食会。とりあえずビール飲んだり、寿司食べたり(意外においしかった)して、周りの人たちとちょっと話したりして・・・。
まあ、誰も知らないし、ドイツ語やらフランス語やら飛び交ってるし・・・じっと様子を見つつ食事という感じだった。

で、終わった後は、夜なんだけど、日本時間だと昼間・・・というわけでお昼寝。
まあ、夜中の4時ぐらいに起きてしまったので、一応あさってのプレゼンテーションの練習を少し。
一部修正したりしながら、やった。

ホテルはネットもつながるし、広いし快適だ。

続く。

わがままなプログラミング

前にも同じようなことを書いた気がするけど。

僕はプログラムは一人で書くべきだと思っている。一人の意志で、一人のためだけに。周りの人たちの意見などほとんどいらない。自分のために必要なら聞けばいい。人がその機能やプログラムが使いやすいと思うかどうかはとりあえず放っておけばよい。(受託開発とかは全然ここでは対象にしていない。)

これでとにかくVersion1.0~2.0までを開発する。ここまできてこれを利用する人がたくさんいるならそれは成功したソフトウェアだと思う。
一人で作るべき期間に、手伝ってくれる人がいることはよいけど、その人は単なる手伝いでなくてはいけない。意見は聞く必要はない。特に機能面においては。自分が思うように作らなくてはいけない。自分がほしい者を、自分が好きなように実装しなくてはいけない。

この作業はそのソフトウェアに情熱のある人であれば誰でもできる。一方で情熱のない人にはできない。そこがソフトウェアとしてよいものになるかどうかの分かれ道だと思う。
結局、人に言われて作るものに最高の情熱を注げるかと言えば、無理なんだ。

自己防衛

僕は完璧主義である。完全でないなら、あってもなくてもいいと思ってしまうことが多々ある。
一方で、完璧なものができあがるとは思っていないので、ほとんどのことについて途中で嫌になる。
それでも、そこまで異常な完璧主義じゃないので、ある程度自分で満足がいけば、そこで終わりにできる。

プログラミングもなかなか完璧にはいかない。未だにたった1つのクラス設計さえ完璧にできたと思えない。まあ、そもそもクラス設計の完璧ってなんだって話はあると思うけど。

さて、自分の完璧主義がどこから来ているのか考えてみた。
70%ぐらいは生まれつきそういう性格だったみたいだというのはある。
後の残りは、自己防衛から来ていると思っている。自分で納得のいくレベルで完璧になっていれば、人から責められないと思っている。だからそうしておかないと不安なのだ。そして、実は完璧(本当の意味で完璧でなくても、一見完璧に見えるもの)は結構つまらないものだから、人がそこにそれ以上関わろうとしないというのもある。小さいときにいろいろ冷やかしを受けたりして嫌な思いを指摘たぶん、そういうつまらないものにしておけば、楽だみたいなこともあると思う。

ただ、これは結構たいへんなこと。少しでも自分で自分に指摘できる箇所があれば、その時点でたとえ誰も責めていなくても自分で責めることになる。ずっとそこを考え続ける。

こういう性格はいい面に働くこともあるが、悪い面に働き出すとひどいことになる。ここ数年は悪い面に働いていることが多い。
でも、コンピュータの技術面ではよい面に働くことの方が多いと思う。
そういう性格だから今の仕事もできているのかなと思う。

ただ、あまり自己防衛的な使い方になっていたら、気をつけないといけない。無意味なことをやっているに違いない。でも、これも性格だからなかなか直らない。

100点満点で

仕事をしていて不安になるのは今自分がどこにいるかわからないからだ。
ふと気づくと、自分が不安で、怖かったりする。
その不安について、考えると、それは昔からの思考のくせによるもののような気がした。

100点満点で何点とるかというかたちで、いろいろな自分の作業の結果を見ることに慣れすぎているせいだ。満点が決まっている場合、自分がどれだけやったかが分かる。たとえ完全でなくても、自分はこれだけのことをやったのだと、自分で認識できて、じゃああとこれだけやれる余地があったのだと分かる。

仕事はそうじゃない。どこが100点満点とも分からない。どこまでやればよいということもない。80点もない。そもそもそういう尺度にならない。

自分が何をしたいのか、どこを目指したいのか、今やっていることに何を求めるか、それしか自分が判断できる尺度はない。

悲しい癖だ

CanSecWest2010

スピーカーに選ばれました。
http://cansecwest.com/speakers.html
怖いです。英語で話すんですか・・・。人前で・・・。何人ぐらい聞くんだろう。
ぜんぜん雰囲気がわからないから余計怖い。
会社の人にいろいろ聞いて予習しておこう。資料も作らなきゃいけないし、練習もしなくちゃ

次はプロジェクトマネージャ

次なる資格はプロジェクトマネージャに決定。
去年の段階ではあまり想像していなかったけど、仕事でプロジェクトマネージャをやることになって、いろいろ覚えなくちゃいけないことが分かって、だったら同時に取ってみようということ。
でも論文とか大変そう。勉強時間をしっかり取らないと。
feedSubscribe to my feed