My Daily Programming Life...

XVimの紹介

Vim Advent Calendar 2012 27日目の記事です。

XcodeでのVimキーバインドを実現するXVimの開発経緯と使い方をご紹介したいと思います。まず初めにURLだけ貼っておきます。
https://github.com/Jugglershu/XVim

さて、本題。ちょうど今から1年前、僕は友達ともにiOS向けアプリの作成を趣味で行っていました。当時僕はMacはあまり使ったことがなく、Objective-Cの個性あふれるシンタックスに苦しんでおりました。iOSアプリの開発なので、当然Xcodeを使うわけですが、シンタックスに苦しんでいるところへXcodeではデフォルトだとVimのキーバインドではなくEmacsのそれとなっており、そのままだと使い物になりません。

Vimのキーバインドにするにはどうしたらいいのか友人に聞いたら、「ない」との答え・・・またまた〜、そんなことないでしょ〜。まあきっとどこかの誰かがそういうの作ってくれてるよと、軽い気持ちでググり、いまどきVimキーバインドがないなんて、そんなわけが・・・「ほんまや!」

というわけで、ないわけです。とても不思議です。世界中のVimプログラマはどうやってiOSアプリを書いているのでしょうか。確かにVimオンリーで書くという選択肢もありそうです。実際、Cocoa.vimなるプラグインもあった(いまも動く?)ようですが、ちょっと使ってみた感じだとあまりうまく動きませんでした。なにより、Xcodeの補完機能や、その場でエラー・ワーニングチェックなどiOSアプリを書く上では非常に有効な機能を捨ててしまうのはあまりにも惜しいです。

しかし、なぜXcode向けのVimキーバインド(プラグイン)が存在しないのか。もしかするとXcodeがプラグインに正式に対応していないというのが大きな理由かもしれません。実際プラグインの作り方に関するドキュメントなどはどこにもありません。幸い、これまでWindowsでAPIフックなどのプログラムを書いてきたこともあり、自分で作ったライブラリさえXcodeプロセスに読み込ませられれば、あとはなんとかできる自信があったため、とにかくその方法を探しました。実はXcodeは内部的にはプラグインのサポートがされているようで、その機能を使うことでXcodeのプラグインを読み込ませることができることがわかりました。

ただし、分かっているのは作ったプラグインがロードされ、初期化時に特定のメソッドが呼び出されることだけです。ここからはひたすら試行錯誤。幸いObjective-Cは動的バインド言語であり、Xcodeのクラスやメソッドの名前などはすべて確認することができ、またどのようなメソッドが呼び出されているかも簡単なコードを追加するだけで確認できます。また、特定のクラスのメソッドのフックもバイナリを直接編集することなくObjective-Cのライタイムを頼って実現することができます。

そこから2週間ほどかけてとりあえず動くものを作りました。うれしいことに、テキスト編集自体の機能はNSTextViewやXcodeが内部的に使っているDVTSourceTextViewクラスに実装されており、キーイベントに対応させてそれらを呼び出すことで基本的な編集機能は実装できました。

それからいろいろな方の協力もあり、現在は以下の様にステータスバーがあったり、太いカーソルになったりと見た目も良くなっております。
だいぶ、Vimの話からずれてしまいました。ここからはXVimの便利な機能をご紹介したいと思います。XVimはVimのキーバインドを実現するためのものなので、Xcode上でVimのキーバインドで編集できることはごく標準的な機能です(まだまだ対応していないバインドはありますが)。一方でXcode特有の機能を使うために実装したXVim特有のコマンドもあります。

最も個人的に使う頻度が高いのが、メニューの特定のコマンドを呼び出すコマンド
:xccmd
です。Cocoaアプリではメニュー内の各項目にはAction名が割り振られているため、そのアクション名を指定することでメニュー上にあるコマンドはすべて実行することができます。たとえば、
:xccmd jumpToNextCounterpart
と入力した場合、.hと.mファイルの切り替えを行います。切り替えのためだけにこれを打ち込むのはばかばかしいので、XVimの.vimrcにあたる、.xvimrcファイルを作成し
nmap <c-n> :xccmd jumpToNextCounterpart<CR>
と書いておきます。これでによって、この機能を呼び出すことができるのです。
xccmdの引数部分はhttps://github.com/JugglerShu/XVim/blob/master/Documents/Developers/MenuActionList.txt
に一覧があります。

