はじめての DSLR

初 DSLR で D90 を購入。とりあえず、AUTO, Flush なしで、いろいろとってみた。

デフォルト(?)の画質、出力フォーマットで、1枚 3MB 位の JPEG になる。

昼間の明るい所から、夜までいろいろとる。やはり光が少なくなると、シャッター速度がとても長くなり、まともな絵にならない。もちろん、三脚はまだ持っていない。

レンズは、正直3つのレンズキットで、どれがいいのか判断はつかなかった。口コミなどを適当に見て、中間の 18-105mm にしておいた。付けたときの見た目も一番いい感じだったし。18-200mm だと、いくらか大きいし、そこまでいらないかなと思っていた。レンズ自体に手ぶれ補正 (VR) があるらしいのだが、仕組みは何ともわからない。レンズには VR と Auto Focus の ON/OFF Switch があるが、どちらも ON で当分大丈夫だろう。

レンズの最初の取り付けで、若干焦って、のろのろしてると埃が入ると余計焦った。何の事はない、接合部の金属が見えなくなるまですっぽりとはいるのかと勘違いしていたが、そうではなかった。マミュアルを見ながらやり直すと、しっかり止まった。しかし、汚したりしたら、それなりの掃除の仕方とかあるんだろうとは思いつつ、まだ調べていない。広角側、望遠側という言葉にピンと来ていなかったが、絵が大きくなる方が望遠側で、その反対が広角側。望遠側ではレンズが前にのびる。広角側はホントに広角なのかと最初は思っていたが、片目のおおざっぱな視野に比べれば広いし、狭い所でファインダーをのぞいても思ったより画面に収まっていたりするし、建築物の直線部分のゆがみから見ても確かに広角なのはわかってきた。そうすると、35mm レンズの 50mm という、基準になる物が、このレンズでどこになるのかが気になってきた。なるべく歪まない所を知りたいから。何か、計算しないとこれは出せない値なのだろうか。

倍率の 5.8倍というのも、最初はそれなりに頼もしくも思ったが、高そうな望遠レンズで撮影している人を見かけると、もう少し倍率があっても良さそうな気がしてきた。18-200mm のレンズは定価で11万、安売りで5万程度、評判もいいらしい。気になる。将来、後継機の D7000 とかを買うのであれば、おそらく使い回せるので、買っておいてもいいのかもしれない。

レンズフードはものものしい気もしていたが、レンズの保護の意味では頼もしいので、付けっぱなし。最初付け方に戸惑ったが。レンズカバーが付けにくくなるけど、レンズカバー自体頻繁につける必要もなさそうなので、問題ないだろう。AF 補助光を使う時(暗いと勝手につくのが初期設定)はレンズフードは付けない方がいいようだが。

暗い場所で撮影すると LCD に表示されるプレビューが妙に明るいのが気になった。大きなレンズでたくさん光を集めてるからなのか?これは露出補正(+/-ボタンとメインコマンドダイヤル)を -1.0 などマイナスにすると暗めになる。夜景のときなど、黒い部分を黒くしたいときなどに使えそう。戻す事を忘れずにしないといけない。

画面上でフォーカスをあわせたい物の手前に物があると、そちらにオートフォーカスがピントを合わせてしまう事が時々あり、オートフォーカスモードの変更を学んだ。多くのモードの初期設定は11点から自動的に設定する。メニューから、対象となる点をひとつにできるので、それを使用するとうまく行くようだった。その場所も変更できるようだが、まだ試していない。

