<< 4月 2009 | Home | 6月 2009 >>
PR: 転職    ドメイン    電子機器    インプラント    転職サイト    ダイエット 食事    転職    コンタクトレンズ    流行キーワード    英会話   

猫ページ

猫ページ更新完了。

Clean Code 出たようだ。

Amazonでも在庫ありになってる。表紙の写真は同じ、ソンブレロ銀河だけど、フォントサイズが大きくなってるので、結構雰囲気が変わってる。昨日見本誌が届いたんだけど、お、重い。結構な厚み。早速るいもが枕にしてる。

前歯が折れた。

呑み屋で、エイヒレを食べていたら、ポキっと。ちょっとあまりのことに気が動転して、軽い貧血状態になってしまった。

この歯は、20年以上前に、ひどい虫歯になって神経抜いた上で、細く削り、上に義歯をかぶせていたもの。当時は保険が効かなくて、10万くらいかかったけど、今は同等品が保険で5,000円くらいで手に入るのだそうだ。

というわけで、今回は保険でお願いした。とはいえ歯の方は折れちゃってるんで、土台の方に穴を開けて、そこに金属の棒を固定して、そこに差すのだそうだ。義歯は、土台が無事なら、何度でも交換できるらしい(だから、今回は保険にしたんだけど)。なんかサラリと言ってくれるけど、聞いている方は口の中で繰り広げられる工事作業を想像するだけで、気が遠くなる。

と言っているそばから、3cmくらいの長いドリルを構えているし。ちょうどあの基盤に穴をあけるやつみたいだ。そんなの、ちゃんと方向とか間違い無く入るんだろうかとか、ずれちゃったら、どんなことになるんだとか、もう頭の中がいっぱいになっている間に、先生はチャッチャと穴を開け終わり、仮の差し歯を入れて「じゃまた1週間後に。固いものかんじゃだめですよ」。って、あれ、そういえば麻酔とかは。あぁ神経抜いてるから不要なのね。

難しいことを、事も無げに、生活の一部のようにできるのがプロだ。ピアノ演奏も「あぁ、難しそうな曲だな」なんて感じさせる演奏は、ダメなわけで。いつも聞いている曲を、ちょっと楽譜を見てみたら、ぶったまげたなんてのが、名演奏だ。

今回は、診療台のディスプレイに、ずっと猫のビデオが流れていて、ちょっと気が紛れたのが良かった。でも猫が嫌いな人はどうするんだろう。

超絶技巧練習曲

リスト 超絶技巧練習曲 第11曲 「夕べのしらべ」
Liszt Etudes D'execution Transcendante No11 'Harmonies du soir.'

時間に余裕ができてきたので、打ち込み再開。今回はリストの超絶技巧。しかし、なんというか、やたらと激しいこの曲が、なぜ「夕べのしらべ」なのか、ちょっと理解に苦しむのだけど。なんかこう雄大な夕焼けとかなんだろうか。

猫ページ

猫ページ更新完了。

るいものハンコ

くーちゃんから、るいものハンコが届いた。

そっくりなのだ。

Ubuntu 9.04

とりあえず、X61だけ入れ替えてみた。もちろんAMD64版。メモリ4GB。今回はext4にしてみた。

なんか、1回目は、日本語環境が、うまく設定されなかったり、Fn+F4でスタンバイに入らなくなったりと、変な感じだったのだけど、もう一度入れ直してみたら、特に問題無く入った。

無線ok。スタンバイok。ハイバーネートok(でも、起動より遅いので、多分使わない)。

トラックポイントのスクロールは、以下のファイルを、/etc/hal/fdi/policy/mouse-wheel.fdiという名前で置けばok。

<match key="info.product" string="TPPS/2 IBM TrackPoint">
<merge key="input.x11_options.EmulateWheel" type="string">true</merge>
<merge key="input.x11_options.EmulateWheelButton" type="string">2</merge>
<merge key="input.x11_options.XAxisMapping" type="string">6 7</merge>
<merge key="input.x11_options.YAxisMapping" type="string">4 5</merge>
<merge key="input.x11_options.ZAxisMapping" type="string">4 5</merge>
<merge key="input.x11_options.Emulate3Buttons" type="string">true</merge>
</match>

