« 甜茶日記 |Main| タスクバーで目的のショートカットを選ぶまでの時間を短縮 »

« 甜茶日記 | zakki(雑記) | タスクバーで目的のショートカットを選ぶまでの時間を短縮 »

Tomcatハック日記

昨日の続き。 結局URLClassLoaderでやるのは無謀そうだったので、 すなおにクラスパスとかを指定したのだった。

>>> import org
>>> org.apache.catalina.startup.Bootstrap
<jclass org.apache.catalina.startup.Bootstrap at 20696008>
>>> B = _
>>> B.main(["start"])
(略)
2007/03/12 12:51:13 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
(略)
2007/03/12 12:51:16 org.apache.catalina.startup.Catalina start
情報: Server startup in 3031 ms
無事JythonからTomcatが起動した。 でもブロックされてしまう。
>>> import thread
>>> import org.apache.catalina.startup.Bootstrap as B
>>> thread.start_new_thread(B.main, (["start"],))
(略)
あ、respectJavaAccessibility=falseにするのを忘れてた。
>>> B.daemon
org.apache.catalina.startup.Bootstrap@1d1e765
>>> B.catalinaDaemon
<reflected field private java.lang.Object org.apache.catalina.startup.Bootstrap.
catalinaDaemon at 11703650>
>>> B.daemon.stop()
2007/03/12 13:19:38 org.apache.coyote.http11.Http11Protocol pause
情報: Coyote HTTP/1.1を http-8080 で一時停止します
(略)
2007/03/12 13:19:39 org.apache.coyote.http11.Http11Protocol destroy
情報: Coyote HTTP/1.1を http-8080 で停止します
うーむ。一応JythonからTomcatを起動して、 そのデーモンのフィールドにアクセスすることはできたけど、 ここからどうやって「おお、それはすごい」というデモにつなげればいいかがよくわからないなぁ。
= 伝言ゲーム。 スラッシュドット ジャパン | 神経は電気ではなく音を使う?

いやはや。 どこからつっこんでいいかすらわからない。

On soliton propagation in biomembranes and nerves -- Heimburg and Jackson 102 (28): 9790 -- Proceedings of the National Academy of Sciences。 これが概要か。 どこをどう読んだら「神経は電気ではなく音を使う」という話が出てくるのかさっぱりわからない。 たくさん出てきているmeltという単語を全部まとめて無視しているのか?

そんなことより「melting transitions」が専門用語かどうか確かめようとしてググったら、 渡辺さんとこにヒットしたw

簡単に説明しようかと思ったけど、間違ったことを書くのは嫌なので調べていたら、 いつの間にか時間が…。そう、こうやって日記に「執筆力」を割いてしまうと 本の執筆が進まないんだった。というわけで半分くらい書いたけど削除。 ソリトンがエネルギーを伝えるからchain meltingが起きる、って理解で正しいでしょうか?

はっ。スルー力か。


= The py.test tool and library
2.12 継承を必要としません

テストクラスは Test で始まる名前で認識されます. unitest.py とは違い, テストランナーに見つけてもらうために, あるクラスを継承することは必要ではありません. さらに簡単なことに, アプリケーションクラスを継承したテストクラスを書くことが出来できます.

ああ、なるほど。 それは確かに便利そう。
= GROW ver.3 Flash Game Planet___EYEZMAZE をついついやってしまった。 とりあえず並んでいる順番においてみて、得られた情報から適当に並べてみると3回目で1つを残してmaxに。 なんだ、かんたんじゃん、と思ったらそこからさらに3回かかってしまった。 だってあれとあれがインタラクトするとは思わなかったんだもん。

この問題を自動生成できないかなぁ。 っていうかテキスト形式なら自動生成できるなぁ。 問題は「アイテム 1 が Level 3 に上がりました」 「アイテム 4がアイテム 5 とインタラクトしました」 という文字列が出力されるゲームがどれくらい面白いのかだ。

考える力を計るテスト問題にはなるなぁ。少なくとも。


