Androidアプリを作るにあたって、ゲームエンジンというのは欲しい。iPhoneでは cocos2d の派生のcocos2d-iphoneが人気らしい。
cocos2dのAndroid版だが、 `JBox2D`_ のラッパの形で実装しているようだ。
結構注目されているようだが、開発が2.0に向けての開発が進んでいるようで止まっている。Twitterのアカウントも消えているし、公式WebサイトのWikiは壊れているし、これからの進展が心配になる。
JBox2Dを使うのが、サンプルも豊富だし簡単そうだが、AndroidのOpenGL ES用にチューニングされたライブラリの方がパフォーマンスに優れているだろう。
もう少し様子見かな。
Processing用のGUIライブラリというものもあるらしい。
JythonからProcessingをライブラリとして使ったときは、JFrameにPAppletを貼り付けて、その下にSwing部品を幾つか、という感じで作ったが、Processing用のGUIライブラリがあればもっとProcessingらしく良い感じの画面が作れそうだ。
Androidで動くProcessing。流石にIDEが動くわけではなく、Androidでアプレットを動かすためのbuildオプションが追加される。
Processingライブラリのお陰で、「見せる」ためのJavaアプリ開発が楽になるので、Androidで何かデモをするときに、プロトタイプを作る際などに便利だろう。
Androidは、Javaプラットフォームを採用したために、色々とJVMで動くものが移植出来て良い。早く、日本製携帯電話も積極的にAndroidを採用して欲しいものだ。
スワイプっぽいものとかくぱぁも出来て良い。Processingに対応しているから、アプリケーション(2D, 3D or 2.5D (pseudo-3D) applications)が簡単に作れそうだ。
iPod touchを使わなくても、OSがマルチタッチをサポートしたりしているわけだが、その前にマルチタッチセンサを持っているハードウェアを手に入れる必要がある。ここが厳しい。 MAKE: Japan : 自家製マルチタッチ・ディスプレイ の様に画像処理を活用する手もあるのか。
加筆修正を可視化するという、非常に面白い発想。
第6版で第7章がそっくり改訂されている、という分かり易い変化から、初版から大きく文を変えない箇所がしっかりあったり、小さな単語の修正?のみの箇所もあったり、眺めているだけで楽しい。
『傷物語』が雑誌掲載から単行本化するにあたって、羽川の体育倉庫おっぱいシーンが加筆されているのだが、これで可視化すると……。
laclefblog - JavaのSQLiteライブラリ に追加。
あまり活発にはなっていないようで、目指すのはSQLを意識させないデータベースマネージャなのか、SQLiteの完全な操作のためのライブラリなのか、今一つ分かり難い。
Pythonでlxmlを使っていて、Jythonでもlxmlに匹敵する快適なXML操作環境が欲しい。
JavaでもJythonでもXMLを扱うにあたっては、外部ライブラリ不要といえば不要なのだけれど、あった方が幸せになれるだろうということで、dom4jを使い始めた。
Comparisonを見ると、dom4j最強に見えるが、まあ印象操作だろう。1.6.2/2.0のreleaseに向けて頑張っているようだが、いつになることやら。
Quick start Guideを見ながらJythonでの使い方。
from org.dom4j.io import SAXReader
from org.dom4j import DocumentHelper
from java.util import HashMap
url = "http://f.hatena.ne.jp/LaclefYoshi/%e6%97%a5%e8%a8%98%e7%94%a8/rss"
reader = SAXReader()
## DTDを読み込ませないオプション
# reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", False)
document = reader.read(url)
## 名前空間の登録
nsmap = HashMap()
nsmap.put("rss", "http://purl.org/rss/1.0/")
## XPathによる操作
itemxpath = DocumentHelper.createXPath("//rss:item") # "//*[name()='item']" という手段もあるが……
itemxpath.setNamespaceURIs(nsmap)
nodelist = itemxpath.selectNodes(document)
for node in nodelist:
print node
print nodelist[0].valueOf("@rdf:about")
node1 = document.selectSingleNode("//rss:item/rss:title")
print node1.getText() # attributeならgetValue()
## イテレータ
root = document.getRootElement()
for element in root.elementIterator():
print element
for element_item in root.elementIterator("item"):
print element_item
for element_attr in root.attributeIterator():
print element_attr
from org.dom4j.io import OutputFormat
from org.dom4j.io import XMLWriter
from java.io import PrintWriter, BufferedWriter, FileWriter
from java.lang import System
## 文書の作成
document = DocumentHelper.createDocument()
root = document.addElement("root")
author1 = root.addElement("author").addAttribute("name", "James").addAttribute("location", "UK").addText("James Strachan")
author1.addComment("An Author data")
author2 = root.addElement("author").addAttribute("name", "Bob").addAttribute("location", "US").addText("Bob McWhirter")
document.addDocType("catalog", None, "http://hogehoge.org/catalog.dtd")
print document.asXML()
## 最も簡単な出力方法
# out = PrintWriter(BufferedWriter(FileWriter("foo.xml")))
# document.write(out)
# out.close()
## XMLWriterでオプションを追加出来る
# writer = XMLWriter(PrintWriter(BufferedWriter(FileWriter("foo.xml"))))
# writer.write(document)
# writer.close()
format = OutputFormat.createPrettyPrint() ## 整形出力
writer = XMLWriter(sys.stdout, format)
writer.write(document)
format = OutputFormat.createCompactFormat() ## コンパクト出力
writer = XMLWriter(System.out, format) # System.out == sys.stdout
writer.write(document)
というわけで、実にあっさりと使える。静的型付けが無いと、若干不安を覚えるようになってきたが、気のせいだ! その辺、Scalaは上手いなあと思う。
lxmlの代わりにするなら、lxml.htmlの様ないい加減な書式のHTMLファイルも読んでくれればもっと良しだが、別のライブラリに任せる。
それなりに色々選択肢があるが、どれもぱっとした特徴は無く、サンプルが豊富なJBox2D辺りに落ち着く場合が多い様だ。JNAで使うことを考えて、C/C++でも探してみたがやはりぱっとしない。 Chipmunk は良さそうな気がする。
最近はAndroidでJavaアプリを動かす事が流行な様で、そういう環境だとGCが大きなネックになって物理エンジンはまともに使えないとか。
Processing用の物理エンジンライブラリには TRAER.PHYSICS や Motion Library がある。
Pythonにはctypesがあるし、Haskellには実装のGHCやHugsにFFIが標準で付いていてCライブラリを操作出来るし、.NET言語は.NETライブラリが(Monoでも)使えてほぼ満足、という状況で、Javaと仲良し系言語で、つまりJVMからCライブラリを楽に操作出来る手段をあれこれ探していた。
Web上のドキュメント量から言えば、実質標準手段であるJNI(Java Native Interface)なのだが、余分な(と感じる)C/C++インタフェースを書かないといけないので避けたい。
そこで、JNA(Java Native Access)を発見。JRubyが標準搭載して、FFIとして利用しているらしい。
んで、綺麗なJavaライブラリなら、JythonでもScalaでも動くだろうと思い、サンプルを見ながら動作確認。Processingは当然動くだろうと確認省略。
まずJython。
$ CLASSPATH=./jna.jar:$CLASSPATH jython
>>> from com.sun.jna import *
>>> libc = NativeLibrary.getInstance("c") # load libc.so
>>> libc
Native Library </lib/libc.so.6@158651672>
>>> p = libc.getFunction("puts")
>>> p
native function puts(c)@0xb461b310
>>> p.invoke(["JNA in Jython"])
JNA in Jython
>>> libm = NativeLibrary.getInstance("m") # load libm.so
>>> libm
Native Library <libm.so@156868576>
>>> sin = libm.getFunction("sin")
>>> sin
native function sin(m)@0xb48e3100
>>> sin.invokeDouble([3.14159/2])
0.9999999999991198
関数が返す値によって、invoke*を使い分ける事と、実引数はlistにすることに注意。
次にScala。
$ CLASSPATH=./jna.jar:$CLASSPATH scala
> import com.sun.jna._
import com.sun.jna._
> val libc = NativeLibrary.getInstance("c") // load libc.so
libc: com.sun.jna.NativeLibrary = Native Library </lib/libc.so.6@142961944>
> val p = libc.getFunction("puts")
p: com.sun.jna.Function = native function puts(c)@0xb481b310
> p.invoke(Array("JNA in Scala"))
JNA in Scala
> val libm = NativeLibrary.getInstance("m") // load libm.so
libm: com.sun.jna.NativeLibrary = Native Library <libm.so@142027816>
> val cos = libm.getFunction("cos")
cos: com.sun.jna.Function = native function cos(m)@0xb479f430
> cos.invokeDouble(Array(double2Double(0.0))) // scala.Double -> java.lang.Double
res11: Double = 1.0
> var v:java.lang.Double = 3.14159
v: java.lang.Double = 3.14159
> cos.invokeDouble(Array(v))
res13: Double = -0.9999999999964793
こっちは実引数をArrayにする。
実引数のDouble型が違って戸惑った。scalaの組み込み型だと駄目(因みに、間違ってもインタプリタが解決策を教えてくれる)。
これで、JVMからネイティブの資産にアクセスし易くなった。
API Docを見ると、プラットフォーム判別や、X11に簡単アクセスすることが出来る様で、面白いライブラリだ。
Processingで使おうと思って。
最近数GB(約280万件)のデータベースに使っていて、MySQLの様な煩雑さが無くて良いんだけれど、やっぱり遅さが気になる。 データベースライブラリ QDBM とか使ってみようかな。