macbookでjython

trunk:4847はコンパイルが通った。

Jython 2.3a0+ (trunk:4847, 7 4 2008, 20:27:46) 
[Java HotSpot(TM) Client VM (Apple Inc.)] on java1.5.0_13
Type "help", "copyright", "credits" or "license" for more information.

これで遊べる。

jython+web.pyでお手軽Webアプリ

jython+web.pyがお手軽で、ちょっとしたことをやるならいい感じ。

jythonのosモジュールにはfstatがないのでtrunkのSimpleHTTPServerの静的ファイルの転送ができない。そのため、2.2.1のSimpleHTTPServerと入れ替えた。

import java.io.StringReader as StringReader
import org.openscience.cdk.interfaces.IMolecule
import org.openscience.cdk.io.CMLReader as CMLReader
import org.openscience.cdk.ChemFile as ChemFile
import org.openscience.cdk.layout.StructureDiagramGenerator as StructureDiagramGenerator
import uk.ac.cam.ch.wwmm.opsin as opsin
import net.sf.structure.cdk.util.ImageKit as ImageKit

import web

urls = (
    '/(.*)', 'img2d' 
)

class img2d:       
    def GET(self, name):
        cml = opsin.NameToStructure().parseToCML(name).toXML()

        str_reader = StringReader(cml);
        cmlr = CMLReader()
        cmlr.setReader(str_reader)
        chem = cmlr.read(ChemFile());
        mol = chem.getChemSequence(0).getChemModel(0).getSetOfMolecules().getMolecule(0)

        sdg = StructureDiagramGenerator()
        sdg.setMolecule(mol)
        sdg.generateCoordinates()
        mol = sdg.getMolecule()

        ImageKit.writePNG(mol, 300, 300, "./static/test.png")
        print '<h1>' + name + '</h1>' + '<img src="/static/test.png" />'

if __name__ == "__main__": web.run(urls, globals())

http://localhost:8080/(2,3-diethyl-benzyl)-isobutanolというURLにアクセスすると、IUPACを2次元構造に変換していい感じに描画して表示してくれる。

opsin_web

ImageKitが必ずファイルに出力するのでテンポラリのファイルを作ればいいのだけど、とりあえず動く事を確認したかったので決めうちの名前で。

jythonでwebappサーバー

CherryPyはSignalがないぜよっていうエラーを解決できなさそうだったのであきらめた。

webpyはSSL関係のクラスをコメントアウトして830行あたりをちょっと修正すれば動く。

これで、cgiとかサーブレットみたいな面倒な手段をとらなくても、javaライブラリとwebserverをつなげられる。

例としてIUPAC名をCMLに変換するjavaライブラリであるopsinを利用したwebappを作る

import uk.ac.cam.ch.wwmm.opsin as opsin
import web
urls = (
    '/(.*)', 'hello' 
)
class hello:
    def GET(self, name):
        i = web.input(times=1)
        for c in range(int(i.times)):
            print opsin.NameToStructure().parseToCML(name).toXML()

if __name__ == "__main__": web.run(urls, globals())

http://localhost:8080/benzeneってアクセスするとbenzeneのCMLがブラウザに出力される。

jythonでGenerator

trunkをコンパイル

fedora8にantが入ってなかったのでyum install antで入れた。

あとはsvn coしたらantって打つだけでOK

% ./bin/jython
Jython 2.3a0+ (trunk:4809, 6 27 2008, 21:45:52) 
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_06
Type "help", "copyright", "credits" or "license" for more information.
>>> def ytest(n):
...   for x in range(n):
...     yield x
... 
>>> it = ytest(10)
>>> it.next()
0
>>> it.next()
1
>>> it.next()
2

OK。でも2.2.1でもfrom __future__すればいけるようだ。

Jython 2.2.1 on java1.6.0_06
Type "copyright", "credits" or "license" for more information.
>>> from __future__ import generators
>>> def ytest(n):
...   for x in range(n):
...     yield x
... 
>>> it = ytest(10)
>>> it.next()
0
>>> it.next()
1

JRubyとかjythonとか

JRubyとかjythonとかはCGI書くのに苦労するよなとかつぶやいてみたけどjythonではSimpleHTTPSeverが使えることに気づいた。

% jython
Jython 2.2.1 on java1.6.0_06
Type "copyright", "credits" or "license" for more information.
>>> import SimpleHTTPServer
>>> SimpleHTTPServer.test()
Serving HTTP on 0:0:0:0:0:0:0:0 port 8000 ...
192.168.11.xx - - [26/Jun/2008 21:34:28] "GET / HTTP/1.1" 200 -
192.168.11.xx - - [26/Jun/2008 21:34:28] code 404, message File not found
192.168.11.xx - - [26/Jun/2008 21:34:28] "GET /favicon.ico HTTP/1.1" 404 -

あーでも、これだと、結局jythonスクリプトでCGI実行しないとあかんからうまくいかんわ。

というわけで、明日は会社にWebアプリ編を持ってってjythonでwebappサーバーつくるのにチャレンジ。

ProductName みんなのPython Webアプリ編 [みんなのシリーズ]
柴田 淳
ソフトバンククリエイティブ / ¥ 2,604 ()
在庫あり。

なんかやる気出てきた。

jythonでopsinを使う

jythonがmacbookにインストールできなかったのでとりあえずlinuxで。