M, A, S, P のモードはほとんど使えていない。ある夜景の取り方に関する Web 上のやり取りで、A で絞りを F8~11 位でというアドバイスがあり、少し調べてみる。絞りの値はレンズの明るさが基準になるらしく、明るさの違うレンズや、範囲がある場合にはややこしい事になりそうだ、18-105mm のレンズキットのf値は 3.5-5.6 なので、3.5 を基準にすればいいのか? 絞らないと(F値が小さいと)被写体深度が小さくなり、周りがぼけやすく、絞ると被写体深度が深くなり、ピントの合う範囲が大きくなる。A は絞り優先モードで、奥のサブコマンドダイヤルをシャッター半押しの状態で操作して変える。それに応じてシャッタースピードが変わる。表示上、シャッタースピードが 125 の様になっているのは 125 分の 1 秒という意味だろう。数字を小さくしていくと 1'' という表示になり、ここからは数字が大きくなる。'' がつくのは実際の秒数('は分"は秒)で、このレベルになると三脚なしでは無理。S はシャッタースピード優先で、シャッター半押しで、手前に位置するメインコマンドダイヤルで操作する。滝や、水の流れなど、短時間で変化する物をとらえるには '' の無い大きな数字にすれば良いはず。M は絞り、シャッタースピードの両方を手動で設定することになる。P は両方を制御してくれるが、AUTO との違いが今ひとつわからない。
A は Aperture の略か。

晴れた昼間で AUTO で 1/200 F14 位になる。シャッタースピードの範囲は 1/4000 から 30''. 絞りの範囲はレンズ依存。18-105 のレンズキットなら、3.5 あたりから、それより大きい値で、数字が大きくなると光が絞られる。

優先モードでは指定しない方の数値が変わるが、これは ISO 感度にも左右される。通常で、200 から 3200 程度まで変えられる。フィルムと同じで、数字が大きいと感度が上がり、少ない光でもとれるようになる。特性がよくわからないが、やはり ISO 値が大きいと荒くなる傾向があるらしい。

bulb と行って、本当に長時間露出する事もできるようだ。ヒルズで見かけた、カメラを置きっぱなしにして放置して夜景を撮ってた外人の兄ちゃんはこれやってたのかな? その日は少しかすんでいたけど、富士山に落ちる夕日が良かった。写真はそのしばらく後の新宿方面。


とある知恵袋サイトでの星空の取り方:
ISO 800~1600, 三脚に固定、絞りは解放、フォーカスはマニュアルにして、無限遠に、シャッタースピードは bulb に。リモコンでシャッターを切り、数十分後解除。リモコンがないと、ずっと押してないといけない。

AUTO しか知らないときには星空に向けてもシャッターが切れず、どうした物かと思ったけど、このやり方で、ぶれてはいるけど、オリオン座が撮れた。三脚欲しくなっちゃうな。なるべくかさばらないやつ。あと、リモコンも。

Velbon, 三脚のメーカーらしいけど、とりあえず URL をメモ。
http://www.velbon.com/jp/catalog/products.html

マニュアル、バルブ、絞り解放、ISO1600、露出5秒で撮れたオリオン座。

D90 はオートのホワイトバランスが良くないという話もある。確かに室内で撮ったり、日が落ちた直後の色味は、こんな色に映るんだってことはない事はない。色温度の基本を叩き込んで、マニュアル設定するのがいいのかな。

押さえきれてない機能は数々あれど、最初目移りしたα55に比べると派手な機能は少ないものの、基本性能はしっかりしてる感じ。

Scala を使い始める

Programming Scala は9割程度読んだので、簡単な作業に使い始めてみる。簡単なテキスト処理をやってみた。データのパースやら、正規表現を使った置き換えなど、基本的な物。

この手の物で、すこしならして、次は昔書いたアプリの移植かな。

import scala.io.Source
import scala.util.matching

def getId2CustMap: Map[String,String] = {
  // 空の mutable map の生成
  val map1 = scala.collection.mutable.Map.empty[String,String]
  /* , で区切られた id と関連情報をマップにロード。
   * この Source の用法はよく使いそう。行を分割した結果を
   * Pattern match で変数に入れてみる。とりあえず使ってみたかっただけ。
   */
  for (line <- Source.fromFile("ids.txt").getLines) {
    line.split(",") match {
      case Array(id, cu) =>
        map1 += (id -> cu)
      case _ =>
        println("match failed.")
    }
  }
  // 空の immutable map に上記の mutable map を加える事で、
  // 上記で作った物の immutable map を作る。
  Map.empty[String,String] ++ map1
}

val mp = getId2CustMap

def cuAdder(mtch: scala.util.matching.Regex.Match): String = 
  mtch.matched + "/" + mp(mtch.matched)

/* 別ファイルから1行ずつ読み、マップの key に対応する部分を
 * key/value に置き換える。
 * replaceAllIn の関数の引数はリテラルでかけた。上に定義した
 * 関数をそのまま渡すと、文法エラー。また、文法があやふやに
 * なってる。
 */
for (line <- Source.fromFile("data.txt").getLines) {
  val r = """(4\d{7})""".r.replaceAllIn(line, 
      m => m.matched + "/" + mp(m.matched))
  println(r)
}

AppleScript Language Guide

AppleScript に関する本は、以前 Online で O’Reilly の書籍が読める Safari が利用できたときにパラパラと読んでいたけど、今ひとつ形にならなかった。最近 Apple が公開している AppleScript Language Guide を読み、やっと基本がわかった気がする。

http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html

スクリプトなので、あまり高い期待をしてはいけないのだが、使い方がわかってくると、もっと機能が欲しくなる。汎用的な sort とか、クロージャ的な使い方も見当たらない。対応する物は限られて入るけど、いろいろなアプリケーションをスクリプトで操作できるのは面白い。

外部ライブラリは scpdt 拡張子のバンドルでインストールできるらしい。MySQL の物もあるようだ。

iCal の特定のカレンダーからイベントを抜き出すスクリプトを作ってみた。個々の入力は GUI でやっといて、後で集計目的にイベントをテキストで取り出せる。コマンドでイベントを登録するようにもできるかも。最も、CalDAV を直接たたく方が汎用的なんだろうが。

(* 簡単な関数、引数は date の month, January - December は定義済みの定数 
   日付のフォーマット関数らしき物は見当たらなかった。月の変換の部分を
   手動で行う
   値の同一性は、違和感があるかもしれないが = を使う。
   最後の値が戻り値になる。
   as text はキャストに相当する Coercion という処理、状況に応じて自動的に
   行われる事もあるが、ここでは明示的に行っている。
   *)
on mon2Num(mon)
  if mon = January then
    "01"
  else if mon = February then
    "02"
  else if mon = March then
    "03"
  else if mon = April then
    "04"
  else if mon = May then
    "05"
  else if mon = June then
    "06"
  else if mon = July then
    "07"
  else if mon = August then
    "08"
  else if mon = September then
    "09"
  else if mon = October then
    "10"
  else if mon = November then
    "11"
  else if mon = December then
    "12"
  else
    mon as text
  end if
end mon2Num

(*
 date format の様な事を行うハンドラ
 文字列の連結は & で行う。
 my mon2Num は current target の date オブジェクトに mon2Num を
 探しにいかせず、script object の mon2Num を使わせるため。
*)
on formatDate(date1)
  tell date1
    set sday to day as text
    if day < 10 then
      set sday to "0" & day as text
    end if
    year & "/" & my mon2Num(month of date1) & "/" & sday & "-" & time string
  end tell
end formatDate

-- 対象のイベントをテキスト形式で保持するリストを宣言、初期化
set targetEvents to {}

-- iCal をデフォルトターゲットに
tell application "iCal"
  -- calenders プロパティを iterate
  repeat with cal in calendars
    -- log "name: " & name of cal & " desc: " & description of cal
    -- カレンダーの名前でフィルター
    if name of cal = "work" then
      -- log "name: " & name of cal & " desc: " & description of cal
      -- cal を default target に指定
      tell cal
        -- log "name: " & name & " desc: " & description
        -- cal の events プロパティを iterate
        repeat with ei in events
          -- event のプロパティ allday が false の物を対象に
          if not allday event of ei then
            -- 対象のイベント ei をデフォルトターゲットに
            tell ei
              -- イベントの長さを分単位の整数値として計算
              set durm to ((end date - start date) / minutes) as integer
              -- 開始次男、長さ、サマリーを文字列にフォーマット
              set ln to my formatDate(start date of ei) & " " & durm ??
                & " " & summary as text
              -- リストの最後に追加。最後にしか追加できないのか? 
              copy ln to the end of targetEvents
            end tell
          end if
        end repeat
      end tell
    end if
  end repeat
end tell

(* 
 結果のリストを \n を区切りに使い join する。
 グローバルの text item delimiters リストを一時的に変更し、
 元に戻す。
 処理を try ブロックで行う事で、エラーが発生しても、
 text item delimiters がデフォルトに戻るようにしている。 
 *)
set savedDelimiters to AppleScript's text item delimiters
try
  set AppleScript's text item delimiters to {"
"}
  set input to targetEvents as string
  set AppleScript's text item delimiters to savedDelimiters
on error m number n
  set AppleScript's text item delimiters to savedDelimiters
  error m number n
end try

(* 
 一時ファイルに出力を行う。
 パスは、特に必要なければ POSIX file で扱う方がわかりやすい。
 file, alias は : を区切りに使うパスをとり、相対パスは : で
 始まるなど、HFS path を使う。
 書き込むので open for acess に with write permission を付けて
 開く。
 write は特に改行を付けてはくれないので、最後に改行を write
 *)
set tmpFilePath to "/tmp/iCalScr.tmp"
set tmpFile to POSIX file tmpFilePath
set ofile to open for access tmpFile with write permission
write input to ofile
write "
" to ofile
close access ofile

(*
do shell script で一時ファイルをソートする。汎用の sort は
標準ではない。iCal のカレンダーのイベントは開始時間でソート
されてかえってくる訳ではない。
 *)
set output to do shell script "sort " & tmpFilePath
log output

WinDbg にはまる

とある関数で,最初の引数がある定数にマッチしたら,2番目の引数とスタックトレースを出して継続としたかったので,色々とやってみたが,ピント外れの分かりにくい WinDbg のエラーメッセージと,振る舞いのおかげで偉い目にあった。

結果的には次のもので動いた。


bp mymod!MyComponent::CallMyDefWindowProc "j (poi(esp+4)==0x282) '.time;.printf \"wp %x\\n\",poi(esp+8) ;kv;g' ; 'g'"

困った所

  • poi の引数に ebp+8 の様な使い方をしていた,その時は関数の先頭ではなく、ある程度のオフセットがあったので,ebp は使えるかと思ったのだが,これがトラブルの元。対象の関数は leaf という訳でもないが,ebp を使わない物だった。結果,"Memory access error at" に続けて poi の閉じる括弧の後が続く。ググっても,的を射た物が見つからない。結局,スタックポインタを関数内の一に応じて push 命令等を考慮して計算して,底から相対的に引数を見つけることにした。上記の例では関数に入ったばかりで,リターンポインタが積まれたばかりなので,最初の引数は esp+4, 次は esp+8 にあるはず。poi って、有効なレジスタを内部的には判断したりしてるのかもしれないが,エラーはもっと分かりやすく出してほしい。
  • 上記コマンドには条件分岐 (j) があるが,これも久々に使ったのと、ディスプレイがあまり良くなかったので,if, else のボディの区切りにコロンを使ってはまる。セミコロンが正解,でもエラーメッセージの前のカレットが全然見当違いのとこさしてるのではまる。
  • .printf の最初の format 文字列引数は、どうやらダブルクォートでくくる必要があるらしい。既に外側で使っているので,シングルクォートにするがだめ。ダブルクォートにして、さらにエスケープもしないといけない。これで,コマンドの中にパス名とか含めたら地獄だな。 find, findstr が文字列の引数がダブルクォートで括る事を必須にしてるみたいなへんてこな造りだ。やはり、Dos/Windows 系のこの種のパーサーは根本的に間違ってると思う。


収穫は .printf が使える事を見つけた事位か...

KTable を動かしてみる

KTable を動かしてみる

ソース、サンプルは下記 URL から入手
http://sourceforge.net/projects/ktable/files/

このページの 2.2.0 の Folder を開くと Release_Notes_KTable_2_2_0.txt といったドキュメントがあるが、サンプルの簡単な説明と修正履歴で、使用方法は書いてない。

ただ、SWT をベースにしているので、SWT 関連のクラスと低レベルのネイティブライブラリが動作には必須と思われる。

とりあえず de.kupzog.ktable.examples_2.2.0.jar de.kupzog.ktable_2.2.0.jar
をダウンロード。それぞれには jar ファイルが含まれている。

環境は MacOS X Snow Leopard なので、$ の後のコマンドラインbash の物。


$ for f in de*jar; do echo === $f ===; jar tf $f; done
=== de.kupzog.ktable.examples_2.2.0.jar ===
META-INF/
META-INF/MANIFEST.MF
ktable_examples.jar
=== de.kupzog.ktable_2.2.0.jar ===
META-INF/
META-INF/MANIFEST.MF
KTable.jar

それぞれを展開。


$ for f in de*jar; do jar xf $f; done

ktable_examples.jar のリストを出してみてもどれが main かわからないし、manifest にも Main-Class が定義してない模様。


$ jar tf ktable_examples.jar

$ java -jar de.kupzog.ktable.examples_2.2.0.jar
Failed to load Main-Class manifest attribute from
de.kupzog.ktable.examples_2.2.0.jar

de.kupzog.examples.TextModelExample を main に指定して起動してみても main がないと出てくる。


$ java -cp ktable_examples.jar:KTable.jar de.kupzog.examples.TextModelExample
Exception in thread "main" java.lang.NoSuchMethodError: main

ktable_examples.jar を展開して main method を持つクラスを探す。


$ jar xf ktable_examples.jar

$ find de -name '*.class' | sed 's!/!.!g;s/\.class$//' | while read cn; do javap -classpath ktable_examples.jar $cn | grep main && echo "=== $cn ==="; done
public static void main(java.lang.String[]);
=== de.kupzog.examples.ExampleGUI ===

de.kupzog.examples.ExampleGUI のみ。

/Users/test/local/eclipseeclipse がインストールされているとして、次のような build.xml を作成し、ant での実行を試みる。



















これでウィンドウは出てくるけど中身が描画されない。SWT のネイティブライブラリに関するパスなどは設定していないのでそのせいかも。ただ、lsof で eclipse がロードしている swt のライブラリらしき物を探しても、/private/var/folders… のしたの物ぐらいしか見当たらない。

SWT をつかうアプリケーションを実行するための最小のネイティブ部分を含んだライブラリというのもあるかもと思いながら、いっその事 Eclipse 上での実行の方が簡単そうという事で方針変更。

Eclipse を起動し、Java Project を ktableex という名前で作成。Library に KTable.jar, ktable_examples.jar を追加(Referenced Libraries を右クリックして  Build Path -> Configure Build Path の画面で External jar を追加。プロジェクト ktableex を右クリック、Build Path -> Add External Archives でも同様)。

デモの main を呼び出すプログラムを作成。


public class Main {
public static void main(String[] args) {
de.kupzog.examples.ExampleGUI.main(new String[] {});
}
}

実行してみる(作成した Main クラスを右クリック、Run As -> Java Application)と足りないクラスが実行時にロードできないというエラーになるので、それを含む jar file を探して追加する。


Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite
at Main.main(Main.java:8)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Composite
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 1 more

追加eclipse のインストールされたディレクトリの一つ上の階層から次のコマンドで plugins の下の jar file を探し、各ファイルのリストを jar で取って、ここでは wigets/Composite を含むファイルがあればそのファイル名を表示する。


$ find eclipse/plugins/ -name '*.jar' | while read p; do jar tf $p | grep swt/widgets/Composite && echo "=== $p ==="; done
org/eclipse/swt/widgets/Composite.class
=== eclipse/plugins//com.google.gwt.eclipse.sdkbundle.macosx_1.7.1.v200909221731/gwt-mac-1.7.1/gwt-dev-mac.jar ===
org/eclipse/swt/widgets/Composite.class
=== eclipse/plugins//org.eclipse.swt.cocoa.macosx_3.5.1.v3555a.jar ===

ここでは GWT のものと eclipse の物が表示された。eclipse の物を使用する。

実際のファイル名はプラットホーム名や、バージョン番号を含んでいるので、Eclipse のバージョンと、かくプラグインのバージョンにより異なってくる。jar file の前半部分が下記の物を追加すると実行できるようになった。

org.eclipse.jface_3.5.1…
org.eclipse.core.commands_…
org.eclipse.core.runtime_3.5.0…
org.eclipse.equinox.common_3.5.1…
org.eclipse.swt

実行結果

Maxine VM

Java Language Summit のセッションの一つに Maxine というのがあったので、調べてみるとリサーチ用の VM らしい。昔 ExactVM というのがあったが、Maxine VM では機能の多くが Java 実装となっている。以前 bytecode -> native compile を Java 実装した研究はあったが、Maxine ではほかの部分も Java 実装でいろいろと実験できるようにするベースとしたいらしい。

https://maxine.dev.java.net/
http://labs.oracle.com/projects/maxine/
抄訳
多くのソフトウェアは managed language で作られるようになり、ハイパフォーマンスでスケーラブルな VM が求められている。実装技術、言語機能、代替デザインの研究においては柔軟で、拡張可能な VM が求められている。既存の VM はパフォーマンス、機能において進歩したが専属のエンジニア以外には手に負えないぐらい複雑になってきた。

Javaプログラミング言語、ツールとしてはアプリケーション開発の生産性向上に寄与したが、システムプログラミング、特に VM 開発という点では十分ではない。Managed Runtime 研究開発、システムプログラミング全般における Java language の使用を推進したい。Maxine project はソフトウェアデザイン、手法、ツールを探求し、VM 開発をより生産性の高いものにしたい。

Maxine VM は meta-circularity, コンポーネント化デザイン、アカデミック、インダストリアルの VM 研究者に、柔軟性、configurability, code 再利用を提供することを強調した、Java に向け、Java で書かれた VM である。


http://wikis.sun.com/display/MaxineVM/Home

Download, build, platform 要件などが説明されている。

OS X Snow Leopard 10.6 で、ダウンロードは Mercurial を使うが、まだインストールしていなかったので、次のサイトから入手。

http://mercurial.berkwood.com/

OS X のインストールパッケージ形式のファイルが入手できる。最新の 1.6 をダウンロード&インストール。

hg clone https://kenai.com/hg/maxine~maxine maxine

junit4.5 が必要とのことだが、最新のものにしてみる。

環境変数 JUNIT4_CP が junit-4.8.2.jar をさすように設定する。

$MAXINE_HOME/bin/max を使って多くの作業を行うことになるが、Mercurial でダウンロードされていない便利なラッパスクリプトがあるので、パスの通ったところにおいておくと便利。

http://wikis.sun.com/download/attachments/172494752/max?version=1&modificationDate=1252967968000

maxine を落としたディレクトリに移動。Assembler や、C1X、bin といったディレクトリがあるはず。

max と単にうつと使用方法が出てくる。
max help vm と打つと


$ max help vm
max vm [options] [class | -jar jarfile] [args...]

launch the Maxine VM

Run the Maxine VM with the given options and arguments.
The expansion of the MAXVM_OPTIONS environment variable is inserted
before any other VM options specified on the command line.

Use "max vm -help" to see what other options this command accepts.

コンパイル Maxine 本体を作る

max build

Compiling C sources in /Users/yoshi/Documents/local/maxine/Native...
Could not find a GNU make executable on the current path.
Please fix the path or use the -make option.

gcc というか、XCode を入れてなかった。
developer.apple.com でダウンロード。2GB もある。

XCode をインストールして max build. 特に問題なく終了。Linux の場合には 64-bit kernel でないと失敗する。mac の場合も確かに -m64 オプションが指定されている。

さらに boot image を作る

max image

コンパイルより少し時間がかかった。といっても数分。

max helloworld

残念ながら mac ではエラーになる。


FATAL VM ERROR[1]: Error re-initializingLjava/lang/ProcessEnvironment;
Faulting thread: main[id=1]
------ Stack dump for thread main[id=1] ------
-> com.sun.max.vm.runtime.FatalError.dumpStackAndThreadLocals(Lcom/sun/max/unsafe/Pointer;Z)V [0x1048ea6f0+101]
-> com.sun.max.vm.runtime.FatalError.unexpected(Ljava/lang/String;ZLjava/lang/Throwable;Lcom/sun/max/unsafe/Pointer;)Lcom/sun/max/vm/runtime/FatalError; [0x104896680+412]
-> com.sun.max.vm.runtime.FatalError.unexpected(Ljava/lang/String;Ljava/lang/Throwable;)Lcom/sun/max/vm/runtime/FatalError; [0x1048f1b30+54]
-> com.sun.max.vm.jdk.JDK.callInitializer(Lcom/sun/max/vm/actor/holder/ClassActor;)V [0x1048e0a08+238]
-> java.lang.System.initProperties(Ljava/util/Properties;)Ljava/util/Properties; [0x10484c8d0+696]

Ubuntu 64-bit で試したところ、helloworld は動いた。しかし、SwingSet2 や Java2Demo はエラーで動かない。
システムプロパティを表示されると java.vm.name=Maxine VM, java.vm.version=0.2 だった。たいていのものは動くというレベルに達するまではまだ時間がかかりそう。

Azul Zing VM

http://www.azulsystems.com/about_us/press/azul-systems-announces-zing

Java のプログラムを変更なしに Appliance で実行できる Vega Compute Applianceで知られる Azul Systems がソフトウェアで同様の機能を提供する物を Zing として出荷予定。仮想科環境での実行が可能。

現在 Azul Systems での表記は Zing(™) またはZing Elastic Software Platform となっている。

BEA の LiquidVM が VMWare ESX 上で直接動作する JVM を提供してきて、Guest OSの様な管理ができる物を提供してきていた。Zing も VMWareKVM 上での実行が可能。

Zing の場合、ソフトウェアでの Pauseless GC などもあるようで、価格や管理の手間が問題にならなければ結構広まるかも。アーキテクチャの異なる AIXSolaris からも利用ができるらしい。これは Vega の様に Proxy を介して Zing の走るサーバーに処理を流すという事かな。

製品版は管理機能なども充実させてきそうだが、コアの部分は先日発表した Managed Runtime Initiative の成果として公開されている。OpenJDK6 ベースの拡張された JVMLinux kernel object (module?) から構成される。

http://www.managedruntime.org/

面白そう。ダウンロードして遊んでみよう。