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)
}
}





