My Daily Programming Life...

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はその名のとおり取ってくるだけなのか。
feedSubscribe to my feed