ほかには、開発時によく行うビルドと実行はそれぞれ

:make
:run
で起動できるようになっています。もちろん上に書いたように自分の好きなキーを割り当ててもよいです。メニューのショートカットについてはXcode自体に設定があるのでそれを利用しても良いですが、XVimで設定するとnmap, imapなどに対応している点が良い点だと思います(と言いつつ、個人的にはこれら違いによるショートカットを使っていなかったりしますが。)

もう一つ有効な機能として、
:xhelp
コマンドがあります。これはクイックヘルプを呼び出すために実装してあるコマンドです(:xccmdコマンドでも実行できます。)これは現在のカーソル位置にあるメソッドやクラスのヘルプをその場に表示してくれるというもので、引数の意味などを確認するのにとても便利です。

一部のキーバインドは、Vimの定義ではなくXcodeの機能で置き換えれています。"gd"が、典型的な例で、Vimでは"Goto locfal Declaration."ということで、宣言へのジャンプとなっていますが、これはXVimではXcodeの"Jump to Definition"を呼び出すようになっています。そのため、定義部分で入力すれば、宣言部分にジャンプしますし、宣言部分で入力すれば定義部分にジャンプします。またカーソル下のファイル名のオープンはVimではgfですが、Xcodeではこの"Jump to Definition”でジャンプできるため、ファイル名上にカーソルを置いて、"gd"コマンドでヘッダファイルのオープンなどができます。

このように、Vimキーバインドプラグインですが、Xcodeとうまく連携するようにということを意識して作成しています。現在の機能一覧は以下を参照してください。
FeatureList

さて、XVimの開発状況なのですが、最近ちょっと滞っております。というのもこれ以上機能を追加しようとすると少しバグが多く発生するような状況になってきており、少し根本的な設計見直しが必要と判断しているためです。現在github上の別ブランチにて作業をしておりmasterはあまり更新されておりません。ただし、比較的安定しているはずですので、しばらくはそちらを利用していただくのが良いと思います。

今後開発予定の機能としては、矩形選択、検索・置換機能の強化が大きなところとなりそうです。対応コマンドの充実などやりたいことはたくさんあるのですが、なかなか前に進めない状況だったりもします。

なお、XcodeのVimキーバインドとして、最近ライバルが出現しました。http://viciousapp.com/がそれです。ちなみに20ドルだそうです。負けないように頑張りたいと思います。

Vim Advent Calendar 2012 明日は@sonotsさんです。

WordPressに

WordPressにこのwebサイト全体を移行しようかと考え中。
もう、最近HTMLとか自分で編集するの面倒になってきた。

KeyRemap4MacBookProとControl,CommandキーとMacVimと

数ヶ月前からMacBookAirを使い始めて、Commandキーでいろいろな操作ができるショートカットがいまいち
気に入らず、今まで通りControlキー(左手の小指)でショートカットを利用したいと思い、
ControlとCommandキーを入れ替えることにした。

方法は簡単でKeyRemap4MacBookProをインストールして、あとは設定で
”Change Control_L Key"の中から、Command_Lと入れ替えるものにチェックを入れれれば良い。

でも、いろいろオプションがあって、たとえば、"Emacs以外は入れ替え"とか、"TerminalとChromeとRemoteDesctop以外は入れ替え"とかがある。

僕はTerminalとかはそのままControlキーはControlキーとして使いたかったので
"except Terminal,Virtual Machine, RDC"
のものを選択した。

これでほとんどの場合には満足できたのだけれど、1つだけ満足できない所が。
MacVimでControlとCommandが入れ替わってしまう。
Terminal上で操作するVimは上記設定で問題なくControlキーはそのままになるのだけれど、
MacVimはそうなってくれない。

調べてみると自分で設定を書けるらしい。いろいろ戸惑ったものの、結果以下のようなXMLをprivate.xmlとして保存しておけば大丈夫ということがわかった。これを読み込むとMyKeyMapという項目が追加されるのでそれにチェックすればOK
(この場合、規定で入っているChange Control_L Keyは使わず自分の設定のものだけにチェックつける)


