January 24, 2009

第5回Smalltalk勉強会に行ってきました

第5回Smalltalk勉強会に行ってきました。
制御構造を自分で作ってみるというのが今回のテーマでした。
僕はまだまだ Smalltalk のスキルが足りてないので、if 文を書いてみたり Smalltalk のソースを読んだりしてました。
他の人は GOTO っぽいものを実現したり、C の for 文みたいなものを作ったり(continue も break もある!)してました。

Smalltalk の if 文の書き方がなかなかおもしろくて、例えば以下のような Ruby コードが、

if a > 0
  ごにょごにょ
end

Smalltalk では以下のような感じになります。

(a > 0) ifTrue: [
  ごにょごにょ
]

(a > 0) の結果は True クラスもしくは False クラスのインスタンスになります。
あと、Smalltalk では [ 〜 ] がブロックの定義で、引数をとる場合は [:foo | 〜 ] というふうに書きます。
True クラスと False クラスには ifTrue: というメソッドが定義されていて、それぞれ以下のような実装になっています。

True ifTrue:

ifTrue: alternativeBlock
  ^alternativeBlock value

False ifTrue:

ifTrue: alternativeBlock
  ^nil

ブロックの value メソッドを呼ぶとそのブロックが評価されます。
Ruby の Proc#call みたいなものだと思います。
True ifTrue: は引数として渡されたブロックを評価し、False ifFalse: は何もせずに nil を返すだけです。
非常に単純ですね!

Smalltalk で「if 〜 else 〜 」みたいなコードを書きたいときは ifTrue: ifFalse: メソッドを使います。
例えば以下のような感じになります。

(a > 10) ifTrue: [
  ごにょ
] ifFalse: [
  にょご
]

実装はそれぞれ以下のようになっています。

True ifTrue: ifFalse:

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
  ^trueAlternativeBlock value

False ifTrue: ifFalse:

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock
  ^falseAlternativeBlock value

これも非常に単純ですね!

他にも and:or: といったメソッドがあって、これを使うと Ruby みたいな if 文が書けます。

(a > 1 and: [a < 4]) ifTrue: [
  Dialog warn: '1 < a < 4'.
]

and: の実装は True クラスと False クラスでそれぞれ以下のようになっています。

True and:

and: alternativeBlock
	^alternativeBlock value

False and:

and: alternativeBlock
	^self

また、or: の実装は以下のようになってます。

True or:

and: alternativeBlock
	^self

False and:

and: alternativeBlock
	^alternativeBlock value

あ、そうだ、Smalltalk では ^ が Ruby でいうところの return を意味します。

あとは、Collection クラスもなかなか面白いです。
do: メソッドが Ruby の each に相当する感じですかね。
コレクションを普通にループしたい場合は以下のようにします。

|collection|

collection := OrderedCollection new.
collection add: 'foo'.
collection add: 'bar'.
collection add: 'jugyo'.

collection do: [:each|
  Dialog warn: each.
]

Ruby っぽいですね!
というか逆で、Ruby が Smalltalk っぽいんですね。

Collection クラスには collect:select:inject: なんかもありますよ。

January 21, 2009

転職しました

転職しました!
株式会社万葉に。

きっかけとしては、ogijun さんの日記で会社の存在を知って、あとは Rails 勉強会で万葉入社予定の人とたまたま知り合いになって、で、で、Find Job でたまたま求人広告を見つけて応募して面接して入社することになりました。

社長の旦那さんがたまたま Termtter のコミッターになったりもしてます。

というわけで、Termtter をよろしくお願いいたします。

January 17, 2009

Kensington – SlimBlade(TM) Trackball Mouse

Kensington – SlimBlade(TM) Trackball Mouse

これは欲しい!

via Kengington から6年ぶりにトラックボールマウス新製品SlimBlade Trackball – Engadget Japanese

Termtter、エンジェル資金調達へ

ま、嘘なんだけど。

TechCrunch Japan にこういうニュースがあった。

TweetDeck、エンジェル資金調達へ

TweetDeckはイギリスのプログラマーIain Dodsworthが独力で作り上げたサービスだ。Adobe AIRを利用しているので、デスクトップ・アプリケーションはもちろんクロス・プラットフォームだ。

Termtter も一応クロス・プラットフォームだけどね!

現在公開ベータ中のTweetDeckは、多数の友達をフォローしているヘビーユーザーにとって特に便利な機能をいくつか備えている。ユーザーはメッセージをトピックやグループによって分類してそれぞれにカラムを割り当てて表示することができる。これで多数のメッセージが見通しよく読めるようになる。

それ Termtter でもできるけどね!

ま、そんなことはどうでもいいんですけどね。

基本的に Termtter は Ruby を理解してる人にしか使いこなせないと思います。
逆に、Ruby を理解している人にとっては Termtter はものすごく強力な Twitter クライアントになります。