なんか、Emacs-GTK版が、普通にSynapticsから入るようになっていた(気付いていなかっただけで、前からなのかも)。

ctrl, escの入れ替えは、~/.Xmodmaprcに以下の内容を書いておく。

remove Lock = Caps_Lock
keycode 66 = Control_L
add Control = Control_L

keycode 49 = Escape
keycode 9 = Zenkaku_Hankaku

パネルがノロノロとアニメーションしてうざいので、gconf-editorを起動して、/apps/panel/toplevelsを開き、

auto_hide:on
auto_hide_size: 2
enable_animations: off
hide_delay: 30
unhide_delay: 30

デフォルトだと、ホームに漢字ディレクトリが作成されて、うざいので、以下を実行。

LANG=C xdg-user-dirs-gtk-update

あとは、バギーなSCIMを殺す。以下を実行してuim-systrayを選択。

sudo apt-get install uim uim-xim uim-anthy uim-skk
sudo update-alternatives --config xinput-ja_JP

起動は、確かに速くなっている気がする。特にデスクトップが表示され始めてから、ディスクアクセスが止まるまでの時間が速い。8.10ではバックライトの調整が、激重だったのが改善されている。着実に完成度が上がっているようだ。このあたりまでくると、もう9.10とか、わざわざ入れようとか考えなくなるかもしれない。

ScalaでObserver

どんなのがいいのかな。traitでミックスインとか。

import scala.collection.mutable.LinkedHashSet

trait Observer

trait Observable[T <: Observer] {
private[this] val observers = new LinkedHashSet[T]
private[this] var isChanged: Boolean = false
var freezed: Boolean = false

def addObserver(o: T) = observers.add(o)
def removeObserver(o: T) = observers.remove(o)
def changed() {isChanged = true}
def notifyObservers(op: T => Unit) =
if (! freezed && isChanged) {
observers.foreach {op(_)}
isChanged = false
}
def notifyAlways(op: T => Unit) {
changed()
notifyObservers(op)
}
def doWithoutNotification[A](op: => A): A =
try {
freezed = true
op
}
finally {
freezed = false
}
}

こんな風に使う。

class DataStoreObserver extends AnyRef with Observer {
def added(s: String) {
println(s + " is added.")
}

def removed(s: String) {
println(s + " is removed.")
}
}

class DataStore extends AnyRef with Observable[DataStoreObserver] {
private var table = List[String]()

def add(s: String) {
table = s::table
notifyAlways {_.added(s)}
}

def remove() = {
val head::rest = table
table = rest
notifyAlways {_.removed(head)}
head
}
}

object Test {
def main(s: Array[String]) {
val ds = new DataStore
ds.addObserver(new DataStoreObserver)
ds.add("Hello")
ds.remove
}
}

あるいは、こんな感じ。Rubyのobserverモジュールのようにchanged()というのを分けてみたけど、どうも自分には今ひとつ使い易く感じられないので、通知をフリーズして処理を行う関数を用意してみた。

class PersonObserver extends AnyRef with Observer {
def changed(p: Person) {
println("person is changed")
}
}

class Person extends AnyRef with Observable[PersonObserver] {
private[this] var _name : String = _
private[this] var _age : Int = _

def name = _name
def name_=(name: String) {
_name = name
notifyAlways {_.changed(this)}
}

def age = _age
def age_=(age: Int) {
_age = age
notifyAlways {_.changed(this)}
}

def set(name: String, age: Int) {
doWithoutNotification {
this.name = name
this.age = age
}
notifyObservers {_.changed(this)}
}
}

object Test {
def main(s: Array[String]) {
val p = new Person
p.addObserver(new PersonObserver)
p.set("Ruimo", 13)
}
}