<?xml version="1.0"?>
<item>
<name>KeyRemap4MacBook Developer</name>
<list>
<item>
<name>MyKeyMap</name>
<list>
<item>
<name>Control_L to Command_L (except VI, Terminal, Virtual Machine, RDC)</name>
<identifier>remap.MycontrolL2commandL_extermvm</identifier>
<not>VI, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION</not>
<autogen>--KeyToKey-- KeyCode::CONTROL_L, KeyCode::COMMAND_L</autogen>
</item>
</list>
</item>
</list>
</item>


HeapSort (C++ Template関数実装)

久しぶりに、プログラミング。
今日はいままで自分で書いたことなかったヒープソート。


#ifndef __HEAPSORT_H__
#define __HEAPSORT_H__

template 
void MaxHeapify( T* target, unsigned int index , unsigned int length) {
	unsigned int l = index<<1;
	unsigned int r = (index<<1)+1;
	unsigned int max = index;
	if( l < length && target[index] < target[l]	){
		max = l;
	}
	if( r < length && target[max] < target[r] ){
		max = r;
	}
	if( index != max ){
		T tmp = target[index];
		target[index] = target[max];
		target[max] = tmp;
		MaxHeapify( target, max, length );	
	}

	return;
}

template 
void BuildMaxHeap( T* target, unsigned int length ){
	for( unsigned int i = (length-1)/2; true ; i-- ){
		MaxHeapify( target, i, length );
		if( 0 == i ){
			break;
		}
	}
}


template 
void HeapSort( T* target, unsigned int length){
	BuildMaxHeap( target , length );
	while(length != 0 ){
		T tmp = target[length-1]; 
		target[length-1] = target[0];
		target[0] = tmp;
		length--;
		MaxHeapify(target, 0, length );
	}
}

#endif



includeしてから次ように使う。


unsigned char buf[] = {5,7,10,8,11};
HeapSort( buf, 5 );
//ここでbuf内はソート済み。

実装時の設計確認

これは個人的なTIPSとして、プログラムを書くときに、詳細設計がきちんとできていて、将来に渡ってメンテナンスしやすいかどうかの判断基準として、気を付けていることのメモ。

二つあって、どちらも同じような目的のために確認している。

1つ目は、後からテストコードを書く場合は、テストコードがどのように実行できるかを想像しながら実装する。すると、テストしたい部分を自然に切り離しながら実装したくなる。自動的にテストしにくい部分がどんどん一か所にまとめられていって、結果として後からいろいろ変更したり、機能追加がしやすくなる。

2つ目は、今追加しようとしている機能をOFFにしようとしたとき、どれくらいの場所を修正しなくてはいけないかを考える。1行コメントアウトするだけでそれができるのがベスト。できなくても、1ファイルの1ブロック(画面内で確認できる範囲)を修正すれば機能をOFFにできればまあ、問題ないレベル。
1ファイルの複数個所、という場合には、まず設計を見直す。OSの仕組みなどにより、どうしてもそうせざる負えない場合には、よくコメントを書いておくなりドキュメントしておくなりしないといけない。
複数ファイルを直さなきゃいけない場合は、1度よく設計を考え直した方がいいかもしれない。もうそれしか方法がないときだけ、コメントを付けて、どことどこに対応関係があるかを書いておく。
複数ファイルの複数個所を直さないと機能をOFFにできないとか、こういう状況になったら、そもそも何かがおかしいと思った方がいい。だいたい1つのファイルに複数の機能が同時に実装されていたり、2つのファイル(モジュール)が互いに依存しあっていたり、機能の定義があいまいだったりするのが原因で、その後その上にいろいろ機能を追加していけばしていくほど、バグは多くなる。

RTX1000の設定 - シリアル接続がない場合

自宅でYAMAHAのルータ RTX1000を使っている。
このルータ、業務用だけあってユーザフレンドリでは全くない。
設定はコマンドラインで行うことになっているし、コマンドも技術的なことが分かってないと何もできないぐらい難しい。

さて、このルータ、初期状態だとIPアドレスが振られていない。つまり自宅のネットワークに繋いでも、そこにIP層レベルのアクセスはできない。
じゃあ、どうやってIPアドレスを振るのかといえば、基本的にはシリアルケーブルを繋いで、terminal経由で設定する。
ただ、いまどきシリアル端子なんて持ってるPCの方が少ない。僕の使ってるPCも例外ではなくそんなものはもってない。