Twitter の使い方は人によって千差万別で、アプリケーションの作り手がそれをすべて予測して実装するのはまず不可能です。
そこで、Termtter ではプラグインシステムを導入しました。
Ruby が書ければ誰でも簡単に Termtter に機能を追加することができます。
必要な機能は自分で実装すればいいのです。
Ruby が書けない人は Ruby を勉強すればいいと思います。

http://github.com/jugyo/termtter

January 12, 2009

Termtter の開発について

Termtter の開発が楽しいです。

http://github.com/jugyo/termtter

初めの頃は僕一人で開発してて自分のプログラムという感覚が強かったのですが、今はもうまったくそんな風には思わないですね。
開発者全員が共同で所有してるものみたいな感じがします。
みんなで開発するのって楽しいですね。
ま、仕事とは違いますからね。

プラグインの仕組みを入れたのが良かったと思います。
初めは hook を追加する機能しかなかったのですが。
コマンドを追加できるようにしたあたりから、かなり楽しくなってきたように思います。
自分では絶対に思いつけないような素敵コマンドがたくさん実装されていきました。

僕自身は Termtter の開発が最終的にうまくいこうが失敗しようが正直どっちでもいいんですよね。
できればうまくいってほしいですけど、今みたいにみんなで議論したりアイデアを出したりしながら真剣に考えてプログラミングするというそのプロセスこそがなにより重要だと思うんです。
良いものを作るためにみんなで知恵を出し合うというのがいいですね。
なので、そういう雰囲気を維持できるように僕は頑張りたいと思います。
楽しめなければ意味ないですし、楽しくなければ誰も参加したいとは思わないですからね。

January 10, 2009

KeyRemap4MacBook を使って Terminal.app でだけ Control キーと Command キーを入れ替える

KeyRemap4MacBook を使って Terminal.app でだけ Control キーと Command キーを入れ替える方法を調べました。

やり方

結論から言うと、KeyRemap4MacBook(バージョン 5.1.0)の標準のオプションでやるのは(たぶん)無理で、自分でソースをいじってビルドする必要がありました。
以下がそのパッチです。

http://gist.github.com/45363

このパッチを適用すると以下のオプションが設定できるようになります。

  • Terminal.app での Command_L を Control_L に変更する
  • Terminal.app での Control_L を Command_L に変更する

テストのしかた

cd src/core/kext
make
make reload
sudo sysctl -w keyremap4macbook.remap.app_term_commandL2controlL=1
sudo sysctl -w keyremap4macbook.remap.app_term_controlL2commandL=1

ソースコードの取得・ビルド方法等についてはは以下を参照してください。

http://www.pqrs.org/tekezo/macosx/keyremap4macbook/source.html.ja

思ったこと

Command と Control を入れ替えることで Terminal.app の操作がすごく快適になることを期待してたんですが、他の操作にも影響するので意外と不便です。
例えば Mac では Command + Tab でアプリケーションの切り替えができますが、 Terminal.app を使っているときだけ Control + Tab でやるような形になります。
ちょっとした利便性の為に他の多くを犠牲にしないといけないんです(なんというジレンマ)。
もしかするとこの問題を上手く解決する方法があるのかもしれませんが、もう調べるの疲れたのでとりあえずこの変で。

January 8, 2009

Termtter Tips – plugin プラグイン

近況

すごいペースで Termtter の開発が進んでいます。
http://github.com/jugyo/termtter/tree/master

コミッターの数も増えました。
現在、以下の方々が開発に参加しています(ありがとうございます!)。

あと、Twitter にコミットログを流すようにしました。
http://twitter.com/termtter

それと、Lingr にチャットルームを作りました(ujihisa さんが)
http://www.lingr.com/room/termtter

今日の Tips

さて今日の Tips ですが、plugin プラグインを紹介したいと思います。
plugin プラグインは、termtter 起動中にプラグインを読み込むためのプラグインです。
とりあえずこのプラグインさえ読み込んでおけば後でなんとでもなります。

plugin プラグインを有効にするには ~/.termtter ファイルに以下を記述します。

plugin 'plugin'

plugin プラグインを有効にするすと以下の二つのコマンドが使えるようになります。

  • plugins
  • plugin

plugins コマンド

plugins コマンドを実行すると、利用可能なプラグインの一覧が出力されます。

例)

> plugins
english
erb
favorite
fib
filter
growl
keyword
log
notify-send
plugin
say
shell
standard_plugins
stdout
system
translation
uri-open
yesno

plugin コマンド

plugin コマンドを使うと任意のプラグインをその場で読み込むことができます。
試しに fib プラグインを読み込んでみましょう。

> plugin fib
=> true

ついでに fib を実行してみましょう。

> fib 100
=> fib(100) = 354224848179261915075

これで「fib(100) = 354224848179261915075」というメッセージが twitter に送信されました。
ちゃんと送信されたかどうか list コマンドを使って確かめてみましょう。

> list
(01:06:17) jugyo: fib(100) = 354224848179261915075 1102123752
...

ちゃんと送信されてますね!