帰国

無事帰国。

中国東方航空にしたのだけど、どうも航行高度が低いのか、行きも帰りもやたらと揺れた。

今回知ったんだけど、中国語で「青」は、緑色を意味するのだそうだ。日本でも「あお」が緑を意味することがあるし。なるほどなぁ。

serialVersionUID

自動生成ルールのネタを、クラス名と、transient以外のフィールドのシグニチャくらいにしておいたら、Clean Codeに書かれているように、自動生成ルールでも、結構いけるかもしれないな。

ボブおじさんのクリーンコード

アジャイル界のボブおじさんこと、Robert C. MartinのClean Codeの翻訳をしました。

結局、突き詰めるとコードをいかにきれいに書くかということに行き着くのだという言は、コード好きには心強いし、それをボブおじさんのような人が言ってくれたということには、大きな意義があることは間違いない。なぜなら、不合理なルールと戦う時には、やはり権威も必要だから。

内容的には、本当に泥くさいコードの書き方の話。それも実際に存在するコードを題材として、リファクタリングしていく。個人的には首をかしげるようなものもあるけど、著者は、それはそれで構わないと言っている。なぜなら、この本で語られている奥義は、クリーンコード道場の1つ流派の教えであって、別の流派もあって当然だから。結構artonさんと書いたコーディングの掟とか、処方箋とかと重なる部分があるかも。

扱っているテーマは、名前付け、関数の書き方、コメント、コードのフォーマッティング(単なる宗教問題と片づけずに踏み込んでいる)、オブジェクトとデータ構造、エラー処理、ソフトウェアの境界、テスト、クラス、システム、創発的設計、同時並行性、そして実際のコードを使ったリファクタリング例が続き、最後に経験則がまとめられている。

個人的に面白いなと思ったのは、関数は5行以内にする(しかもJavaで!)とか、serialVersionUIDは宣言しない方が良いとか。もっとも著者自身がリファクタリングしたコードを見ると、5行を超えるものも存在するから、絶対的なものではないようだ。serialVersionUIDの件は、なるほどとは思うものの、個人的にはシンセティックフィールドの問題で、Javaのバージョンやベンダが変わっただけで、アプリケーションコードを全くいじらなくても、直列化データの互換性が失われることになるので、反対かな。

明らかに違うだろうと思ったのは、5280という数値は定数にしなくても良いという件。これはフィート/マイルなんだけど、名前付けの章では、特定の文化に依存した名前を付けてはいけないと言っているのに、こんなローカルな単位系の換算値を「良く知られている」ものとして良しとしてしまうのは、矛盾してるよね。

あと、全般にIDEを前提としたルールに移ってきているのだなと感じる。いいものを思い付いたら、名前をどんどん変えましょうというのもそうだし、importでは、ワイルドカードを使いましょうというのもそう。ただ、importでワイルドカードを使うべしの論拠となっている点には、あまり説得力は感じられなかった。ワイルドカードを使うにせよ使わないにせよ、欠点部分は、現在のIDEの機能で十分に補えるものだと思うから。

って、なんか反対意見ばかり書いている気もするけど、逆にここに書いたもの以外は、大体その通りだなと思う。多分、書かれていることを、そのまま疑問も持たずに、受け入れる態度よりも、こうして色々と考え、批判を加えつつ、良いと思ったものを自分のものとして取り込んで行くという姿勢で、この本と接することが、きっとこの著者の願いなんじゃないだろうか。

英語が苦手だった自分が、まさか翻訳の仕事をすることになるとは思わなかったけど、機械翻訳は一切使用していないので、そんなに読みにくいところは、無いんじゃないかなと。正直、序文と第1章は、詩的で気取った表現が多く、自分にとっては結構難解で、なかなか進まず、どうなることかと思ったけど、それ以降はソースコードの分量にも助けられて、なんとか最後まで訳すことができた。コードを書くのが好きな人は、きっと楽しめると思うので、是非書店で見てみてください。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8