以前に設定したときは、USBとシリアルの変換コネクタとケーブルを買ってきて設定した。
今回、もう一つ新しくRTX1000を買って、実家とのVPN接続をさせておこうと考え、設定しようとしたのだが、昔買ったはずのケーブルが見つからない。

で、そういう場合にRARPDを用いてIPアドレスを振る方法があるということを知り、今回やってみた。

基本的には以下のページの通り。
http://www.inohome.net/kuma/blog/archives/2006/12/post_606.html

ただし、1つはまったところがあったのでメモ。
ここで使っているRARPDというソフトウェアが「No unique Registry key for TCP/IP over LAN」というエラーを出して終了してしまう。
レジストリキーが複数あるってことなんだろうけど、よく分からない。
うれしいことに、RAPRDにはソースコードが付いてくる。というわけで見てみると、どうやらEthernetのインターフェースをレジストリから探していて、それが複数見つかった場合にはエラーを出すらしいと言うことが分かった。

確かに、僕のPCにはEthernetアダプタが2つついている。VMWareの仮想デバイスとかもあるから、その辺りも関係しているかもしれない。

ということで、メインのネットワーク以外はすべて無効にした。


こんな感じで。それで起動したらちゃんと動いて、みごとにRTX1000にIPアドレスを振ることができた。

これができればRTX1000を設定するのにシリアル端子は必要ないってことだ。

東北太平洋沖地震

被災状況をテレビで見るのが辛い。
親を亡くした子供、目の前で自分の奥さんが流されてしまった人、自分の娘が流されてしまった人、そんな辛い状況がどこにあるだろうか。見ていられないぐらいに悲しい。

今回は、東京にいながら、その恐怖を感じたせいか、その悲しさがものすごく大きい。
今回もある意味では、僕が感じられることは人ごとレベルでしかないのだろう。
結局東京ではその悲惨さはわからないかもしれない。それでも今まで感じたものよりずっと大きな感情的な動きがある。

一人でも多くの人が助かってほしいと思う。


こういうことを目の当たりにすると、僕たちが普段考えている幸せや、生きていく上で大切なことが何なのかということを考えさせられる。
人が、その人の一生を豊かに、幸せに生きていくと言うことと、自分が今毎日の生活の中で行っていることの間に大きな忘れ去られた空間が広がっているのではないだろうかと感じた。
忘れてしまうのだと思う。

家族とともに、いろんな困難を乗り越えて毎日生きていくこと、生きていけること。それが何より重要なことであり、それがすべてなのだと思った。それ以外のことは、おまけみたいなものなんだ。

自宅でVPN

自宅にVPNで接続できるようにした。といっても、だいぶ前からできるのだけど、ほとんど使ってなかった。

ようやく手元に残っているMac miniをSVNサーバとして使うようになった。

VPNでどこからでもつなげるのはよいけど、逆に間違えると自分が持っている情報が外に漏れる可能性もあるわけで、もうちょっとVPNといっても制限をかけた状態で使うようにしたい。
自宅内にVPNからアクセスできるネットワークと、できないネットワークを作るようにするか・・・なんか面倒だな。なんかいい方法ないだろうか。

Visual Studioとcfix

Visual Studio 2010でCfixを使おうと思ってチュートリアルに従ってやろうとして、いくつか引っかかったので解決法を。

チュートリアルには、プロジェクトの作成については一切ふれられていないけど、テストを書く前の段階でテスト用のプロジェクトを作る必要がある。そして、それはDLL作成用のプロジェクトにすればよい。

まず、cfixのチュートリアルに"output window"という言葉が出てきて、そこにテスト結果のログなどが表示されるとあるけれど、この"output window"は"出力ウィンドウ"のことではなくて、コンソールウィンドウのことらしい。

