ベートーベン ピアノソナタ第13番
ベートーベン ピアノソナタ第13番
Beethoven Piano Sonata No 13
幻想的な主題と、中間部の猛烈な速さとの対比が見事。ベートーベンの自信作だが、あまり有名にはならなかった不遇の名作。
JavaOneの写真
JavaOneで撮った写真。一応EF50mmとEF135mmも持って行ったけど、結局TS-E17しか使わなかった。

BARTの始発駅、ミルブレー。

水曜日のAppreciation Session。

ロックコンサートを深夜までやるのがOracle流らしい。。

ゲームコーナ。とは言え景品のぬいぐるみとかもらっても、持って帰るの大変だしなぁ。

豚の丸焼き、うまい!

最終日。Nikko HotelとHilton Hotelの間に休憩コーナがある。ジオラマ遊び。


セッション終了。夕方はSFを回る。

建物がいちいちシャレている。

すごい坂。

坂は、まだまだ続く。


坂を上まで登りきると、遠方に海が見える。


古い教会。

大分日が暮れてきた。

ふと上を見上げると、こういう屋根が落ちて来ないかと不安になる。実際結構欠けているし...






イスラム風



最終日は恒例の蟹パーティ。

蟹デカ! ニンニク炒めになっており、手をベタベタにしながらスパゲッティと一緒にいただく。ちなみに対面で手際良く蟹をさばいているのは、Jenkinsの川口さん。
JavaOne 1日目
キーノート。出席者は増えているそうでなりより。来年は東京でJavaOneがあるそうだ(Apr 4-6)。
最初のパートは、スポンサーIntel様の宣伝タイム。「この枠でこの内容ってことは、やはり一番お金を出してくれたんだろうな」などと邪推している横で、来場者は律儀に要所要所で拍手していて、みんなおとなだなぁと感心。なんかスループットの比較グラフで、1.7.0_01が、1.6.0_06の2倍以上の結果を叩き出しているんだけど、ハードウェアが違うんで、なんというか何を比較しているんだかって感じ。Oracle Fusionでは、同時に20000ユーザをさばけるのだそう。
NoSQLのパフォーマンス。96ノードまで良くスケールする。って製品名が出てこないんですけど、これってCoherenceの話ってわけじゃないんだろうか。
JavaSEの話は、いつも通りのProject Coin, InvokeDynamic, Fork/Joinの話。JigsawとLambdaはJava8に入る予定。型推論とかswitchでの文字列使用、マルチcatch、try-with-resource、16進数リテラルとかは、そろそろ食傷気味。で、知らなかった話題を2つ。1つ目はsafe rethrow
void m() throws X1, X2 {
try { /* X1, X2をスローする可能性のあるコード */ }
catch (Throwable e) {
throw e; // コンパイルエラー
}
}
この場合、try節内で発生するチェック例外がX1とX2だけであっても、Throwableでキャッチしてrethrowするから、throws節にThrowableが無いとコンパイルエラーになる。それを、
catch (final Throwable e) {
とすることで、rethrowできるようになるそうだ(さくらばさんからの指摘によると、finalは必須では無いらしい)。これは地味だけどJavaの例外の扱いでのストレスが減る良い改善だね(って書いていたら、どこかで見たような気もする)。もう1つが、safe varargs
public static <T> void print(T... a) {
for (T t : a) {
System.out.println(t);
}
}
public static void main(String[] args){
print(new Pair<Integer,String>(1,"One"), new Pair<Integer,String>(2,"Two"));
//WARNING: Type safety : A generic array of Pair<Integer,String>
//is created for a varargs parameter
}
この例は、ここから拝借したものだけど、可変引数は内部的には配列で実装されているんで、型パラメータを伴った型のオブジェクトを渡そうとすると警告が出る。で呼び出し側に、@SafeVarargsを付けてやると警告を抑制できるようになるそうだ。
@SafeVarargs
// WARNING SUPPRESSED: Type safety: Potential heap pollution via varargs parameter a
public static <T> void print(T... a) {
JRubyでの最適化が進んだそうだ。
def foo bar end def bar baz end def baz end
こんな例では、foo呼び出し => JRubyのコンテキスト => bar呼び出し => JRubyのコンテキスト => baz呼び出しとなって、思い切った最適化ができなかったのが、Java7でInvokeDynamicが入ったことで、foo -> bar -> bazとなってインライン化などの最適化が可能になったのだそう。これによりベンチマークで2-3倍の結果が出ていた。
Lambdaでは、卒業年が2011の生徒の成績の最大を求めるコードが以下のように書けますよという話。
double max = students.filter(s -> s.gradYear == 2011) .map(s-> s.core) .reduce(0.0, Math#max);
Math#maxという書き方は、staticメソッドをlambda式に変換するものらしい。まぁこのあたりはScalaとかではおなじみのやり方で、Javaでもようやくこういう書き方ができるようになるようだ。あと、
double max = students.parallel() .filter(s -> s.gradYear == 2011) .map(s-> s.core) .reduce(0.0, Math#max);
とすることで、並列実行もできるようになるそうだ。で、これらはIterableにfilterとか新たなメソッドを追加しなきゃいけないんだけど、そうすると既存のIterableを実装したコードがみんなコンパイルエラーになってしまう(そういえば、JDBCのConnectionとかバリバリメソッド追加されて、単体テストのモックがことごとくコンパイルエラーになって頭に来たよね)。で、インターフェースにdefault実装が追加できるようになるらしい。
interface Iterable{ Iterable filter(Predicate super T> predicate) default Iterables.filter;
この場合Iterables.filterはstaticメソッドで、第一引数にthisが、第二引数にpredicateが渡される。これはC#のextension methodからインスパイアされたものかな。
Jigsawは依存関係の解決をするための仕様。昔はJAMファイルとか言ってなかったっけ。これによりJDKのライブラリも分割して、headlessだけ、とかdesktopだけという括りにして小さくできるのだそう。そういえばOSGiとの関係はどうなるんだろうか。いずれにせよMavenのXML嫌いなんで、こっちが主流になって欲しい。
Java9の予定
- Self tuning
- Improve native integration
- Big data
- Reification 型システムの改善(Primitiveの改善)
- Tail calls/continuation
- Meta-object protocolresource management
- Heterogeneous compute modules
Self tuningって、HotSpotもself tuningじゃないのかな。あまり聞き取れなかったけど覚えている範囲で解説すると、Big dataは2GB以上のデータを扱えるようにする。Reificationは、intみたいな特別なprimitive型を無くす(多分Scalaみたいになる?)。という感じ。
JavaFXではCross platformを強調(多分Androidを意識していると思われる)。あとは2.0が出たよとか、デモとか。ただ正直ケータイの方はAndroidでキマりな感じだし、プロプライエタリなRIAは、flashもsilverlightも受け入れられない感じなわけで、そんな中でどういう戦略でJavaFXをはやらせようと考えているのか、そういう戦略的な話がキーノートでは聞きたかったところ(さくらばさんからの指摘によると、戦略的な話は昨年あったそうで、今後はデスクトップに注力するようです)。
JavaEE7の話。データソースをアノテーションで書けるようにするそうだ(nekopさんからの指摘によると、データソースの記載はJavaEE6からの機能だそうです)。
@DataSourceDefinition( name="java:app/jdbc/myDB", className="oracle.jdbc.pool.OracleDatasSource", isolationLevel=TRANSACTION_REPEATABLE_READ, initialPoolSize=5 )
みたいな。JMSとかJavaMailのセッションもアノテーションで書けるようにするらしい。Entity BeanのCMP/BMPと、JAX-RPC、Deplyment APIは消される(オプション実装になる)予定だそうだ。
このあとJavaMEの話があったらしいけど、時間切れなのと仕事でも趣味でもいじること無さそうなので退室。
JavaOne 0日目
日曜日の朝9時ころにサンフランシスコ空港に到着。10時前にはホテルに到着。安いホテルなので仕方が無いのだろうけど、中心街から遠いだけじゃなく、金庫が無いわ、冷蔵庫が無いわで結構不便。そしてインターネット接続は1日$10とられる。これで1日$190は痛い。
JavaOneへの出席は月曜日からなので今日はのんびりと市内観光することにする。ホテルの最寄り駅はCaltrainのBroadwayという駅で、ここは休日しか電車がとまらない。今回の滞在中だと今日しか乗る機会が無さそうなので行ってみた。
すごい。改札も柵も何も無くて、誰でもホームに入れるわ簡単に線路に降りられるわの状態。そこへいきなり2階建の巨大な電車が汽笛を鳴らしながら突っこんでくる。夜とか事故にならないんだろうか。
休日便は1時間に1本。のんびりとサンフランシスコ方面行きを待つ。で、反対ホームに電車がやってくる。みんな普通に線路をまたいで渡って電車に乗り込む。
ちゃんと切符買ったけど、こんな感じで改札とか無いんで、全然チェックされなかった。San Brunoという駅でBARTという地下鉄に乗り換えようとしたら、えらく駅が離れていて30分くらい歩くはめに。あとはBARTで中心街まで行ける。BARTの方はプリペイドの磁気カードタイプになっている。Suicaみたいな感じかな。ちゃんと自動改札式。Clipperというカードを買うと割引があるらしく空港で売っているらしいんだけど、結局見つけられなかった。Powell駅に到着して出口で景観に圧倒される。
Oracleのブースに行って事前登録を済ませバッジをもらう。


これで今日の仕事は終了。あとはAT&Tに行ってSIMを買っておくことにした。で、いつものくせでAT&Tの場所を調べておくのを忘れた。最近出先でもオンラインなのが当たり前なので、ついつい下調べせずに出掛けちゃうんだよね。仕方が無いのでApple storeに行ってGoogle Mapを拝借。で、着いたのはAT&Tの会社の方だった...警備員(?)の人に、お店の場所を教えてもらいようやく到着。ちなみに住所は、705 Market Street San Francisco CA 94103。上海で買ったNOKIAのE66があるので、これを見せてプリペイドのSIMを買う。$25で国際電話付きのにしておいた。まぁ使い切れそうにないけど。
今回は光ポータブルも持ってきたんで、データバックの100MBを付けて、ってお願いしたら、その電話じゃパケット通信できないよ? と釘をさされる。もう1台パケット通信できるの持ってるからといって、お願いしたら、もう1つ別の0円SIMが出てきてあとは自分でインターネットでデータパック買ってねと言われる。
とりあえず中心街で予定していたことは全部終わったので、ぶらぶらと回る。



到着した時は、14℃と言われたので、結構寒いかと思ったらとても快適。
帰りは、さすがに1時間待ちは避けて空港回りにしてホテルのシャトルで帰ってきた。ホテル周りもちょっと散歩。3分ほど歩くと海(湖?)がある。

で、光ポータブルでのSIM認識にてこずる。Googleで「サンフランシスコ 光ポータブル」あたりで引っかかる情報ではどうもうまくいかない。タイプが異なるようで、これはDataConnect Passというタイプみたい。https://buyasession.att.com/に行って、Prepaid DataConnect Passというのを登録すれば良いらしい。IMEI番号を聞かれるけど、光ポータブルには見当たらないんで、全然関係無いけどNOKIAのE66の方のIMEI番号を入れてみた。住所とかもホテルの住所を入力。特に問題無く使えているので、IMEI番号が結局何に使われているのかは不明。光ポータブルでは、APNをbroadbandにして、PIN、ユーザ、パスワードは入力無しでつながった。とりあえずこれで会期中はオンラインになった。
ベッドに耳栓が用意してあって、いやな予感がしていたけど、あぁやっぱり飛行場に近いだけあって、結構な轟音...
P.S. DataConnect Passでは、期間制限が厳しいので注意!
そんなには使わないだろうと、1番上の100MBとか選ぶと、1日で切れます。1MBしか使わなくても、1日で無情にexpireします! 良く説明を読んでから契約してください。
EVO WiMAX雑感
EVO WiMAXに乗り換えて1か月近くたった。Androidは、HT-03A、IS01に続く3台目、ようやくメジャバージョンが2になった。HT-03AからIS01のパフォーマンスアップが劇的だったので、それと比べるとおとなし目ではあるけどブラウザの動きなどでもたつくことも無くなったし、やはりメモリに余裕があるのでタスクの切り替えが高速になっているのが分かる。フラッシュにも対応しているので微妙に便利。
それより大きいのは無線LANが安定していることで、IS01まではスタンバイ(?)からの復帰とかで良くつながらなくなることがあって、3日に1回は再起動しているような感じだったが、EVOはこのあたりが非常に安定していて変な挙動があまりない。ここ1月くらい使ってみて変な挙動は、1度だけ勝手に再起動したことがあったくらい。Androidも大分安定してきたように感じる。
WiMAXはonにすると電池があっという間に無くなるは熱くなるはで、常にonにはできない感じ。しかも電波の入りも良くないので、大量のダウンロードがある時などにonにするくらい。テザリングは文句無しに便利なんだけど、これまでのemobile + 光ポータブルに比べると、確実にPCを使わない割合が増えた気がする。
画面の大きさが小さくなったのはあまり気にならなかった。IS01は横に長いだけで縦の大きさはあまり変わらないし。ただキーボードが無いのはやはり不便。とはいえ、あの大きさのキーボード付きでこれはといモデルが無いので仕方無いかな。
というわけで昨日は有楽町のビックカメラ5Fに行ってemobileを解約してきた。隣のブースも解約客だったみたいだけど「10月に契約した場合、10月だと契約解除料かかるんですよね〜 11月まで待たないと」とか言われていた。分かりにくいよね、あれ。
クーラウ ソナチネ 作品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しないと復活するようだ。
ワルトシュタイン ソナタ
ベートーベン ピアノソナタ 第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とかも渡せるようだ。





