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

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+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())

jythonでprocessing [座標を変えるサンプル]

今日のお題は座標系を変える

2-7-b改

def setup(self):
    self.size(200, 200)
    self.colorMode(PApplet.HSB, 120)
    self.background(119)
    self.noStroke()
    self.smooth()
    self.rectMode(PApplet.CENTER)

    self.angle = 30
    self.margin = 40

def draw(self):
    self.translate(120, 30)
    for i in range(12):
        self.fill(i*10, 100, 119, 60)
        self.rect(0, -10, 10, 10)
        self.rect(0, 0, 30, 30)
        self.rect(30, 30, 60, 60)

        self.rotate(self.radians(self.angle))
        self.translate(self.margin, 0)

colinux(debian)にjavaとjythonを導入

colinuxの容量も増えたことだし、要領よくjavaをインストールだ。

debが用意されていないのでココみて自前で作成、インストール。

jythonはjythonからjarファイルをダウンロードしたら、

java -jar jython_Release_2_2alpha1.jar

でOK

jython使えれば、CDKとかjchempaintのjavaライブラリ使えるし、PyMOLみたいな立体構造いじり系に加えてbiopythonで配列処理も出来るから、結構よさげな感じだ。

Jythonインストール

Jythonのサイトからjython-21.classをダウンロード

java -cp . jython-21

でGUIのインストーラーが起動するので、普通にインストール。いれてはみたものの、いまいち使い方がわからないのは、そもそもpythonの知識がないからか。