cfixのチュートリアルで、最後にCtrl+F5で実行すればコンソールウィンドウに結果がでてそれが確認できるとあるけれど、普通にプロジェクト作ってやるとコンソールウィンドウが終了後すぐに閉じてしまって確認できない。
Ctrl+F5はVisual Studioの「デバッガなしで開始」に相当するけど、プロジェクトの設定の「リンカ」-「システム」-「サブシステム」が"Windows"になっているとすぐに閉じてしまう。これを"Console"に変えた上で、Ctrl-F5で実行すると、実行終了後にコンソールウィンドウが閉じずにキー入力を待つようになる。



追記:
cfixのヘルプをさらに読み込むと、Visual Studioの出力ウィンドウに結果を出している。でも、できない。どうやるんだろうか。コマンドラインで出力先を変えられる見たいに書いてあるけど、そんなオプション見つからない・・・

さらに追記:
最近のバージョンでは、それらのオプションはなくなったらしい。そして・・・どちらかというとその姉妹ソフトのVisualAssertを使えってことらしい。

なんとなく負け

for文を書くときにunsinedの値をカウンタにして、カウンタを減らしながら0まで実行したいことがある。
例えば

for( usigned int i = 10; i >= 0 ; i-- ){
    data[i+1]=data[i];
}
これは、data配列の中身を順番に1つずつずらしていく。
ただ、このループは永久に終わらない。iが0となったあと、i--が実行されて、unsignedであるために、INT_MAXになってしまい、i => 0の条件は常に満たされてしまう。

いろいろ方法はあると思うのですが、
http://q.hatena.ne.jp/1203477428
ここで質問があって、いろいろやり方があって、その中の6番目の回答に対する、質問者の答えがおもしろく、かなり共感できてしまった。
「なんとなく負けかな。」って。この、ちょっと何かスマートじゃないと感じるのは、みんな持っているものなんだな。

プログラム書いているとだいたい時間がかかるのはこういうどうでもよい問題だったりする。書く気になれば、そのまま書けるけど、なにか気に入らない。だから調べる。なかなか、スマートな方法が見つからない。もっと考える・・・。

プログラミングを仕事にするには、この感覚はちょっと向かないかもしれない。

MFCがおかしい。

MFCが進化してる話を書いたけど、なんだか質が悪い気がする・・・。

MFCのウィザードが生成するコードに

 // TODO: ツール バーおよびメニュー バーをドッキング可能にしない場合は、この 5 つの行を削除します
 m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockPane(&m_wndMenuBar);
 DockPane(&m_wndToolBar);
っていうのがあるから、この5行をコメントアウトだけして、ビルドし直したら下の図みたいなウィンドウになっちゃった。
メニュー隠れてるし、右端もおかしいし・・・。
バグな気がするんだけど。

これで悩んで半日使った。でもどうしようもないみたい。

目標

久しぶりに体育館でジャグリングを練習した。
帰りの食事中に、友達に今年の目標はと聞かれ、どうしようかなぁと考えて、ソフトを一個作ることを目標にしようと思った。

最近はまったくソフトウェアを作っていないので、完全に感覚を忘れている。C++の設計の仕方とか、昔は結構でてきたのに、どういう風にすればきれいにいくかすぐに出てこない。

いろんな機能の使いどころを忘れてしまっているんだなぁ。

ということで、MFCを使ってちょっとプログラムを書き始めてみた。VS2010のMFCは僕の知っているMFCよりかなり進化している感じだ。基本は変わらなそうだけど。ユーザインターフェースのサポートがだいぶ追加されている気がする。

UI関係のプログラムは.Netの方が楽ちんだと思っていたけど、まあこれぐらいサポートがあればMFCも悪くないんじゃないかと思う。

ただ、いまさらMFCでプログラム作る理由はないと言えばない。C#とかの方が絶対早いし、バグも少なくてすみそうな気がする。

あるとすればWindows以外でも利用できるモジュールを作成して、他のOSに移植するときにやりやすいとかその程度か。でもMFCで作り始めてしまったので、このまま作り終えようと思う。

悩むということ

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

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

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

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

一方で僕が悩んでいなかったころのことを思い出すと、この問いにはっきり答えられていた。
高校生の時は「勉強していい大学に入る」ことができれば幸せだったし、大学に入ってからは「ジャグリングが上手くなる」ことができれば幸せだった。だから、その当時僕にこの質問をしていたら、僕は間違いなく、この答えを言っていた。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あたりを考えている。
feedSubscribe to my feed