mp3: クーラウ ソナチネ 作品20-1
クーラウ ソナチネ 作品20-1
Kuhlau Sonatine for Piano Op20-1
ピアノを習っていると、恐らく最初に弾くことになるソナチネ。これは全音のソナチネ1巻の最初の曲だからなんだけど、実際に中を見ると、練習順序というのが書かれていて、先にクレメンティのソナチネを練習するように書かれていたりする。でも多分、あまりこの練習順序って気にされていないんじゃないかな。
Apache2をバージョンアップ
うちみたいな個人のサイトにDoSかけても意味ないし、そんなに心配はいらないだろうけど、一応apacheを2.2.21に上げておくことにした。確か脆弱性対応は2.2.20だったと思うけど、その後小さな変更があったらしい。うちのサーバはUbuntu 9.04で、もうアップデートは出されていないので、野良ビルドすることにする。ソースは、ここから入手。
Tomcatと、Play! Frameworkを、仮想ホストで使用したいので、configureでモジュールを幾つか組み込んでmake。
./configure --enable-proxy_ajp --enable-proxy --enable-proxy_connect --enable-proxy_http --enable-proxy_ftp make sudo make install
/usr/local/apache2の下に入る。conf/httpd.confでサーバ名を定義しておく。
ServerName ruimo.com
あと、以下のコメントを外しておく。
# Virtual hosts Include conf/extra/httpd-vhosts.conf
あとは、extra/httpd-vhosts.confを編集。Tomcatの場合は、AJPを定義。
<VirtualHost *:80>
ServerAdmin ruimo.uno@gmail.com
<Location />
ProxyPass ajp://localhost:8009/
Order allow,deny
Allow from all
</Location>
ErrorLog "/var/log/apache2/error.log"
CustomLog "/var/log/apache2/access.log" common
</VirtualHost>
Play!の方は、こんな感じ。
<VirtualHost *:80>
ProxyPreserveHost On
ServerName test.ruimo.com
ServerAdmin ruimo.uno@gmail.com
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
<Proxy http://127.0.0.1:9000/>
Order Allow,Deny
Allow from all
</Proxy>
ErrorLog /var/log/apache2/test/error.log
LogLevel warn
CustomLog /var/log/apache2/test/access.log combined
</VirtualHost>
元から入っているapache2を削除。
sudo apt-get remove apache2
インストールしたapache2が自動起動するように、/ect/rc.localに指定。
/usr/local/apache2/bin/apachectl start
P.S. apache2.2-commonもremoveしないと復活するようだ。
mp3: ワルトシュタイン ソナタ
ベートーベン ピアノソナタ 第21番「ワルトシュタイン」
Beethoven Piano Sonata No21 "Waldstein" Italian Grand2での演奏。
Tera Stationのディスクを入れ替え
NASを買わなかった理由
RAIDにすればそれでデータが冗長化されるわけではない。セクターエラーが起きるかどうかは、そのセクターにアクセスしてみなければ分からないわけで、RAIDにしたからといって魔法のようにアクセスしないセクターのエラーが検出できるわけではない。つまり過去の写真みたいに滅多にアクセスしないようなデータをRAID1に置いて安心していると、知らないうちに両ドライブの該当セクターが死んでいて、1年ぶりにアクセスしたら、RAID1なのにアクセス不能なんてことはザラに起きる。なので、これまではサーバ機にIDE RAIDを入れて、cronで週に一度全セクタを読み出すようにしていた。
ところが、この読み出しに結構時間がかる上、かなりディスクのパフォーマンスが落ちる。最初はddで/dev/nulにデータを送り込むようにして、ioniceを指定したものの、セクタ単位のアクセスだとどうもioniceが効かないみたいで、仕方なくプログラムを作って定期的にウェイトを入れるようにしてみたが、実際のところ過去の写真にみたいに滅多にアクセスしない(けれど巨大な)データと、普段良くアクセスする(けれど割とサイズの小さな)データとを共存させるのが間違いで、やはりパーティショニングするのが基本だろう。
最近はNASにもこんな機能があるらしく、これなら、NASを買ってあまり普段アクセスしないデータは、そちらに置くのもいいかなと。で、買ったのBUFFALOのTS-WX1.0TL/1D
これは、1TBのHDDが1台入ったタイプで、あとは3TBのベアドライブを2台入れて、RAID1を構築する目論見。ところが、このNASはベアドライブを入れても認識できず、正式には純正のドライブをバッファローから買わないといけないらしい。
ここに書く内容は、私が個人的に試したもので一切無保証です。追試される方は、ご自身の責任で作業してください。
用意したのは、日立の3TB SATA HDD。3台確保した。この製品は1台用なのだけど、ディスクのトレーがちゃんと2台分入っていた点は良心的(?)と言えそうだ。純正品交換パーツビジネス狙いというよりは、変なドライブを生半可な知識で増設されてサポートの手間が増えるのを嫌ったという感じなのだろう。
既に他の用途で使用したディスクを再利用する場合には、パーティション情報を消しておいた方がいいかもしれない。Linuxでは以下のようにすれば消せる。
dd if=/dev/zero of=/dev/sdb bs=512 count=1
ここで、/dev/sdbのところは、対象ドライブに読み替える。デバイス名は、fdisk -lで確認できる。で、3TBのHDDを2台入れて電源を入れて暫く待つと、液晶が真っ赤になって動作が止まった状態になる。NASNavigator2で見てみると、スタンバイモードというのになっていることが分かる。
ここにファームウェアがあるので、PCでダウンロードする。インストールして、TS-X_FW1.54ディレクトリの下にある、TSUpdater.iniというファイルをテキストエディタで開いて最後の部分を以下のように修正する。
[Flags] VersionCheck = 0 NoFormatting = 0
あとは、TSUpdater.exeを起動してファームウェアの更新を行う。
フォーマットするかって聞いてくるので、もちろんYを入力。
あとはじっと待てば良い。
アップデートが終わると、ダイアログが表示される。
自動的に再起動される。NASNavigator2で見ると、こんな感じでドライブ2が未フォーマットになっている。
Webインターフェースを見ると、最初はこんな感じになっているのでしばらく待つ。
すると30分くらい経って、両ドライブのフォーマットが終わる。
一通り完了したところで、NASをシャットダウンして、ドライブ2を外してGPartedでパーティション情報を確認してみた。
5パーティション目がデータを格納するところらしい。この先頭が7GB目あたりにあるので、ddで先頭8GB分を保存しておく。
dd if=/dev/sdb of=teraEmpty.img bs=1M count=8000
ドライブを戻して、WebインターフェースでRAIDアレイを構築する。
再構築には、3TBで1日半くらいかかった。まぁ、これで使えるようになるのだけど、問題はいざドライブが壊れた時の交換とリビルド。おそらくベアドライブを入れたんじゃ認識されないので、さっき保存しておいたイメージを入れてスワップ先に使えるかどうかを試してみる。ファイルをRAIDアレイ上の共有フォルダに幾つか入れておいて、Webインターフェース上で、ディスクの取り外しを使って2ドライブ目を外す。すると、ドライブの横のランプが赤点灯になるので、ドライブを外す。
3台目のドライブに、さきほどとったイメージをPC上で書き戻す。
dd if=teraEmpty.img of=/dev/sdb bs=1M count=8000
このドライブを、2台目に入れる。しばらくすると、「Press FuncSWI31 Nwe disk2 ready」と液晶に表示されるので、横のファンクションボタンを押すと、RAIDの再構築が始まる。この状態でも以前のファイルにもアクセスは可能だったので、RAIDの再構築は成功のようだ。
このNASは、USBにつないだドライブに定期バックアップもとれる。ただ、NFSはかなり不安定でちょっと使い物にならないかも。
Play frameworkのScala版で、HTML escapeが動かない。
Play frameworkがなかなか面白いので、このところScala extensionを入れて色々いじっている。
今は、play-1.2.3 with Scala-0.9.1で試しているが、HTMLのescape処理がちゃんと動かない。
@("<Hello>&")
みたいなのだと、<Hello>& となり、なぜか>だけがエスケープされる。ソースを見てみると、
ScalaTemplate.scala
object HtmlFormat extends Format[Html] {
def raw(text:String) = Html(text)
def escape(text:String) = Html(text.replace("<","<"))
}
って、そのまんまですな。とりあえずバグ報告。
以下のように修正してみる。
ScalaTemplate.scala
object HtmlFormat extends Format[Html] {
def raw(text:String) = Html(text)
// def escape(text:String) = Html(text.replace("<","<"))
def escape(text:String) =
Html(play.templates.JavaExtensions.escapeHtml(text))
}
で、コンパイルはModuleもplayが勝手にやってくれるのかなと思ったら、さすがにこちらは自分でやるらしい。playのインストールディレクトリ(プロジェクトじゃない)に行くと、modulesというディレクトリがあって、その下にscala-0.9.1というのがあり、その下にソースも存在している。modules/scala-0.9.1/src/play/templates/ScalaTemplate.scalaがお目当てのソースなので、ここを上記のように修正して、modules/scala-0.9.1の下にあるantを実行する。普通に引数無しで実行すると、以下のようにエラーが表示されるので、
BUILD FAILED /usr/local/java/play/play-1.2.2/modules/scala-0.9.1/build.xml:23: Please specify Play framework path using -Dplay.path=/path/to/framework/home
以下のようにplayのインストールディレクトリを指定してやる。
ant -Dplay.path=/usr/local/java/play/play-1.2.3
あとは、playを再起動してやれば反映される。で、raw()ってメソッドがあったので、@HtmlFormat.raw("<hello>")みたいに指定すれば、エスケープ無しで出力できることも分かった。すぐ下に出力用関数があった。
case class BaseScalaTemplate[T<:Appendable[T],F<:Format[T]](format: F) {
def _display_(o:Any):T = {
o match {
case escaped:T => escaped
case () => format.raw("")
case None => format.raw("")
case Some(v) => _display_(v)
case escapeds:Seq[Any] => escapeds.foldLeft(format.raw(""))(_ + _display_(_))
case string:String => format.escape(string)
case v if v != null => _display_(v.toString)
case _ => format.raw("")
}
}
}
他にもOptionとか、Seqとかも渡せるようだ。





