<< 2009/05/03 | Home | 2009/05/05 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

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