=
>>> B.daemon.catalinaDaemon
StandardService[null]
>>> c = B.daemon.catalinaDaemon
>>> c.class
<jclass org.apache.catalina.startup.Catalina at 9048956>
>>> [m.name for m in c.class.methods]
['stopServer', 'stopServer', 'await', 'setCatalinaHome', 'setCatalinaBase', 'set
ParentClassLoader', 'setConfig', 'setConfigFile', 'getConfigFile', 'setUseShutdo
wnHook', 'getUseShutdownHook', 'setServer', 'main', 'load', 'load', 'start', 'de
stroy', 'stop', 'create', 'process', 'setAwait', 'setCatalinaHome', 'setCatalina
Base', 'getCatalinaHome', 'getCatalinaBase', 'addLifecycleListener', 'addConnect
or', 'setUseNaming', 'isUseNaming', 'isRedirectStreams', 'setRedirectStreams', '
getRealm', 'setRealm', 'isAwait', 'createConnector', 'createConnector', 'createC
onnector', 'createConnector', 'createEngine', 'createHost', 'createLoader', 'rem
oveContext', 'removeEngine', 'removeHost', 'addAuthenticator', 'findLifecycleLis
teners', 'removeLifecycleListener', 'createContext', 'addEngine', 'getInfo', 'po
stDeregister', 'postRegister', 'preDeregister', 'preRegister', 'getObjectName',
'removeConnector', 'setContainer', 'getContainerName', 'getServer', 'getConnecto
rNames', 'findConnectors', 'getName', 'toString', 'init', 'setName', 'initialize
', 'addPropertyChangeListener', 'removePropertyChangeListener', 'getContainer',
'getDomain', 'hashCode', 'getClass', 'wait', 'wait', 'wait', 'equals', 'notify',
 'notifyAll']
うーん。 やっぱり道は長そうだ。 走っているTomcatを止めずに一部のオブジェクトを書き換えたり差し替えたりすることは、 原理的にはこの方法でできるのだけど、実際にやるにはTomcatの中の仕組みを 理解する必要がある。 簡単にできそうだったらJython本にサンプルの一つとして載せようかと思ったのだけど、 なかなかそうも行かなさそうだ。

十分時間があれば別なんだけども、 Tomcat本を書くわけではないので、 今からTomcatの中身を勉強するよりは現状でわかっていることだけで本を仕上げた方がいいだろう。

試してみたい人のための情報。 Jython2.1をインストールして、jython.batをコピーし、 最後の行を下のように書き換える。もちろん自分がJREやTomcatを入れた場所に応じてパスを変更すること。

"C:\Program Files\Java\jre1.5.0_10\bin\java.exe" "-Dpython.home=c:\jython-2.1" -classpath "c:\jython-2.1\jython.jar;C:\apache-tomcat-6.0.10\bin\bootstrap.jar;%CLASSPATH%" "-Dcatalina.home=C:\apache-tomcat-6.0.10" org.python.util.jython "-Dpython.security.respectJavaAccessibility=false" %ARGS%

後はそのバッチファイルを起動するだけ。


=
= 書くの忘れそうだったからあわてて書いた。 西尾泰和のブログ: タスクバーで目的のショートカットを選ぶまでの時間を短縮。 もうちょっとキャッチーなタイトルをつけたかったけど思いつかなかった。
= げげげ。 Jythonで「こんにちわ」ってファイルに保存したら、当然UTF-8だと思ったのにSJISだった。 うーん。 2.1ではコンソールの入力もSJIS、画面やファイルへの出力もSJISだから化けず、 一見うまく行っているように見え、 2.2では画面からの入力が何か別のものになったせいで化けていると考えるのが妥当だろうか。 文字コード周りは触れたくないんだがなぁ。
= ああ。Jythonで使えない最新のPythonの機能、デコレータもあったね。 デコレータ滅多に使わないので忘れてた。

デコレータなんて飾りですよ。 だってデコレーションっていうじゃない。

TomcatをJythonから起動したのと同じ方法で、 JythonをJythonから起動することもできるかも。

C:\jython-2.1>jython -Dpython.security.respectJavaAccessibility=false
Jython 2.1 on java1.5.0_10 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>> import org
>>> org.python.util.jython

>>> org.python.util.jython.main

>>> org.python.util.jython.main([])
Jython 2.1 on java1.5.0_10 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>> ^Z

>>>
できた、けど…いやー、別窓で開いて欲しいなぁ。 ああ、JythonからJyConsole(JFrameを使っている)を呼び出せばいいのか。
= TAKESAKO @ Yet another Cybozu Labs: gihyo.jp Web連載 - この先生きのこるために注目をあびる優れた技術を身につける この先生、きのこ?あびる優? 絶対わざとだ(笑)

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/528

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.