といってもgcjだとエラーを吐くので、sunのjavaをインストール。 ここみて設定。alternativeコマンドを使うとjavaの共存ができるのね。いままで、シンボリックリンクを上書きしてたのでめんどいなーと思ってたけど、これだとらくちん。

jythonをインストールしたら、あとはopsinのjarを落としてきてクラスパスに通す。

>>> import uk.ac.cam.ch.wwmm.opsin as opsin
>>> opsin.NameToStructure().parseToCML("4-iodobenzoic acid").toXML() 

二行でIUPAC名がCMLに。 すばらしい。

jrubyの例もある。

ちなみにjrubyはmacbookにさくっと入って、この例の通りにやれば動いた。

perlで同じ事をやる場合にはInline::Javaを使ってやればいいけど、Javaのライブラリを有効に利用するのはJavaで実装された言語処理系がやっぱ楽だ。

macbookにjythonをインストールしようとしたが

エラーです。

$ java -jar jython_installer-2.2.1.jar 
java.lang.NoSuchMethodError: org.apache.commons.cli.Options.setSortAsAdded(Z)V
    at org.python.util.install.InstallerCommandLine.createOptions(Unknown Source)
    at org.python.util.install.InstallerCommandLine.<init>(Unknown Source)
    at org.python.util.install.Installation.internalMain(Unknown Source)
    at org.python.util.install.Installation.main(Unknown Source)

もきー、わからん、CLASSPATHとか?

jythonプログラミング読了

次の二つの章が特に面白かった。

  • 5 Pythonから見たオブジェクト指向
  • 7 Jythonの応用例

ProductName Jythonプログラミング
西尾 泰和
毎日コミュニケーションズ / ¥ 3,150 ()
在庫あり。

単なるjythonの使い方の本というよりは、jythonのような複数の言語を混ぜ合わせた処理系を通して見えるものを感じ取りましょう的な内容だったように思う。あとその場合に固さやわらかさの長所をうまくのばしてやるようなプログラミングのお作法はこんな感じですよみたいな指針。

perlでもInline系のモジュールを使えば直接他の言語を埋め込んだりできて他言語のライブラリを使えるけど、言語自体が両方の世界に干渉できるともっと楽ができる。

Inline::みたいなやり方でも、jythonみたいなシームレスな言語でも結局複数の言語を理解してないとうまいことやれないので、その分習得コストはかかると思うんだけど、シームレスな言語使うと楽しいのはスケッチするような感覚が得られることなのかなと思ってる。

そういう意味ではGainerも似たような感じかも。

ProductName Make: Technology on Your Time Volume 04
オライリー・ジャパン
オライリージャパン / ¥ 1,575 ()
在庫あり。

あとシームレスな言語を使うっていうことはそれにあわせてライブラリのほうも対応していかないといくのが望ましいのかなとPybel as a generic API for cheminformatics libraries - proof of concept using CDKというエントリを見てふと思った。

chemoinformaticsだとopenbabelっていうc++の大きいライブラリとCDKっていうjavaのライブラリがあって、その上にpython(とruby)がまたがっている感じなのだけど、さらにこれらでいじくったデータを解析にもっていくためにRが必要だったりとかするのでRpyが役に立ったりする。

jython+processingでwebカメラで取り込むサンプル

usbカメラを買ったので早速遊んでいる。ちなみに奥に見える黄色いのはjython本じゃなくて独習C++とかいう本。

webcam

drawメソッドでピクセルをいじくると色々とエフェクトがかけられるわけです。

from javax.swing import JFrame
from processing.core import PApplet
from processing.video import *

class Sketch(PApplet):
    def __init__(self):
        pass

    def getField(self, name):
        return self.class.superclass.getDeclaredField(name).get(self)

    def setup(self):
        self.size(320, 240)
        self.camera = Capture(self, 320, 240, 12)

    def draw(self):
        self.camera.read()        
        self.image(self.camera, 0,0)

def run(applet):
    frame = JFrame(title="Processing camera",
                   resizable = 1,
                   defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
    frame.contentPane.add(applet)
    applet.init()
    frame.pack()
    frame.visible = 1

if __name__ == '__main__':
    run(Sketch())

jython本が待ち遠しい。

ProductName Jythonプログラミング
西尾 泰和
毎日コミュニケーションズ / ¥ 3,150 ()
在庫あり。

jython+processingでマウスの入力を受け取るサンプル

list 3-4-aをjythonで。

ProductName Built with Processing [改訂版]
前川 峻志,田中 孝太郎
ビー・エヌ・エヌ新社 / ¥ 3,570 ()
通常24時間以内に発送

書いたコード。

from javax.swing import JFrame
from processing.core import PApplet

class Sketch(PApplet):
    def __init__(self):
        pass

    def getField(self, name):
        return self.class.superclass.getDeclaredField(name).get(self)

    def setup(self):
        self.size(800, 600)
        self.colorMode(PApplet.HSB, self.width)
        self.background(self.width-1)
        self.noStroke()
        self.frameRate(10)

    def draw(self):
        self.fill(self.mouseX, self.width*0.5, self.width-1)
        self.ellipse(self.mouseX, self.mouseY, self.mouseY/2, self.mouseY/2)


def run(applet):
    frame = JFrame(title="Processing",
                   resizable = 1,
                   defaultCloseOperation=JFrame.EXIT_ON_CLOSE)
    frame.contentPane.add(applet)
    applet.init()
    frame.pack()
    frame.visible = 1

if __name__ == '__main__':
    run(Sketch())
Next Page