今日、ある人からちょっとした相談を受けた。マネージメント的な話だったので僕に相談してきたようだ。
彼女は本当に悩んでいるようだった。ただ、いまいちその本質までは掴み取ることができなかった。話はするのだけれど、いまいちどこに問題の核があるのかがはっきりしない感じがした。
その理由の半分は、僕に当たり前のことが彼女にあたり前ではないからとか、そういう差からくること、もう半分は、どこに答えがあるのか彼女自身もよくわからないということ、じゃないかと思った。
(完全な僕の想像なので、僕の頭が悪いだけなのかもしれない。)
やりとりの中で、何となく「どういう風になったら、よいと思う?」と聞いた。まあ、その答えや、その後の結論は置いておいて、この質問が結構いろいろなことを教えてくれる質問なんじゃないかと思った。
僕は悩んでいる。これは確かで、ずっと悩みながら生きている。でも、正直何に悩んでいるのかが分からないのが現実だ。なぜ毎日、何かが足りないと思いながら生きているのか。それが何なのかが分からない。
さて、僕は「どういう風になったらよいと思う?」のだろうか。
「すごいソフトウェアの開発」ができれば幸せか、「グーグルに就職」できれば幸せか、「ノーベル賞をとった」ら幸せか、「日本一周旅行」ができたら幸せか。
なんとなく、こんな風になったらすごいなぁ、なんてぼんやりと考えているものを並べてみても、実はぜんぜんそれで幸せにならないことに気がつく。
一方で僕が悩んでいなかったころのことを思い出すと、この問いにはっきり答えられていた。
高校生の時は「勉強していい大学に入る」ことができれば幸せだったし、大学に入ってからは「ジャグリングが上手くなる」ことができれば幸せだった。だから、その当時僕にこの質問をしていたら、僕は間違いなく、この答えを言っていた。100%これを言っていた。そういうものがあったということだ。
そういう状態の人間は強いと思う。すべてのことに解決の道が見出せるし、そこに向かっていける。
あまり気にしすぎても答えはでそうにないが、「どういう風になりたいのか」という問いから自分を考えていくのもよいと思う。
My Daily Programming Life...
再帰処理と再帰手続き
「処理と手続きが混同される一つの理由は、ほとんどの一般的な言語(Ada, Pascal, C)の実装がすべての再帰手続きを手続き呼び出しの量だけメモリを消費するように設計されている空である。たとえ、その手続きが原理的に繰り返しであったとしても。その結果、これらの言語はdo,while,forなどの助けを借りてでしか繰り返し手続きを表現できない。」
SICPより(一部省略)。
再帰呼び出しを行う関数が、必ずしも再帰手続きではないということだ。つまり、再帰呼び出しをしても、たくさんのメモリを使わずに済む場合があり、それは繰り返し手続きとなる。
やっぱり、Cとかそういうものでプログラムを学ぶとこういったことに気づくことができない。それがすべてだと思ってしまう。文字列がNULLで終わるものだと思っているという類の、もうちょっとコンピュータの原理に近い部分の話の気がする。
つまりCなどの実装に影響を受けすぎて、それがコンピュータの動作だと思ってしまう。
こういうことを理解しておくことは重要だ。
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/
関数の表記 |-> "maps to"についての説明はなんとなく聞くことになるけど、SICP 69ページのFixed-Pointの計算でsquare rootを計算するところでその理解が必要になる。(詳しくは後述)
lamda関数については、その歴史から話が始まる。アロンゾチャーチという人が、数学を関数を元に説明しようとしたところから始まっている、というような話だった。その後、AI研究者のジョンJohn McCarthyが、その考え方をLispに取り入れたとのこと。
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
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が動かないときは、言われた通り、プログラムを修正すればよい。たとえその意味がまったく不明でも。
さっそくインストール
sudo apt-get install gdesklets
なんとも簡単だ。何が起きているかは知らないが、とりあえずインストールされる。
さっそく起動してみたが、なんとなくバックグラウンドで動き始めているようだけれど、すぐに死んでしまっているようだ。
コマンドラインから立ち上げると、tiling module not foundみたいなのが出ていたり、よく分からない。
Googleというものの威力をこういうときに思い知る。
http://www.rabblerouser.info/blog/?p=834
まったく同じだ。そして、この通りPythonプログラムを修正したら動いた。
Googleって空気みたいな存在になりつつある。あって当然過ぎて、なくなった瞬間にきっとみんな死にたくなるはずだ。
・・・でも考えてみたら僕はインターネットを1996年から使っている。まあ、当時の検索でも、それなりに使えていた気がするが、どうだろう。実際にはそのころトップ10に表示される検索結果で満足できることっていうのは少なかったのかもしれない。
話がずれた。とにかくgDeskletが動かないときは、言われた通り、プログラムを修正すればよい。たとえその意味がまったく不明でも。
工大祭へ
昨日から東工大の文化祭をやっている。ほぼ毎年ジャグリングサークルの様子を見に行っている。
だれか一人ぐらい知っている人がいるだろうと思って行ってみたが、一人もいず・・・。完全なaway感。
途中で知り合いを見つけて、話すと、やっぱり誰も分からない・・・と言っていた。
さて、最近はジャグリングだけじゃなく、研究発表なんかも見にいくようになっている。
今回は主に機械学習の研究室の説明を聞きに行った。
聞きに行って何か得られるということはほとんどないけど、どんなことをやっているのか聞くのは楽しい。そして、うらやましかったりもする。やっぱり僕もあそこに行くべきだった、と思う。
でも、もしかすると直接行っていたらそうは思っていなかったかもしれないし、難しい。
研究室発表で少し残念なのは、やっぱりあんまり詳しくは説明してもらえない所だ。誰を対象にするかによってしまうので、難しいとは思うけど、もう少し一つ一つ順を追って、どういうことが目的で、どうしてこういうことができるのか、というところを説明してもらえると嬉しい。
どうも、研究そのものの意味とかを、きちんと理解せずに説明しているところがあるようにも思う。何が大切なのか、何が新しいのか、他の同様の研究と何が違うのか、そんなところがもう少し分かりやすく説明されていると嬉しい。
何が新しいとか、他とどう違うか、というのは、説明し始めると難しくなりすぎてしまうのかもしれない。
Twitterの情報をまとめて、つぶやきのランキングをつけるなんていうシステムを作ったりしたらしい。もうすぐ公開されるらしい。
簡単には理解できる話ではなかったけど、彼らに負けないように勉強しようと思えたので、よかった。
だれか一人ぐらい知っている人がいるだろうと思って行ってみたが、一人もいず・・・。完全なaway感。
途中で知り合いを見つけて、話すと、やっぱり誰も分からない・・・と言っていた。
さて、最近はジャグリングだけじゃなく、研究発表なんかも見にいくようになっている。
今回は主に機械学習の研究室の説明を聞きに行った。
聞きに行って何か得られるということはほとんどないけど、どんなことをやっているのか聞くのは楽しい。そして、うらやましかったりもする。やっぱり僕もあそこに行くべきだった、と思う。
でも、もしかすると直接行っていたらそうは思っていなかったかもしれないし、難しい。
研究室発表で少し残念なのは、やっぱりあんまり詳しくは説明してもらえない所だ。誰を対象にするかによってしまうので、難しいとは思うけど、もう少し一つ一つ順を追って、どういうことが目的で、どうしてこういうことができるのか、というところを説明してもらえると嬉しい。
どうも、研究そのものの意味とかを、きちんと理解せずに説明しているところがあるようにも思う。何が大切なのか、何が新しいのか、他の同様の研究と何が違うのか、そんなところがもう少し分かりやすく説明されていると嬉しい。
何が新しいとか、他とどう違うか、というのは、説明し始めると難しくなりすぎてしまうのかもしれない。
Twitterの情報をまとめて、つぶやきのランキングをつけるなんていうシステムを作ったりしたらしい。もうすぐ公開されるらしい。
簡単には理解できる話ではなかったけど、彼らに負けないように勉強しようと思えたので、よかった。
VirtualBoxからVmwareへ
最近メインマシンをUbuntuに変更して使っている。
たまにどうしてもWindowsが必要になることがあるため、Virtualマシンが欲しいと思って、いままでVirtualBoxを使っていた。
ただ、なんとなくいまいちな感じがして、お試し版でVmware Workstationも入れてみた。
やっぱりVmwareの方が良い感じがする。
で、問題はもともとVirtualBoxで作ったハードディスクをVmwareにどうやって移行すればよいのかということ。
以下の方法で出きるらしい。
まず、qemuをインストール
その後で以下のコマンド
それなりに時間はかかるけど、これでいけた。あとはVmwareでマシンを作って、このHDDをつなぐだけ。しかし、VirtualMachineてよくできてるよあぁ、と感心する。
たまにどうしても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てよくできてるよあぁ、と感心する。