<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5404752707210924231</id><updated>2011-04-22T12:41:22.772+09:00</updated><title type='text'>Introspection</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-8956430393182589557</id><published>2008-01-17T03:37:00.000+09:00</published><updated>2008-01-17T03:38:25.903+09:00</updated><title type='text'>Radiant, Scala, Groovy, Grails, Objective-C, Smalltalk...</title><content type='html'>Rails 周りでは Radiant, Instiki が意外と使えそうな事を発見。もう少しいじってみよう。&lt;br /&gt;&lt;br /&gt;Java Posse の影響もあるのだが、Scala や Groovy が気になる。JRuby は少し触ったので今はどうしても新しい言語が気になる。Scala はカッコいいけど、深く理解するのは大変そう。Groovy は Ruby や Python の言語機能をある程度知ってからみると面白く見えてきた。Rails の基礎をやった事で GRails もすんなり入れたし興味深い。Spring や Hibernate をベースにしているところも何か面白そうだ。&lt;br /&gt;&lt;br /&gt;そういえば Java Posse の 2007 総括の回では python/jython は評価が低いようだ。システム言語として python がある程度実績があり、Google も利用している事から評価している向きもあるようだが... 個人的な好みで言えばやはり Ruby になってしまう。なんか、python は古くさい感じがする。とはいえ、熱狂的な支持者がいる事も確かで、もっと使い込んでみる事も必要だろう。&lt;br /&gt;&lt;br /&gt;OS X のフレームワーク Cocoa を使ったアプリケーションを作ってみようと、情報を集めてみた。 XCode (free) を使えばできる事はわかった。*.app ディレクトリの構造と仕組みが少し気になっていたのである。ネイティブな言語は Objective-C という事になるが、これも実際にはみた事も、書いた事もないので少し調査。C++ とはだいぶかわった文法で、解説によると C++ 的な拡張というよりは C に SmallTalk 的プログラム記述の皮をかぶせたようなもので、 サンプルを見ると二つの言語が入り交じっているようにも見えるし、クラス、オブジェクトの動的側面から言うと Reflection 相当の機能が入っている点から C++ よりオブジェクト指向が進んでいるとも言える。&lt;br /&gt;&lt;br /&gt;ここで、改めて思い返すと Smalltalk の経験もない。GNU の smalltalk があるので、これで少し勉強してみよう。OS X で簡単にビルドできたし、gst でいくつか簡単なプログラムを動かす事もできた。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-8956430393182589557?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/8956430393182589557/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=8956430393182589557' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8956430393182589557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8956430393182589557'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2008/01/radiant-scala-groovy-grails-objective-c.html' title='Radiant, Scala, Groovy, Grails, Objective-C, Smalltalk...'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4517604248790080631</id><published>2008-01-17T02:02:00.000+09:00</published><updated>2008-01-17T03:11:39.485+09:00</updated><title type='text'>Oracle to get BEA</title><content type='html'>new.com.com によるとどうやら Oracle が以前の提案より少し高い額で BEA の買収を行いそうだ。&lt;br /&gt;無念。以前から定評のあった WebLogic サーバーの市場での奮闘ぶりや、様々な機能には関心させられて&lt;br /&gt;いたし、VMWare ESX / Xen のようなハイパーバイザ上でゲストとして JVM を OS のオーバーヘッド&lt;br /&gt;なしに高速動作させるしくみは目から鱗だったし、Business Integration の分野ではとるべきもの(BPEL など)&lt;br /&gt;はとり、JBI には仕様が不十分と強く意思表示したりと技術的に骨のある会社なので、ずっと独自性を&lt;br /&gt;持ち続けられる体制を続けてほしかったのだが...&lt;br /&gt;&lt;br /&gt;Oracle は実は web application server の分野では苦戦していて、現在の OC4J も大きな声では言えない&lt;br /&gt;問題を抱えている。金は余っている訳だから、市場で既に十分検証された実績のあるソフトウェアが&lt;br /&gt;ちょっとした出費で手に入るならということで、こんなことになったのだろう。とうの昔に枯れてしまった&lt;br /&gt;古い DB ソフトウェアで膨大なライセンス料を濡れ手に粟で手に入れているが、ある時期以降は&lt;br /&gt;買収で体制を維持しているように見えなくもない。「何かおこったらどうしよう、でも有名大手にまかせて&lt;br /&gt;おけば大丈夫、少なくとも自分は」という日本の無責任 IT マネージャは格好のカモで、口では立派な&lt;br /&gt;ことを言うが、裏では責任のなすり付け合いとその手はずに大半の時間を使っている日本企業の IT &lt;br /&gt;部門が Oracle の様な会社を増長させ、結果的にこのような残念な結果を招いているのかもしれない。&lt;br /&gt;&lt;br /&gt;また、ニュースにも書かれているが本当の仕掛人は乗っ取り屋アクティビスト投資家 Carl Icahn&lt;br /&gt;（カール・アイカーン）だ。経済の世界からみると結果的に金になれば成功と見なされるので、&lt;br /&gt;氏のようなやりかたもありなのだろうが、振り回される方はたまったものではないだろう。&lt;br /&gt;金にものを言わせて攻撃的な、横暴ともとれる要求をターゲットにされてしまった企業に&lt;br /&gt;迫ってくるやり方には嫌悪感を覚えずにはいられない。最も、一般人がこんなことを述べても&lt;br /&gt;「だからどうした貧乏人？」とあしらわれるだけだろうが...  世の中、結局金ですか？？？&lt;br /&gt;&lt;br /&gt;コンピュータ関連企業の中で比較的方向性の近い企業との協業、あるいは合併といった平和的な&lt;br /&gt;解決ができなかったのが残念である。まぁ、Oracle もうまく BEA の技術をのばしていって&lt;br /&gt;くれるのかも知れないが... ただ、Carl Icahn がかんでいる時点で、BEA が M&amp;A による&lt;br /&gt;金儲けのカモにされた感は拭えない。&lt;br /&gt;&lt;br /&gt;Sun, Apple, Azul といったポリシーをもった技術先行の（イメージがある）会社には&lt;br /&gt;末永くがんばってほしいし、同じようなことは勘弁してほしい。でもアメリカ式経済では&lt;br /&gt;いつこれらの会社が消えても不思議ではない（とくに Azul）訳で、それを防ぐには&lt;br /&gt;それなりの防衛手段が必要にもなる。ただ、それが金儲け第一主義にいつの間にか化けて&lt;br /&gt;しまうととたんにつまらなくなってしまうので難しいところだ。理念と、製品、成果物に&lt;br /&gt;高い価値を認められる企業はもう少し、乗っ取り屋におびえる事なく本業に専念できる&lt;br /&gt;ような法整備はできないものだろうか？&lt;br /&gt;&lt;br /&gt;BEA が名実共に SOA, web から退場となるかどうかはわからないが、乗っ取り屋の気まぐれで、&lt;br /&gt;業界から活気が失われるような事にだけはならないことを祈りたい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4517604248790080631?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4517604248790080631/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4517604248790080631' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4517604248790080631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4517604248790080631'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2008/01/oracle-to-get-bea.html' title='Oracle to get BEA'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4583783933682175200</id><published>2008-01-09T20:05:00.001+09:00</published><updated>2008-01-09T20:05:44.568+09:00</updated><title type='text'>最近の言語</title><content type='html'>Ruby は何年も前に買った本を発掘したので、たぶん2000年前後に勉強した&lt;br /&gt;はず、でもほとんど記憶にない。でも、最近の Rails, JRuby, Goldspike&lt;br /&gt;のブームで面白さを再発見。やっぱり、strict type checking の言語は&lt;br /&gt;肩が凝るのだろうか... 従来の言語にない言語要素も新鮮だ。&lt;br /&gt;ただ、実際の手持ちのアプリケーションの移植先と&lt;br /&gt;して考えた場合、Ruby/JRuby には残念な点もある。ひとつはエラー自身や、&lt;br /&gt;問題箇所の特定が面倒なこと。このあたりは Java/C++ の方がずっと&lt;br /&gt;わかりやすい。もうひとつ、C++ でメモリマップ経由で様々なデータを&lt;br /&gt;アクセスしていたコードを Ruby で記述しようとすると結構面倒（な気がした）。&lt;br /&gt;ターゲットに想定しているシステムは残念ながらネイティブな ruby が&lt;br /&gt;ない（オープンソースにとても弱い OS なのでビルドするのも面倒）&lt;br /&gt;困ったものなので JRuby だよりになるのだが、どうも細かい点で&lt;br /&gt;動作が不安になる。Rails のそっけないエラーから根本原因を調べて&lt;br /&gt;行くのはとても面倒だ...&lt;br /&gt;&lt;br /&gt;Rails は簡単なダイナミックサイトにはもってこいだ。最初のうちは&lt;br /&gt;簡潔で、独特の記述方法にとまどったが、よくみれば Ruby のコードだ。&lt;br /&gt;ただ、active* など一連のものは Ruby のモジュールで、その詳細、&lt;br /&gt;慣例などは結構慣れを必要とするようだが、何かポイントだけ切り出した&lt;br /&gt;よい本はないものだろうか...&lt;br /&gt;&lt;br /&gt;Goldspike も動いたときは感動したものの、war ファイルのあまりの大きさと&lt;br /&gt;結局 JRuby + Rails + App をラップしているだけと気づくと何かさめて&lt;br /&gt;しまった。&lt;br /&gt;&lt;br /&gt;括弧を省いた記述ができたり、わかっている人にはわかる簡潔な書き方が&lt;br /&gt;色々とあるところは気に入った。&lt;br /&gt;&lt;br /&gt;Scala は正直とっつきにくい。なぜなら関数型言語の経験値が低いから。&lt;br /&gt;ただ、java との親和性は比較的たかく、お互いをコンポーネントとみなせる&lt;br /&gt;位の粒度で組むのであれば問題ない。ただし、java/Scala 間でクラスや&lt;br /&gt;インターフェイスを使った継承を持ち込むとすこし大変。推測で色々と&lt;br /&gt;試すと動いたりもしたが、果たして正しいのかどうかが難しい。&lt;br /&gt;Scala のエレガントな記述を使いこなすだけのベースがないのが残念な&lt;br /&gt;ところ。色々と用意された簡潔な記述方法はすばらしい。&lt;br /&gt;&lt;br /&gt;Python ... いまさらだが、昔、少しやってやめてしまっていた。&lt;br /&gt;ただし、機能は一通りあるわけだし、あとはどれだけ興味が維持できるかが&lt;br /&gt;ポイント。なんというか、少しあくとすぐにかけなくなる（すぐに文法を&lt;br /&gt;忘れてしまう...)。 Jython で java のクラスライブラリを使えるところはよい。&lt;br /&gt;&lt;br /&gt;Groovy も昔、入門だけしてご無沙汰でした。でも、改めていろんな&lt;br /&gt;入門ページをみて、Grails を試して、正直、気に入った。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4583783933682175200?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4583783933682175200/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4583783933682175200' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4583783933682175200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4583783933682175200'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2008/01/blog-post.html' title='最近の言語'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-1610457599686477250</id><published>2007-12-27T20:11:00.001+09:00</published><updated>2007-12-27T20:11:24.391+09:00</updated><title type='text'>JRuby idioms</title><content type='html'>* Java を使う&lt;br /&gt;&lt;br /&gt; - require 'java'&lt;br /&gt; - include_class 'java.lang.String' to short name access&lt;br /&gt; - java.lang.String.new("abc")&lt;br /&gt;&lt;br /&gt;* File I/O&lt;br /&gt;&lt;br /&gt;- read&lt;br /&gt;&lt;br /&gt; f = open(filename)&lt;br /&gt; while line = f.readline&lt;br /&gt;   :&lt;br /&gt; end&lt;br /&gt; f.close&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      begin&lt;br /&gt;        line = readline&lt;br /&gt;      rescue EOFError&lt;br /&gt;        break&lt;br /&gt;      end&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-1610457599686477250?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/1610457599686477250/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=1610457599686477250' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1610457599686477250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1610457599686477250'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/12/jruby-idioms.html' title='JRuby idioms'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-7897701284903902008</id><published>2007-12-26T20:12:00.000+09:00</published><updated>2007-12-26T20:13:15.739+09:00</updated><title type='text'>Google Chart API</title><content type='html'>Google Chart API の整理&lt;br /&gt;&lt;br /&gt;もっとも、Eastwood のためだが...&lt;br /&gt;&lt;br /&gt;- user １日 50000 リクエストまで。&lt;br /&gt;&lt;br /&gt; http://chart.apis.google.com/chart?&lt;br /&gt; chs=200x125&lt;br /&gt; &amp;chd=s:helloWorld&lt;br /&gt; &amp;cht=lc&lt;br /&gt; &amp;chxt=x,y&lt;br /&gt; &amp;chxl=0:|Mar|Apr|May|June|July|1:||50+Kb&lt;br /&gt;&lt;br /&gt;- chs=wwwxhhh は pixel 単位のサイズ&lt;br /&gt;- chd=.... はデータ&lt;br /&gt;- cht=... はチャートの種類&lt;br /&gt;- chxt=x,y は x, y 両方のラベルが必要ということを指定&lt;br /&gt;- chxl=... は x, y 軸のラベル&lt;br /&gt;&lt;br /&gt;- HTML に embed するときは &amp; ではなく &amp;amp; をつかう。&lt;br /&gt;&lt;br /&gt;- char data には３種類のエンコーディングがある。&lt;br /&gt;-- Simple 62 までの値 chd=s:...&lt;br /&gt;   A=0,B=1,Z=25,a=26,z=51,0=52,9=61,_=missing value&lt;br /&gt;   data set separator=","&lt;br /&gt;-- Text 1000 までの値 chd=t:...&lt;br /&gt;   0.0=0,1.0=1,100.0=100, -1=missing value &lt;br /&gt;   data set separator="|"&lt;br /&gt;-- Extended 4096 までの値 chd=e:&lt;br /&gt;   use char pair, A-Za-z0-9-._&lt;br /&gt;   AA = 0, AZ = 25, Aa = 26, Az = 51, A0 = 52, A9 = 61, A- = 62, A. = 63&lt;br /&gt;   BA = 64, BZ = 89, Ba = 90, Bz = 115, B0 = 116, B9 = 125, B- = 126, B. = 127&lt;br /&gt;   .A = 4032, .Z = 4057, .a = 4058, .z = 4083, .0 = 4084, .9 = 4093, .- = 4094, .. = 4095.&lt;br /&gt;   '_' = missing value&lt;br /&gt;   data set separator=","&lt;br /&gt;&lt;br /&gt;(書きかけ...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-7897701284903902008?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/7897701284903902008/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=7897701284903902008' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/7897701284903902008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/7897701284903902008'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/12/google-chart-api.html' title='Google Chart API'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-482238854033758730</id><published>2007-12-26T20:09:00.000+09:00</published><updated>2007-12-26T20:11:48.108+09:00</updated><title type='text'>NetBeans 6 / ruby gems OutOfMemoryError</title><content type='html'>Java heap size はどうもハードコーディングされているらしい。&lt;br /&gt;&lt;br /&gt;http://deadlock.netbeans.org/fisheye/rdiff/netbeans?csid=MAIN:mkrauskopf:20071216155725&amp;u&amp;N&lt;br /&gt;&lt;br /&gt;Index: ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java&lt;br /&gt;===================================================================&lt;br /&gt;RCS file: /cvsup/nb_all/ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java,v&lt;br /&gt;diff -u -N -r1.2 -r1.3&lt;br /&gt;--- ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java 16 Dec 2007 15:48:05 -0000 1.2&lt;br /&gt;+++ ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java 16 Dec 2007 15:57:25 -0000 1.3&lt;br /&gt;@@ -170,7 +170,7 @@&lt;br /&gt;             &lt;br /&gt;             String extraArgs = System.getenv("JRUBY_EXTRA_VM_ARGS"); // NOI18N&lt;br /&gt; &lt;br /&gt;-            String javaMemory = "-Xmx256m"; // NOI18N&lt;br /&gt;+            String javaMemory = "-Xmx512m"; // NOI18N&lt;br /&gt;             String javaStack = "-Xss1024k"; // NOI18N&lt;br /&gt;             &lt;br /&gt;             if (extraArgs != null) {&lt;br /&gt;&lt;br /&gt;JRUBY_EXTRA_VM_ARGS に -Xmx512m を指定することでこれは解決。&lt;br /&gt;&lt;br /&gt;rake がなかなか動いてくれない。以下のキーワードで探してみるが、&lt;br /&gt;これといったのが見つからない...&lt;br /&gt;&lt;br /&gt;"adding Java library jruby-complete-1.0.2" "rake aborted!" "execution expired"&lt;br /&gt;&lt;br /&gt;何とか war ファイルはできたものの、アクセスするとディレクトリリストが&lt;br /&gt;見えてしまう。アプリケーションとしては動かない。rake task で run すると&lt;br /&gt;jetty が起動されるが、JSP サポートがないと出る。&lt;br /&gt;ただ、war をデプロイしたのは Tomcat 5.5.1 だ。なぜだ？？？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-482238854033758730?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/482238854033758730/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=482238854033758730' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/482238854033758730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/482238854033758730'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/12/netbeans-6-ruby-gems-outofmemoryerror.html' title='NetBeans 6 / ruby gems OutOfMemoryError'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4475557846601656769</id><published>2007-12-21T19:05:00.000+09:00</published><updated>2007-12-21T19:06:17.601+09:00</updated><title type='text'>Scala</title><content type='html'>Java Posse の Martin Odersky の interview から、Scala の作者である&lt;br /&gt;だけではなく 1.3 以降の javac の開発もやってきた人だと関心。Scala &lt;br /&gt;自身は初見だったが、よく pod cast にでてきたのは覚えている。言語に&lt;br /&gt;うるさい人には気になるようだ。&lt;br /&gt;&lt;br /&gt;Scala のコンパイラ、実行環境はオープンソースでダウンロードできて、&lt;br /&gt;1.4 あたりからの java があれば実行できる。&lt;br /&gt;&lt;br /&gt;* Hello World&lt;br /&gt;&lt;br /&gt;  package hello;&lt;br /&gt;  object HelloWorld {&lt;br /&gt;    def main(args: Array[String]) {&lt;br /&gt;      println("Hello World!")&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;- package は java と同様&lt;br /&gt;- object Name { ... } は Name というシングルトンを作る&lt;br /&gt;- メソッドの定義は def ではじめる。引数は "名前: 型"　で宣言する&lt;br /&gt;- println は組み込み&lt;br /&gt;- import も同様に使えるが、機能が拡張されている。最後の要素で&lt;br /&gt;  {class1, class2} のようにまとめて指定でき、import a.b.C._ で&lt;br /&gt;  C がクラス名とすると、これは C に関する static import として&lt;br /&gt;  働く。&lt;br /&gt;&lt;br /&gt;- ソースの拡張子は .scala, scalac でコンパイル。ファイル名とクラス名の&lt;br /&gt;　一致の必要はないようだ。&lt;br /&gt;&lt;br /&gt;* クラス定義&lt;br /&gt;&lt;br /&gt;  class Complex(real: double, imaginary: double) {&lt;br /&gt;    def re = real&lt;br /&gt;    def im = imaginary&lt;br /&gt;    override def toString() =&lt;br /&gt;      "" + re + (if (im &lt; 0) "" else "+") + im + "i"&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;クラス名のあとに引数のリストが来る。これは primary constructor の&lt;br /&gt;シグネチャで、class の body がパースされる。ボディがパースされるのは&lt;br /&gt;ruby に似ている。&lt;br /&gt;&lt;br /&gt; def re = real&lt;br /&gt;&lt;br /&gt;は初期値の設定と re という getter/setter の宣言でもある。プロパティを&lt;br /&gt;作っているといってもいいかも知れないが、うるさい人は色々と意見がある&lt;br /&gt;だろう。本当のプロパティはコンポーネントモデルにおけるプロパティであり、&lt;br /&gt;参照、設定のほかにもイベント機能なども備えないとなど云々...&lt;br /&gt;&lt;br /&gt;Ruby のように自明なものは関数のあとに () を書かなくても呼べる。&lt;br /&gt;またオブジェクトのオペレーションを呼ぶときに "." すら省略できるケースが&lt;br /&gt;ある。&lt;br /&gt;&lt;br /&gt;インスタンス化は java とほぼ同じ。&lt;br /&gt;&lt;br /&gt;  val c = new Complex(1.2, 3.4)&lt;br /&gt;&lt;br /&gt;これは厳密に書けば&lt;br /&gt;&lt;br /&gt;  val c: Complex = new Complex(1.2, 3.4)&lt;br /&gt;&lt;br /&gt;* Generics / Genericity&lt;br /&gt;&lt;br /&gt;Generics/Template 相当の機能を備えている。Genericity と呼んでいる。&lt;br /&gt;下の例では a は任意の型。&lt;br /&gt;&lt;br /&gt;  class Reference[a] {&lt;br /&gt;    private var contents: a = _&lt;br /&gt;    def set(value: a) { contents = value }&lt;br /&gt;    def get: a = contents&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;* Mixin 機能。&lt;br /&gt;&lt;br /&gt;Ruby のものと似ている。AOP の手法の一つともいえる。実態つき、拡張可能な&lt;br /&gt;インターフェイスのようなものと言ってもいい。&lt;br /&gt;&lt;br /&gt;* call-by-value/call-by-name&lt;br /&gt;&lt;br /&gt;関数呼び出しは call-by-value と call-by-name があり、引数の評価の&lt;br /&gt;仕方が異なる。デフォルトは call-by-valude であるが、reduction が&lt;br /&gt;完了しない事がある。その場合にはパラメータの型の前に =&gt; を入れると&lt;br /&gt;call-by-name になる。&lt;br /&gt;&lt;br /&gt; def constOne(x: Int, y: =&gt; Int) = 1&lt;br /&gt;&lt;br /&gt;* if-else は conditional expression の様にも使える。&lt;br /&gt;&lt;br /&gt; def abs(x: Double) = if (x &gt;= 0) x else x&lt;br /&gt;&lt;br /&gt;* Unit は java の void とほぼ同様。()&lt;br /&gt;&lt;br /&gt;* Nested function&lt;br /&gt;&lt;br /&gt;inner class の様に関数の中に関数を定義できる。一番外側の関数の変数は&lt;br /&gt;nested function からも参照できる。&lt;br /&gt;&lt;br /&gt;* Tail Recursion&lt;br /&gt;&lt;br /&gt;一見、再起呼び出しに見えても、スタックを余計に消費しないように実行できる&lt;br /&gt;場合はそうしてくれる。&lt;br /&gt;&lt;br /&gt;* First-Class Functions&lt;br /&gt;&lt;br /&gt;関数は first-class value と呼ばれ、他の関数に渡すことができる。そのような&lt;br /&gt;関数を受け取ったり、返したりする関数は higher-order functions と呼ばれる。&lt;br /&gt;&lt;br /&gt;関数のパラメータの型は "Int =&gt; Int" (Int をとり Int を返す) という形で&lt;br /&gt;指定できる。その例として下のものは a から b の間の値に f 適用してその&lt;br /&gt;合計をとる関数となる。&lt;br /&gt;&lt;br /&gt; def sum(f: Int =&gt; Int, a: Int, b: Int): Int =&lt;br /&gt;   if (a &gt; b) 0 else f(a) + sum(f, a + 1, b)&lt;br /&gt;&lt;br /&gt; def sumInts(a: Int, b: Int): Int = sum(id, a, b)&lt;br /&gt; def sumSquares(a: Int, b: Int): Int = sum(square, a, b)&lt;br /&gt; def sumPowersOfTwo(a: Int, b: Int): Int = sum(powerOfTwo, a, b)&lt;br /&gt;&lt;br /&gt; def id(x: Int): Int = x&lt;br /&gt; def square(x: Int): Int = x * x&lt;br /&gt; def powerOfTwo(x: Int): Int = if (x == 0) 1 else 2 * powerOfTwo(x 1)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4475557846601656769?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4475557846601656769/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4475557846601656769' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4475557846601656769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4475557846601656769'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/12/scala.html' title='Scala'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4479463884941484727</id><published>2007-12-20T20:22:00.000+09:00</published><updated>2007-12-20T20:23:48.433+09:00</updated><title type='text'>J2EE 1.4</title><content type='html'>J2EE 1.4 で iBATIS を使った Bean Managed Entity Bean のサンプルを作ることに&lt;br /&gt;なった。一つ一つ手で行うのは無謀なので NetBeans6 を使ってみる。&lt;br /&gt;&lt;br /&gt;J2EE 1.4 なので以下の URL を参考にする。&lt;br /&gt;http://www.netbeans.org/kb/41/&lt;br /&gt;http://www.netbeans.org/kb/41/j2ee-tut/index.html&lt;br /&gt;&lt;br /&gt;SavingsAccount のサンプルで Bean Managed Bean を作ってみる。Bean Module を&lt;br /&gt;作り、Entity Bean を追加する。Entity Bean 内で Enterprise Resource -&gt;&lt;br /&gt;Use Database でデータベースを選択することになるが、サンプルは NetBeans4.1&lt;br /&gt;ベースで当時のバンドルデータベースは pointbase で細かなところが違って&lt;br /&gt;くる。&lt;br /&gt;&lt;br /&gt;Use Database のダイアログでまず最初に指定するのは Reference Name だが、&lt;br /&gt;これは app server ごとに異なる sun-ejb-jar.xml の中で JNDI で参照する&lt;br /&gt;サーバのデータベースリソース (jdbc/mysqlTest01 等) につける名前だ。&lt;br /&gt;この設定は NetBeans が勝手にやってくれる。選択対象は Sun Java System&lt;br /&gt;Application Server Admin Console の Resources/JDBC/JDBC Resources の&lt;br /&gt;エントリから選択することになる。このページには jdbc/* がリストされている。&lt;br /&gt;これらのエントリは個々に enable/disable ができて Resources/JDBC/Connection Pools &lt;br /&gt;のエントリを参照している。Connection Pools のエントリはいわゆるデータ&lt;br /&gt;ソースで URL, user, JDBC driver 等の属性を持っている。PointBase を&lt;br /&gt;復習するのも面倒なので MySQL を使ってみる。ウィザードを使えば設定は&lt;br /&gt;比較的簡単だが、最初 XA driver を選んでしまい、トランザクション関連の&lt;br /&gt;エラーになったので、ただのデータソースにした。コネクションプールに&lt;br /&gt;対応した JDBC Resource も定義して、Entity Bean からは適当に名前を&lt;br /&gt;つけたリソースを参照させる。&lt;br /&gt;&lt;br /&gt;実際の DB ソーサのコードはベタな JDBC なのでサンプルからコピー。&lt;br /&gt;ビジネスメッソッドもコンテキストメニューを使ったり、リファクタリングの&lt;br /&gt;フィールドのエンカプセレイト機能を使って作っていく。ビジネスメソッドは&lt;br /&gt;対応するものが *Remote.java のインターフェイスに定義されていなければ&lt;br /&gt;ならないが、IDE が 'throws RemoteException;' を自動的につけてくれて&lt;br /&gt;いないメソッドについては実行時にエラーが出たので、手でつけた。&lt;br /&gt;&lt;br /&gt;Home メソッドも追加していくことになるが、コンテキストメニューで追加すると&lt;br /&gt;Bean には ejbFindByLastName のようなメソッドができるが、戻り値を複数に&lt;br /&gt;指定しておくとどうやら Home インターフェイス側には cByLastName のような&lt;br /&gt;メソッドができる。コレクションで返すのでこういうネーミングになっているのかも&lt;br /&gt;と勝手に納得していたが、そういうことではないらしい。名前はあっていないと&lt;br /&gt;いけない。インターフェイスにあわせて ejbCByLastName とやってもだめ、&lt;br /&gt;ejbcByLastName とやってもだめだった。Collection を返すことが名前から&lt;br /&gt;わかることは悪いことではないと思い、Home 側を findcByLastName として&lt;br /&gt;Bean 側を ejbFindcByLastName とすると動いた。この辺は Java Beans の&lt;br /&gt;細かなところを調べればわかるのかも知れないが、その気力はない。&lt;br /&gt;経験則としてキャメルケース・パスカルケースに１文字のワードというか、節を&lt;br /&gt;持たせるのは良くないということを覚えておこう。&lt;br /&gt;&lt;br /&gt;これくらいをクリアしたところで動くようになった。サンプルのクライアントで&lt;br /&gt;一箇所だけ動かなかったのは remove の呼び出し。そのままでは文法エラーに&lt;br /&gt;なるし、home 経由で呼ぼうとしてもエラーが消えない。今回はスキップ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次に Roster のサンプルで CMP も確認しておく。このケースではもともと&lt;br /&gt;関連のあるテープルを定義しておいて、それから New -&gt; CMP Entity Beans from&lt;br /&gt;Database... で作っている。若干強引に MySQL 上にテーブルを作ってこの処理を&lt;br /&gt;すると関連のテーブルだけプライマリキーがないということで Bean が&lt;br /&gt;作成されない。alter table _table_name_ add constraint primary key (field, field1,...)&lt;br /&gt;で強引にやると作成されたが、ejb-jar.xml に CMP Relationships がまったく&lt;br /&gt;現れない。&lt;br /&gt;&lt;br /&gt;結局 Derby でテーブル作成の SQL が通ったので、それをもとにやってみると&lt;br /&gt;動いたみたい。1:N や M:N の参照をわかりやすい名前に ejb-jar.xml で変更する&lt;br /&gt;とそれがソースに反映されるとあったが、どうやらこれは動いていない。&lt;br /&gt;&lt;br /&gt;次のステップとしていくつかの Bean に finder メソッドを EJB QL で追加して&lt;br /&gt;行くところだが、このあたりは NB 4.1 と 6.0 の違いが大きいようで、このあたりで&lt;br /&gt;今日は断念。&lt;br /&gt;&lt;br /&gt;やっぱり、昔の EJB は面倒くさい...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4479463884941484727?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4479463884941484727/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4479463884941484727' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4479463884941484727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4479463884941484727'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/12/j2ee-14.html' title='J2EE 1.4'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-8523181373246893467</id><published>2007-12-09T12:46:00.000+09:00</published><updated>2007-12-09T12:57:36.713+09:00</updated><title type='text'>Xcode</title><content type='html'>自作の C++ アプリケーションのリファクタリングの為に NetBeans6 に取り込んでみる。&lt;br /&gt;その過程でコンパイラを聞かれるがデフォルトではLeopard にはコンパイラはないらしい。&lt;br /&gt;(cc, c++ は not found になる。）Google を見て回ったところ Xcode というパッケージに&lt;br /&gt;含まれているようだ。ユーザー登録をすれば ADC からダウンロードできるとのこと。&lt;br /&gt;ユーザー登録の際に Apple ID とリンクできるようなことが書いてあったので、登録して&lt;br /&gt;みると確認等の画面で日本語が文字化けしている。まあいいだろうということでXcode 3.0&lt;br /&gt;をダウンロード。ディスクイメージをマウントしてみて出てきた PDF をみてみると&lt;br /&gt;Leopard のメディアにも入っているらしいということが判明...&lt;br /&gt;&lt;br /&gt;展開したものから XcodeTools.mpkg を入れてみる。特に問題なくインストール完了。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Macintosh:wtp$ cc&lt;br /&gt;i686-apple-darwin9-gcc-4.0.1: no input files&lt;br /&gt;Macintosh:wtp$ c++&lt;br /&gt;i686-apple-darwin9-g++-4.0.1: no input files&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-8523181373246893467?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/8523181373246893467/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=8523181373246893467' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8523181373246893467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8523181373246893467'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/12/xcode.html' title='Xcode'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-1238977084788301266</id><published>2007-11-22T06:21:00.000+09:00</published><updated>2007-11-22T08:31:14.415+09:00</updated><title type='text'>Leopard</title><content type='html'>Mac mini が届いた。が、気づいたらキーボードがPS2 だった。&lt;br /&gt;翌日Apple keyboard を購入してやっと起動。ムービーが流れて、&lt;br /&gt;ユーザー登録から始まる。まだTiger だ。&lt;br /&gt;Leopard の DVD? を入れてアップグレード。難なく終わった。&lt;br /&gt;&lt;br /&gt;Spaces はデフォルトでオフなので、オンにしたが F8 がきかない。&lt;br /&gt;Apple keyboard では F1-F12 まではほかの機能に割り当てられていて&lt;br /&gt;ファンクションキーとして動かすには fn と同時に押す必要が&lt;br /&gt;あるようだ。でも、それでは面倒なので起動は F13 にふってみたが、&lt;br /&gt;動作がどうも見覚えのあるのと違う。４つの小窓が出てきて、矢印も&lt;br /&gt;出てきてびゅんびゅんと切り替わるというイメージだったが、どうも&lt;br /&gt;地味だ。後でわかったが ctrl+矢印でそのような動作になる。&lt;br /&gt;築かなかったらフリーソフト探しまくってたかも...&lt;br /&gt;&lt;br /&gt;Mail で IMAP 接続できるか試してみるが、これには SSL 機能は&lt;br /&gt;見当たらない。あきらめかけたところで、Thunderbird を試して&lt;br /&gt;みる。なんか、うまくいった。ただ、パスワードを覚えさせて&lt;br /&gt;しまって、それがどこに行ったか気になった。OS X のキーチェーン&lt;br /&gt;を調べても Thunderbird のエントリはないし... どうやら Thunderbird&lt;br /&gt;自身が保持しているようだが、詳細は今日のところはあきらめた。&lt;br /&gt;&lt;br /&gt;Boot camp で既存ボリュームのリサイズができるか気になっていた&lt;br /&gt;ので試してみたが、問題ないようだ。&lt;br /&gt;&lt;br /&gt;Parallels も購入しておいたので入れてみる。最初の起動でプロダクト&lt;br /&gt;キーを入れたら、アップデート版の通知がでる。アップデートすると&lt;br /&gt;もう一度プロダクトキーを要求された。&lt;br /&gt;&lt;br /&gt;マニュアルが厚めだったので、かまわず直感でやってみる。&lt;br /&gt;ゲストOS に見せるメモリサイズや、ディスクサイズなどの設定は&lt;br /&gt;一番詳しい（一番下）のモードを選ぶ必要がありそう。&lt;br /&gt;&lt;br /&gt;Solaris 10 を入れてみた。やはり I/O がホストOS 経由のせいか&lt;br /&gt;直接ディスク入れるときより遅い気がする。はたと気づくと Parallels&lt;br /&gt;のウィンドウがない。ただ、プロセスとしては存在しているようだ。&lt;br /&gt;このとき、ほとんど操作ミスで画面のスクリーンショットをとった&lt;br /&gt;のだが、そこにはコンソールモードでの問い合わせメッセージが&lt;br /&gt;でている。NFS のドメインがなんたらというやつだ。&lt;br /&gt;&lt;br /&gt;よくわからなかったので、強制終了して Lepard も再起動。Solaris 10&lt;br /&gt;は起動中にいわゆるシングルユーザーモードで止まってしまった。&lt;br /&gt;インストールが完了していないということだろう。&lt;br /&gt;&lt;br /&gt;いったん消して、再度インストールしてみる。右側のタブに全画面表示&lt;br /&gt;があったので、今度はそのモードでインストール。alt-enter で全画面と&lt;br /&gt;通常を行き来できる。VMWare などと同じでいったんゲストの画面に&lt;br /&gt;マウスポインタが移ると ctrl-alt しないと OS X にもどらない。&lt;br /&gt;&lt;br /&gt;インストール完了、GUI ログインも出てくる。が、画面がでかい。&lt;br /&gt;xwininfo -root でみると 1600x1200 になっている。Parallels の&lt;br /&gt;編集／仮想マシン、、、で画面サイズを変更しても反映されない。&lt;br /&gt;これは xorgcfg でディスプレイのサイズを低い解像度にすることで&lt;br /&gt;解決できた。&lt;br /&gt;&lt;br /&gt;次はネットワークだが、どうも Solaris からは見えていない。SMC &lt;br /&gt;などで DHCP の設定などないか探してみるが見当たらない。Solaris との&lt;br /&gt;ファイル共有はできないので、ファイル転送はネットワークしかないのだが...&lt;br /&gt;&lt;br /&gt;Google をサーチすると手順が見つかった。/Library/Parallels/Tools/vmtools.iso&lt;br /&gt;をCD/DVD デバイスにして Solaris を立ち上げると、このイメージがマウント&lt;br /&gt;されているので、その中にある solaris 用の network.sh を実行して、&lt;br /&gt;DHCP のクライアントになるかに yes と答えるだけだ。どうやら、ここの&lt;br /&gt;部分は Parallels 側から提供されていて、インストール時点では&lt;br /&gt;ネットワークは全くないことになっているようだ。&lt;br /&gt;&lt;br /&gt;あがってしまえば ssh, scp で操作はできる。&lt;br /&gt;&lt;br /&gt;ちょっとじたばたしたが、結構いい感じ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-1238977084788301266?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/1238977084788301266/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=1238977084788301266' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1238977084788301266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1238977084788301266'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/11/leopard.html' title='Leopard'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-3745265797779455869</id><published>2007-11-20T18:27:00.001+09:00</published><updated>2007-11-20T18:27:53.518+09:00</updated><title type='text'>Ant notes</title><content type='html'>Ant の覚え書き&lt;br /&gt;&lt;br /&gt;ファイルからプロパティをロードするには次の要素を設定しておく。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;property file="build.properties"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;build.properties には key = value を書いておく。&lt;br /&gt;build.xml からは ${key} で参照可能。&lt;br /&gt;&lt;br /&gt;あまり真剣に書いたことがなかったが、Java プログラムの起動に引数が&lt;br /&gt;たくさんつくケースのために java タスクを使ってみる。結果、次のような&lt;br /&gt;物に落ち着いた。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;target name="run_pja" depends="compile" description="run"&amp;gt;&lt;br /&gt;   &amp;lt;java classname="test" fork="true"&amp;gt;&lt;br /&gt;     &amp;lt;classpath&amp;gt;&lt;br /&gt;       &amp;lt;pathelement location="${jcaptcha.jar_path}"/&amp;gt;&lt;br /&gt;       &amp;lt;pathelement path="."/&amp;gt;&lt;br /&gt;     &amp;lt;/classpath&amp;gt;&lt;br /&gt;     &amp;lt;jvmarg value="-Xbootclasspath/a:${pjajar}"/&amp;gt;&lt;br /&gt;     &amp;lt;jvmarg value="-showversion"/&amp;gt;&lt;br /&gt;     &amp;lt;sysproperty key="awt.toolkit" value="com.eteks.awt.PJAToolkit"/&amp;gt;&lt;br /&gt;     &amp;lt;sysproperty key="java.awt.graphicsenv"&lt;br /&gt;             value="com.eteks.java2d.PJAGraphicsEnvironment"/&amp;gt;&lt;br /&gt;     &amp;lt;sysproperty key="java2d.font.usePlatformFont" value="false"/&amp;gt;&lt;br /&gt;     &amp;lt;sysproperty key="java.awt.fonts" value="${jh}/jre/lib/fonts"/&amp;gt;&lt;br /&gt;     &amp;lt;sysproperty key="user.home" value="${pja_home}/lib"/&amp;gt;&lt;br /&gt;   &amp;lt;/java&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;fork="true" をしてしているのは jvmarg は fork="true" でのみ有効だから。&lt;br /&gt;&lt;br /&gt;-Dkey=value は &amp;lt;sysproperty key="..." value="..."/&amp;gt; を羅列すれば&lt;br /&gt;良いらしい。&amp;lt;syspropertyset .../&amp;gt; は使っていた版で java task ない&lt;br /&gt;ではサポートされていないと出たので今回は見送る。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-3745265797779455869?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/3745265797779455869/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=3745265797779455869' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/3745265797779455869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/3745265797779455869'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/11/ant-notes.html' title='Ant notes'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4332680804016182126</id><published>2007-11-16T17:44:00.000+09:00</published><updated>2007-11-16T20:18:31.213+09:00</updated><title type='text'>Technologies for SOA</title><content type='html'>&lt;h2&gt;SOA!!!&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Sun Tech Days で SOA 関連のセッションで紹介されていた BPEL など SOA &lt;br /&gt;関連の技術が思っていたよりわかりやすかった。また、NetBeans 6 ではその&lt;br /&gt;開発を補助する機能がそろっているという事でチュートリアルをみながら&lt;br /&gt;試してみた。&lt;br /&gt;&lt;br /&gt;以前、Axis を活用しようと思ったときに、XML Schema や WSDL の手書きに&lt;br /&gt;ウンザリしたので、少し敬遠していたけれど、NB6 ではこれらのファイルも&lt;br /&gt;IDE の管理下で作れるらしい。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;チュートリアル概要&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;HelloWorld は単純すぎるので Loan のサンプルの概要を書いておく。&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;BPEL モジュールの作成&lt;/h4&gt;&lt;br /&gt;New Project &amp;gt; SOA &amp;gt; BPEL Module で作成できる。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;XML Schema の作成&lt;br /&gt;&lt;div&gt;&lt;br /&gt;サービス呼び出しの際に簡単な文字列をひとつ渡すだけであれば、これは&lt;br /&gt;おそらく必要がない。実際には何らかのデータ構造を渡すことになるであろうし、&lt;br /&gt;それには、それなりの型を持たすことがわかりやすい。そうするためには XML&lt;br /&gt;Schema で complex type を定義することになる。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;実際の操作は画面右側のパレットから Complex Type を Editor の Complex Types&lt;br /&gt;のところにドロップすることで型が作れる。さらにそれぞれの型に Element icon&lt;br /&gt;をドロップして要素を作っていく。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;もうひとつ行うことは Complex Type を決めてから、それらをグローバルエレメントに&lt;br /&gt;登録すること。やり方は Element icon を Editor の Elements のところにドロップ&lt;br /&gt;して名前をつけて、Definition で Complex Types に作った型の名前をセットする。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WSDL の作成&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Process Files の下に WSDL document を作成する。独自の XML Schema を使う場合には&lt;br /&gt;Import XML Schema File(s) チェックボックスをチェックして先に定義したものや、&lt;br /&gt;ネームスペースを利用して、インポートできる。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;次は Editor の Partner タブでメッセージの名前や、型を決める。In/Out の最低２つは&lt;br /&gt;あるので、リクエストの名前をわかりやすいものに変え、型を決める。型はダイアログの&lt;br /&gt;中から選ぶだけなので簡単。XML Schema をインポートしておけばその中で決めた型を&lt;br /&gt;引数の型に使える。この際の型の名前は complex type の名前ではなく Elements に&lt;br /&gt;登録した名前になる。IDE が選択肢を示してくれるので簡単だが、うろ覚えで手書きだと&lt;br /&gt;とてもはまるかも知れない... &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;オプショナルで LoanProcessor EJB モジュールを作る。ユーザー情報をもとに Loan の&lt;br /&gt;可否を判定する。必然的に Web Service のインターフェイスを持つことになる。&lt;br /&gt;Web Service のフォルダを右クリックして Web Service を作れる。そのあと、その&lt;br /&gt;Web Service を右クリックして Add Operation で操作を追加する。その際にパラメータも&lt;br /&gt;定義する。結果として @WebService アノテーションを使った java ソースができる。&lt;br /&gt;作成時に Session Bean にデリゲートすることもできるようだ。&lt;br /&gt;本当に EJB じゃないといけないのかと疑問に思った。なぜなら EJB Container が&lt;br /&gt;前提といわれると困るから。結果として、これは杞憂。できたのは本当にクラスを&lt;br /&gt;まとめただけの jar ファイルだった。wsdl もこの時点では存在しない。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;BPEL process の作成&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Process Files に BPEL Process を作るとフローチャートのような画面が現れる。&lt;br /&gt;まずはここに入力として request の wsdl, Loan のチェックを行う web service&lt;br /&gt;を登録する。後者に関しては wsdl は自動生成されるようだ。このステップは&lt;br /&gt;モジュールのドラッグでできる。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;この次のステップとして、receive, invoke, reply をパレットからドラッグして、&lt;br /&gt;サービスと関係付けていく。プロセスの最初は、receive で始まる。リクエスト待ちの&lt;br /&gt;先頭というわけだ。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Assign 要素で変数を作る。関連づけは BPEL Mapper でソースとデスティネーションを&lt;br /&gt;つなぐだけだ。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Composite Application の作成&lt;br /&gt;&lt;div&gt;&lt;br /&gt;別プロジェクトとして Composite Application を作る。この定義ファイルは *.casa.&lt;br /&gt;この JBI モジュールとして、作成した BPEL module をドラッグ＆ドロップで登録。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;これに consumer としての SOAP アダプターを登録する。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;テストの作成、登録&lt;br /&gt;&lt;div&gt;&lt;br /&gt;composite application の Test folder にテストを作れる。リクエストのパラメータを&lt;br /&gt;埋めるだけでテストになる。1回目の実行結果が正しい実行結果とされ、以後のテストと&lt;br /&gt;比較される。結果を消す、クリアしてしまえば正しいテスト結果を変えられるということか？&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;JBI とは&lt;br /&gt;&lt;div&gt;&lt;br /&gt;NB6 の Composite Application が JBI の実装ということかなと思う。JSR 208 という&lt;br /&gt;事だが、これには IBM, BEA は賛同していないらしい。BPEL まではいいが、その上は&lt;br /&gt;まだ議論の余地があるということか....ということはこれらのベンダのBusiness Process&lt;br /&gt;Integration は propretary ???&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4332680804016182126?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4332680804016182126/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4332680804016182126' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4332680804016182126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4332680804016182126'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/11/technologies-for-soa.html' title='Technologies for SOA'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-7212540043299086935</id><published>2007-10-03T18:31:00.000+09:00</published><updated>2007-10-03T22:11:25.351+09:00</updated><title type='text'>ruby misc tips</title><content type='html'>Gem での proxy 超えは http_proxy 環境変数に http://_proxy_host_:_port_ を&lt;br /&gt;設定するのが良いらしい。&lt;br /&gt;&lt;br /&gt;rake を初めてビルドツールとして使ってみる。利点は make/ant に比べて&lt;br /&gt;rakefile の記述力が高いということだろうか。慣れると面白そう。&lt;br /&gt;http://www2s.biglobe.ne.jp/~idesaku/sss/tech/rake/&lt;br /&gt;&lt;br /&gt;Capistrano も気になって少し調べてみる。こちらはデプロイツールとなっている。&lt;br /&gt;複数のホストにまたがる更新処理などを書きやすいということのようだ。&lt;br /&gt;古い版は Rails に依存していたのでレシピファイルは config/deploy.rb だが&lt;br /&gt;現行の v2.0.0 では Capfile または capfile も受け付ける。&lt;br /&gt;&lt;br /&gt;$ gem install capistrano --include-dependencies&lt;br /&gt;&lt;br /&gt;ssh が使えて posix shell 相当のものがデフォルト（？）の場所にあるシステム&lt;br /&gt;に対していろいろと実行を指示出来るようである。&lt;br /&gt;&lt;br /&gt;ssh が使えてというのは capistrano を実行するシステムの ssh public key が&lt;br /&gt;リモートのシステムの authorized_keys に登録された状態をいう。&lt;br /&gt;手順としては ssh-keygen -t dsa で private/public キーを作り、public キー&lt;br /&gt;をログイン先の .ssh の authorized_keys に追加する。クライアントからは&lt;br /&gt;ssh リモートホスト だけでログインできるようにしておく。一回目は known_hosts &lt;br /&gt;更新があるので登録するかどうか聞かれるので、登録しておく。private キーを&lt;br /&gt;暗号化した場合には ssh でリモートアクセスする際に、クライアントサイドで&lt;br /&gt;private キーを使用するために暗号化に使用したパスワード（パスフレーズ？）を&lt;br /&gt;聞かれる。このケースはよく試していないが capistrano からでもターミナルで&lt;br /&gt;インターラクティブに実行している分には問題なさそう。&lt;br /&gt;&lt;br /&gt;Cygwin に OpenSSH を入れれば SSH サーバとして構成できるようで (ssh-host-config&lt;br /&gt;を一度実行する必要がある、また Cygwin 自体 all user 対象でインストールし、かつ&lt;br /&gt;アドミン権限が必要）サービスを起動しておけば ssh で Windows マシンにログイン&lt;br /&gt;できる。結局のところ Cygwin 環境にリモートで入るわけで Linux より少し&lt;br /&gt;不便な環境ぐらいに思ったほうが良いだろう。&lt;br /&gt;&lt;br /&gt;Capistrano 自体はまだまだ学習しないといけないが、task にどのホストで実行&lt;br /&gt;させるかという属性がつけられる。また、単一、複数のほすとを role として&lt;br /&gt;定義し、role に対して特定のタスクを実行などということもできる。&lt;br /&gt;http://www.capify.org/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-7212540043299086935?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/7212540043299086935/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=7212540043299086935' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/7212540043299086935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/7212540043299086935'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/10/ruby-misc-tips.html' title='ruby misc tips'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-8681624280836196504</id><published>2007-10-02T18:37:00.000+09:00</published><updated>2007-10-02T18:38:06.392+09:00</updated><title type='text'>rails again</title><content type='html'>Linux で Ruby on Rails 環境を確保。&lt;br /&gt;&lt;br /&gt;サービスの設定に mysqld があるので、起動してみると動いたみたい。&lt;br /&gt;&lt;br /&gt;さて、パスワードはなんだ？？？　管理ユーザは root なのか？？？&lt;br /&gt;&lt;br /&gt;mysqld は --skip-grant-tables オプションつきで起動すると&lt;br /&gt;権限不要モードで立ち上がる。その状態で mysql mysql で接続して&lt;br /&gt;次のように root のパスワードをクリアできる。&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; update user set Password=null where Host='localhost' and User='root';&lt;br /&gt;&lt;br /&gt;どうやら RedHat についてくる mysql はこの状態になっている。&lt;br /&gt;(したがって上記は不要)&lt;br /&gt;&lt;br /&gt;使える状態にするため root にパスワードを設定する。&lt;br /&gt;&lt;br /&gt;# mysqladmin --user=root password &amp;lt;newpass&amp;gt;&lt;br /&gt;&lt;br /&gt;なければデータベースを作る&lt;br /&gt;&lt;br /&gt;mysql &amp;gt; create table test;&lt;br /&gt;&lt;br /&gt;アプリケーション用のユーザーを作る&lt;br /&gt;mysql &amp;gt; grant all privileges on test.* to test@localhost identified by '...';&lt;br /&gt;&lt;br /&gt;一応、作成したユーザーでローカルアクセスできるかを確認。&lt;br /&gt;$ mysql -u test -p test&lt;br /&gt;Password:&lt;br /&gt;mysql&amp;gt; show tables;&lt;br /&gt;&lt;br /&gt;Rails のインスタンスを作成&lt;br /&gt;$ rails test1&lt;br /&gt;&lt;br /&gt;当面は development 部分だけでよいが database 設定を行う（user, password, etc）&lt;br /&gt;$ vi config/database.yml &lt;br /&gt;&lt;br /&gt;ちなみに local 接続のソケットはデフォルトが /tmp/mysql.sock になっているようなので&lt;br /&gt;sock: /var/lib/mysql/mysql.sock の一行を入れて適切に変更。このパスは ps -ef | grep mysql&lt;br /&gt;で見つけた。&lt;br /&gt;&lt;br /&gt;まずはモデルの作成。&lt;br /&gt;&lt;br /&gt;$ ruby script/generate model Book&lt;br /&gt;...&lt;br /&gt;      create db/migrate/001_create_books.rb&lt;br /&gt;&lt;br /&gt;db/migrate/001_create_books.rb を編集してフィールドを定義&lt;br /&gt;create_table の do block 内にカラムを名前、型で定義。&lt;br /&gt;これで sql を打たなくてもテーブルが作れる。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class CreateBooks &amp;lt; ActiveRecord::Migration&lt;br /&gt;  def self.up&lt;br /&gt;    create_table :books do |t|&lt;br /&gt;      t.column :isbn, :string&lt;br /&gt;      t.column :name, :string&lt;br /&gt;      t.column :author, :string&lt;br /&gt;      t.column :manufacturer, :string&lt;br /&gt;      t.column :release_on, :date&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.down&lt;br /&gt;    drop_table :books&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;$ rake migrate&lt;br /&gt;// 実はここで socket がおかしいことに気づいた。&lt;br /&gt;&lt;br /&gt;$ rake migrate&lt;br /&gt;== CreateBooks: migrating ====...&lt;br /&gt;-- create_table(:books)&lt;br /&gt;  -&gt; 0....&lt;br /&gt;== CreateBooks: migrate (0....s) ===&lt;br /&gt;&lt;br /&gt;The rake task migrate has been deprecated, please use the replacement&lt;br /&gt;version db:migrate&lt;br /&gt;&lt;br /&gt;メッセージは db:migrate を今後は使いなさいとのこと。&lt;br /&gt;&lt;br /&gt;ここで rake と打つとテストをしてくれるらしいが socket のエラーで失敗する。&lt;br /&gt;test 以下のファイルを眺めていると、結局 config の下のファイルに行き着く。&lt;br /&gt;database.yml には test セクションがあり、そこはデフォルトのままだったので &lt;br /&gt;db name, user, pass, socket をなおす。このあとは rake は動作するようになった。&lt;br /&gt;&lt;br /&gt;あとは scaffold を Book に対して行えばとりあえず CRUD はできるようになる。&lt;br /&gt;&lt;br /&gt;$ ruby script/generate scaffold Book&lt;br /&gt;&lt;br /&gt;$ ruby script/server&lt;br /&gt;&lt;br /&gt;validation の例：&lt;br /&gt;&lt;br /&gt;$ vi app/models/book.rb&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Book &amp;lt; ActiveRecord::Base&lt;br /&gt;  protected&lt;br /&gt;    def validate&lt;br /&gt;      errors.add('isbn', 'format error') unless isbn =~ /\A[0-9X]+\z/&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;DB 抜きで簡単なアプリを作りたければ&lt;br /&gt;&lt;br /&gt;$ ruby script/generate controller foo&lt;br /&gt;とすると次のファイルができる。&lt;br /&gt;  app/views/foo&lt;br /&gt;  app/controllers/foo_controller.rb&lt;br /&gt;  test/functional/foo_controller_test.rb&lt;br /&gt;  app/helpers/foo_helper.rb&lt;br /&gt;&lt;br /&gt;このまま foo にアクセスしても Unknown action と出るだけ。&lt;br /&gt;FooController もからだし、view も空っぽだ。&lt;br /&gt;&lt;br /&gt;$ vi app/views/foo/index.rhtml&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Foo&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Foo page&amp;lt;/h2&amp;gt;&lt;br /&gt;This is the index page for Foo&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これでも悪くはないがスタイルの適用を考えれば &lt;br /&gt;&lt;br /&gt;app/views/layouts 以下に view の名前で rhtml を作り、app/views/&amp;lt;controller&amp;gt;/*.rhtml&lt;br /&gt;は body の中身だけにすると良い。&lt;br /&gt;&lt;br /&gt;$ vi app/views/layouts/foo.rhtml&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;meta http-equiv="content-type" content="text/html;charset=UTF-8" /&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;Foo: &amp;lt;%= controller.action_name %&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;%= stylesheet_link_tag 'scaffold' %&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p style="color: green"&amp;gt;&amp;lt;%= flash[:notice] %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%= yield  %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ vi app/views/foo/index.rhtml&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Foo page&amp;lt;/h2&amp;gt;&lt;br /&gt;This is the index page for Foo&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-8681624280836196504?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/8681624280836196504/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=8681624280836196504' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8681624280836196504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8681624280836196504'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/10/rails-again.html' title='rails again'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-8154959804238737774</id><published>2007-09-07T11:49:00.000+09:00</published><updated>2007-09-07T11:54:54.887+09:00</updated><title type='text'>try / finally by jsr/ret (~java1.3)</title><content type='html'>Java 1.3 までは try/finally を jsr バイトコードで実現していた。&lt;br /&gt;一見、トリッキーだがわかってみれば簡潔にできている気もする。&lt;br /&gt;しかし、jsr バイトコードはベリフィケーションが難しく、使用を&lt;br /&gt;避ける方向にある。1.4 以降の javac コンパイラでは極力使用しない&lt;br /&gt;ようになっている。1.5 開発時には jsr をなくしてしまえという意見も&lt;br /&gt;あったとかなかったとか.&lt;br /&gt;&lt;br /&gt;次のような簡単な try / finally を 1.3 javac でコンパイルする。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    try {&lt;br /&gt;      System.out.println("main in try block");&lt;br /&gt;    } finally {&lt;br /&gt;      System.out.println("main in finally block");&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結果と、インラインの説明。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  Code:&lt;br /&gt;   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;&lt;br /&gt;   3:   ldc     #3; //String main in try block&lt;br /&gt;   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V&lt;br /&gt;   8:   jsr     20&lt;br /&gt;# finally block のある 20 に jump.  この際、次のバイトコードオフセット 11 が&lt;br /&gt;# stack に push される。&lt;br /&gt;   11:  goto    31&lt;br /&gt;# offset 31 に飛び、メソッドからリターンする。&lt;br /&gt;&lt;br /&gt;# 0-14 の間で例外が発生した場合、exception table にしたがってここに&lt;br /&gt;# 制御が移る。&lt;br /&gt;   14:  astore_1&lt;br /&gt;# 例外の参照を loc[1] に保持&lt;br /&gt;   15:  jsr     20&lt;br /&gt;# jsr で一旦 finally block に飛ぶ。&lt;br /&gt;# ret 2 はここに返ってくる。例外をスローして終わる。&lt;br /&gt;   18:  aload_1&lt;br /&gt;   19:  athrow&lt;br /&gt;# stack 上にある jsr が残したアドレスをローカル、ここでは local[2] にコピー。&lt;br /&gt;   20:  astore_2&lt;br /&gt;   21:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;&lt;br /&gt;   24:  ldc     #5; //String main in finally block&lt;br /&gt;   26:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V&lt;br /&gt;   29:  ret     2&lt;br /&gt;# loc[2] にあるオフセットにリターンする&lt;br /&gt;   31:  return&lt;br /&gt;  Exception table:&lt;br /&gt;   from   to  target type&lt;br /&gt;     0    14    14   any&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-8154959804238737774?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/8154959804238737774/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=8154959804238737774' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8154959804238737774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8154959804238737774'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/09/try-finally-by-jsrret-java13.html' title='try / finally by jsr/ret (~java1.3)'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-412536477504088530</id><published>2007-09-06T19:35:00.000+09:00</published><updated>2007-09-06T19:36:17.256+09:00</updated><title type='text'>bytecodes memo</title><content type='html'>dup_x1&lt;br /&gt;&lt;br /&gt;tos を複製して２つ下にインサート&lt;br /&gt;&lt;br /&gt;.., value2, value1   =&amp;gt; ..., value1, value2, value1&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;jsr &amp;lt;target off&amp;gt;&lt;br /&gt;次のバイトコードのアドレスをスタックにプッシュして指定された&lt;br /&gt;アドレスに jump する。&lt;br /&gt;&lt;br /&gt;===&lt;br /&gt;ret &amp;lt;slot#&amp;gt;&lt;br /&gt;slot# のアドレスに jump&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;PuTTY - a terminal emulator.  If it's lighter than TeraTerm, worth while trying.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-412536477504088530?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/412536477504088530/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=412536477504088530' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/412536477504088530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/412536477504088530'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/09/bytecodes-memo.html' title='bytecodes memo'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4138803847021823200</id><published>2007-09-05T20:05:00.000+09:00</published><updated>2007-09-05T20:17:04.067+09:00</updated><title type='text'>svcadm/svcs</title><content type='html'>IPアドレスの変更を反映させるだけのために Solaris をリブートしたくない。&lt;br /&gt;Solaris 10 ではこのあたりは SMF の管理下にある。&lt;br /&gt;&lt;br /&gt;# svcadm restart network/physical&lt;br /&gt;&lt;br /&gt;これでできたようだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4138803847021823200?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4138803847021823200/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4138803847021823200' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4138803847021823200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4138803847021823200'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/09/svcadmsvcs.html' title='svcadm/svcs'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-6959375598546846465</id><published>2007-09-04T14:11:00.000+09:00</published><updated>2007-09-04T14:13:05.169+09:00</updated><title type='text'>Solaris changing host/network config</title><content type='html'>あっさりと動いた。&lt;br /&gt;&lt;br /&gt;/etc/hostname.&amp;lt;itf&amp;gt; // bge0&lt;br /&gt; &amp;lt;simply put hostname for the itf&amp;gt;&lt;br /&gt;&lt;br /&gt;/etc/hosts&lt;br /&gt; &amp;lt;update entry as needed&amp;gt;&lt;br /&gt;&lt;br /&gt;/etc/nodename&lt;br /&gt; &amp;lt;node name of the system itself&amp;gt;&lt;br /&gt;&lt;br /&gt;/etc/defaultdomain&lt;br /&gt; // did not exist&lt;br /&gt;&lt;br /&gt;/etc/defaultrouter&lt;br /&gt; // put default gateway address&lt;br /&gt;&lt;br /&gt;/etc/inet/netmasks&lt;br /&gt;  &amp;lt;network addr&amp;gt; &amp;lt;mask&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-6959375598546846465?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/6959375598546846465/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=6959375598546846465' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/6959375598546846465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/6959375598546846465'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/09/solaris-changing-hostnetwork-config.html' title='Solaris changing host/network config'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-1079752842850367031</id><published>2007-09-03T21:16:00.000+09:00</published><updated>2007-09-03T21:19:09.458+09:00</updated><title type='text'>grub chain loading</title><content type='html'>見よう見まね、行き当たりばったりでつかってきたので、大事なことを知らなかった。&lt;br /&gt;&lt;br /&gt;grup から linux も solaris もあげたいとき、solaris の grub を使えば動く&lt;br /&gt;のは知っていて、それが唯一の方法かと勘違いしていた。chain loading を&lt;br /&gt;使うのがどうやら常識のようで...&lt;br /&gt;&lt;br /&gt;title Solaris&lt;br /&gt; rootnoverify (hda0,3,a)&lt;br /&gt; chainloader +1&lt;br /&gt;&lt;br /&gt;これで solaris のパーティションから solaris をロードできるブートローダ&lt;br /&gt;（Solaris の grub）が起動される。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-1079752842850367031?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/1079752842850367031/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=1079752842850367031' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1079752842850367031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1079752842850367031'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/09/grub-chain-loading.html' title='grub chain loading'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4215941700329443774</id><published>2007-09-01T06:54:00.000+09:00</published><updated>2007-09-01T06:59:39.972+09:00</updated><title type='text'>Solaris 10 again</title><content type='html'>Solaris 10 u3 をインストール。&lt;br /&gt;&lt;br /&gt;システムは PC サーバーだが、余計なインターフェイスがついているのでインストーラ&lt;br /&gt;起動前にドライバアップデートが必要。&lt;br /&gt;&lt;br /&gt;GUI モードのインストーラはドライバアップデートを使うとうまくいかないことが&lt;br /&gt;あるらしいので(実際にエラーが発生)、CUI で入れる。Lan も二つあって、&lt;br /&gt;どちらか迷ったがインスタンス番号が少ないほうで進めた。&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Xvnc は以前ユーザー起動で xdm login できるようにしていたが、そのやりかたが&lt;br /&gt;思い出せない。散々試した挙句、次の方法でいけることがわかった。&lt;br /&gt;&lt;br /&gt;vncserver :2 -query localhost&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4215941700329443774?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4215941700329443774/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4215941700329443774' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4215941700329443774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4215941700329443774'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/09/solaris-10-again.html' title='Solaris 10 again'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-220877066616176734</id><published>2007-08-07T19:38:00.000+09:00</published><updated>2007-08-07T19:39:32.163+09:00</updated><title type='text'>Facelets</title><content type='html'>http://homepage1.nifty.com/algafield/glove.html を参考にとりあえず&lt;br /&gt;動かしてみようと試みるがこれがなかなか動かない。&lt;br /&gt;&lt;br /&gt;myfaces などの jar に dtd が入っていないことに気づく。&lt;br /&gt;更新してみると、今度は jsf が古いために起動しない。&lt;br /&gt;&lt;br /&gt;[04/Apr/2007:16:19:14] warning ( 1940): JSF1033: Resource injection is DISABLED.&lt;br /&gt;&lt;br /&gt;なんだかんだで動作したが、この手のエラーは大変だ。&lt;br /&gt;dtd をいろいろとコピーしてみたが、なかなか。&lt;br /&gt;&lt;br /&gt;WebLogic, Geronimo では動作するが、Tomcat ではなぜか画面が真っ白だ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-220877066616176734?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/220877066616176734/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=220877066616176734' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/220877066616176734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/220877066616176734'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/08/facelets.html' title='Facelets'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-2555146610395287456</id><published>2007-08-06T07:17:00.000+09:00</published><updated>2007-08-06T07:59:53.359+09:00</updated><title type='text'>JSF</title><content type='html'>Struts, Spring はそこそこやったので、JSF も使えるようになっておこうと挑戦してみる。&lt;br /&gt;これといったよさげな書籍がなかったり、古かったりで少し億劫になっていた。&lt;br /&gt;Sun の開発ツールで GUI で触っていたが、少しやってみたところで飽きてしまっていた。&lt;br /&gt;Sun One Studio Creator (?) 等ではどうしても画面ががちがちのレイアウトに縛られて&lt;br /&gt;いるように見えてしまったのも興味をそいだ原因かも。&lt;br /&gt;&lt;br /&gt;基本的には faces-config.xml で ManagedBean と navigation rule 等を定義、ManagedBean &lt;br /&gt;は名前とクラスメイト、スコープを最低限定義、navigation rule は from view id に&lt;br /&gt;対して navigation-case を指定して、action の結果に応じて進める view を決める。&lt;br /&gt;form-action を明示的に指定する場合はいいのだが、指定しないといつも success が&lt;br /&gt;返るのだろうか...&lt;br /&gt;&lt;br /&gt;ManagedBean 自体は POJO のようなものでも動くし、EJB や何らかの integration を&lt;br /&gt;つかって Model を呼び出せる。&lt;br /&gt;&lt;br /&gt;View は JSP が前提となるのか、Tiles, Velocity 等が使えるのか、外部のプラグイン&lt;br /&gt;等が必要なのか要調査。&lt;br /&gt;&lt;br /&gt;デフォルトでは (NetBeans では) Faces Servlet が /faces/* にマップされている。&lt;br /&gt;実際には直下においた jsp はそのままのパスではアクセスできず、/faces/ をつけると&lt;br /&gt;アクセスできる。というか、パスの変換が行われているようだ。&lt;br /&gt;斜め読みだが WEB-INF の下には（デフォルトでは？）アクセスできないので、&lt;br /&gt;配置の仕方に注意。&lt;br /&gt;&lt;br /&gt;.jsp が URL になってしまうのは格好が悪い気がしたが、これは&lt;br /&gt;javax.faces.DEFAULT_SUFFIX パラメータで変更できる。このパラメータを&lt;br /&gt;探していると Facelet, Apache Faces 等の技術を見つける。これらも&lt;br /&gt;時間を見て勉強しよう。&lt;br /&gt;&lt;br /&gt;Seasor2 も見はじめていたが、S2JSF というコンポーネントでは View に&lt;br /&gt;JSF を使う。web.xml でだいぶカスタマイズして（これくらいは実プロジェクト&lt;br /&gt;では当然？）使っている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-2555146610395287456?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/2555146610395287456/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=2555146610395287456' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/2555146610395287456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/2555146610395287456'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/08/jsf.html' title='JSF'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-8801970206643775085</id><published>2007-07-02T17:07:00.000+09:00</published><updated>2007-07-02T17:08:29.416+09:00</updated><title type='text'>JSTL &amp; web-app (servlet?) version</title><content type='html'>web-app_2_3.dtd までしか対応していない app server でテストを行うことが発生。&lt;br /&gt;たいていの環境は web-app_2_4.xsd で動いていたし、NetBeans 5.5 の作る&lt;br /&gt;web.xml もそうなっている。&lt;br /&gt;&lt;br /&gt;次のように DTD 指定に書き換えるだけでよさそうと最初は思った。&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' &lt;br /&gt;  'http://java.sun.com/dtd/web-app_2_3.dtd'&amp;gt;&lt;br /&gt;&lt;br /&gt;動作させるうちにすぐに問題に気がついた。JSTL の c:forEach が効かないのだ。&lt;br /&gt;なんというか、式がそのまま表示されるだけだ。&lt;br /&gt;&lt;br /&gt;結果として taglib の宣言を sun.com/ のあとに jsp があるものからないものに&lt;br /&gt;直して動作するようになった。&lt;br /&gt;&lt;br /&gt;(A)&lt;br /&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&amp;gt;&lt;br /&gt;&lt;br /&gt;(B)&lt;br /&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %&amp;gt;&lt;br /&gt;&lt;br /&gt;JSTL のページを斜め読みする限り (A) は JSTL 1.1, (B) は JSTL 1.0 の&lt;br /&gt;uri でどうやら式言語の評価方法も異なるようだ。しかも、それがサーブレット&lt;br /&gt;コンテナのバージョンに依存しているということのようである。&lt;br /&gt;&lt;br /&gt;確か、以前 2.4 + 1.0 でエラーで悩まされてそのときに (A) の記述を見つけて&lt;br /&gt;そのように直して解決した記憶がおぼろげながらある。逆 2.3 + 1.1 の場合&lt;br /&gt;にはよりわかりにくい状況になるということだ。よく調べたらありそうだが、&lt;br /&gt;JCTL の動作のトレース情報は簡単に出せるのだろうか...&lt;br /&gt;&lt;br /&gt;使用している JCTL のライブラリ自体は 1.1 のままでこのような違いがでて&lt;br /&gt;いるのも不思議な感じ。taglib 指定で動作を変え、コンテナの使い方まで&lt;br /&gt;変えてくるのであれば、良くない組み合わせに警告を出してくれると&lt;br /&gt;いいのだが... OpenSource は怖い。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-8801970206643775085?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/8801970206643775085/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=8801970206643775085' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8801970206643775085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8801970206643775085'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/07/jstl-web-app-servlet-version.html' title='JSTL &amp; web-app (servlet?) version'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-5690840533831081831</id><published>2007-06-21T18:47:00.000+09:00</published><updated>2007-06-21T18:48:12.962+09:00</updated><title type='text'>Using user class from JRuby</title><content type='html'>Java SE API を JRuby から利用する方法はいろいろな所で紹介されている。&lt;br /&gt;変に load_class してしまうことで素性が Java なのか Ruby なのか&lt;br /&gt;わかりにくくなってしまうのは好きではないのでフルパッケージ名で&lt;br /&gt;使用していた。&lt;br /&gt;&lt;br /&gt;いざ自分の定義したクラスを使おうとしてみるとうまくいかない。&lt;br /&gt;試行錯誤の結果必要なのは CLASSPATH を適切に設定して load_class &lt;br /&gt;でクラスをロードすることが必要らしい。たとえロードしてもフルパッケージ名&lt;br /&gt;では参照できない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-5690840533831081831?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/5690840533831081831/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=5690840533831081831' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/5690840533831081831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/5690840533831081831'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/06/using-user-class-from-jruby.html' title='Using user class from JRuby'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-1600248664524980369</id><published>2007-06-11T21:09:00.001+09:00</published><updated>2007-06-11T21:09:26.731+09:00</updated><title type='text'>SimpleFormController</title><content type='html'>Form を使ったページを作成しようとして昔のソースを見て困った。&lt;br /&gt;ど忘れしている、というかよく覚えていない。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;protected ModelAndView onSubmit(HttpServletRequest request,&lt;br /&gt;        HttpServletResponse response, Object command, BindException errors)&lt;br /&gt;        throws HttpSessionRequiredException {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;command って何だっけ？&lt;br /&gt;答えは config ファイルで設定していた。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;bean id="htmlEscapeFormController" class="yt.uxtool.presentation.HtmlEscapeController"&amp;gt;&lt;br /&gt;    &amp;lt;property name="commandClass"&amp;gt;&amp;lt;value&amp;gt;yt.uxtool.domain.HtmlEscapeEntry&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;property name="formView"&amp;gt;&amp;lt;value&amp;gt;htmlEscapeView&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;property name="successView"&amp;gt;&amp;lt;value&amp;gt;htmlEscapeView&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;次のメソッドもオーバーライドしているがなぜやっているのか思い出せない。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;protected Object formBackingObject(HttpServletRequest request)&lt;br /&gt;  throws Exception {&lt;br /&gt;  log.debug("invoke: session[" + request.getSession(false) + "]");&lt;br /&gt;  &lt;br /&gt;  request.setAttribute("htmlEscape", "true");&lt;br /&gt;  &lt;br /&gt;  return super.formBackingObject(request);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;答えは AbstractFormController の API ref にあった。onSubmit() は bind,&lt;br /&gt;validate にエラーがなかった場合にのみ呼ばれる。そのため、エラーにかかわらず&lt;br /&gt;リクエストプロパティをビューに渡したいときなどに formBackingObject()&lt;br /&gt;でセットしてやるとよい。忘れずに super.formBackingObject() を呼ぶこと。&lt;br /&gt;&lt;br /&gt;納得して POJO を作ってみる。int フィールドがいるのだが、validation &lt;br /&gt;は自前でする必要があるのだろうか...&lt;br /&gt;&lt;br /&gt;validator は Validator を implement して inject してやればよい。&lt;br /&gt;validator, controller は Errors の参照が渡される場所ではこれに &lt;br /&gt;reject* する事でエラーを登録する。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-1600248664524980369?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/1600248664524980369/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=1600248664524980369' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1600248664524980369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1600248664524980369'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/06/simpleformcontroller.html' title='SimpleFormController'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-3713112758185020613</id><published>2007-06-08T19:16:00.000+09:00</published><updated>2007-06-08T19:21:02.774+09:00</updated><title type='text'>jruby 1.0 released !!</title><content type='html'>早速セットアップして作りこんでみる。今までたいした機能を使っていなかったせいか、、&lt;br /&gt;いろんなエラーで戸惑ってしまう。Ruby はもう少しエラーがわかりやすければ&lt;br /&gt;いいんだけど... 行番号が本当の問題からずれていたり(自分でインタープリタを&lt;br /&gt;作ることを考えるとこの部分が簡単でないのはわかるが)、何か、パーサから&lt;br /&gt;そのまま出されたようなエラーは本当にわかりづらい。&lt;br /&gt;&lt;br /&gt;Rails でちょっとこったことをやりだすとはじめてみるエラーがブラウザに出るようになった。&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;We're sorry, but something went wrong.&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;We've been notified about this issue and we'll take a look at it shortly.&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;log/development.log にはすこし具体的なエラーが出ているのでこういう時は&lt;br /&gt;こちらからあたりをつけていくしかない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-3713112758185020613?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/3713112758185020613/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=3713112758185020613' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/3713112758185020613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/3713112758185020613'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/06/jruby-10-released.html' title='jruby 1.0 released !!'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-3478428039077973817</id><published>2007-06-04T11:31:00.000+09:00</published><updated>2007-06-04T11:32:36.743+09:00</updated><title type='text'>Threads on Rails</title><content type='html'>Rails application 上でアプリケーションから独立した処理を設けたくなった。&lt;br /&gt;時間がきたら何かを始めるような、例えばリモートのファイルの更新を調べて&lt;br /&gt;更新があればその変更をローカルに反映させる、といったことがやりたい。&lt;br /&gt;&lt;br /&gt;後に http://www.igvita.com/blog/2007/03/29/scheduling-tasks-in-ruby-rails/&lt;br /&gt;で OpenWFEru, BackgrounDRB などのライブラリがあるのを見つけるが、今回は&lt;br /&gt;まず Ruby の Thread でどの程度できるかを確かめたかった。Java でも&lt;br /&gt;このような用途への Scheduler は Quartz　などいろいろあったが、たいていの&lt;br /&gt;ことは Thread を拡張して済ますこともできたからである。&lt;br /&gt;&lt;br /&gt;Ruby Thread の情報を探していて気になったのは、どうやらこれは Ruby ないの&lt;br /&gt;ユーザースレッドとして実装されているということだ。言い方をかえると OS から&lt;br /&gt;は単一スレッドのプロセスに見えるが、Ruby 内部で自前で処理を切り替えていると&lt;br /&gt;いうことだ。OS のネイティブスレッドにマップされているわけではない。Java&lt;br /&gt;1.1 の頃の懐かしの green thread と同じ原理だ。スレッドのセマンティックは&lt;br /&gt;使えるが、それぞれが本当に平行して走れるわけではないため、計算主体の&lt;br /&gt;処理をスレッド化しても処理時間が短くなるわけではなく、むしろスケジューリング&lt;br /&gt;のオーバーヘッドも加わって少し遅くなってしまうだろう。マルチコア全盛？&lt;br /&gt;の昨今、早期のネイティブスレッド対応が望まれる。Java thread はたいてい&lt;br /&gt;ネイティブスレッド対応なので jruby では案外簡単に実現できるのかも&lt;br /&gt;知れない。Java の Thread クラスをラップすればいいだけだから。&lt;br /&gt;&lt;br /&gt;Rails は相変わらず development mode でしか使用していないが、ファイルを&lt;br /&gt;書き換えて、再アクセスするだけですむのはやはり便利で、スレッドを持たせ&lt;br /&gt;てもこれでいけるか実験してみた。&lt;br /&gt;&lt;br /&gt;Thread.new の戻り値を controller のスタティック変数に代入してみる。&lt;br /&gt;スレッドのボディは単にスリープとカウンタの表示をするだけだ。コントローラ&lt;br /&gt;を書き換え再アクセスすると新しいスレッドが作られるが、古いスレッドも&lt;br /&gt;依然として動き続ける。定義は書き換えたのにだ！　短絡適にデストラクタや&lt;br /&gt;スタティックデストラクタを思いついたが、いずれも Ruby のリファレンスには&lt;br /&gt;見当たらない。クラスのアンロードのイベントやそれに伴ったハンドラの&lt;br /&gt;呼び出しもざっとみたところでは見当たらない。スタティック変数は最ロード&lt;br /&gt;された際に初期化されているので、あとから古いスレッドを触ることもできないようだ。&lt;br /&gt;&lt;br /&gt;試行錯誤と妥協の後に、Thread.new の結果を外部クラスのスタティックフィールドに&lt;br /&gt;保持し、新規スレッド生成時にという録されていたスレッドに Thread.exit する&lt;br /&gt;事を思いつき、動作することを確認した。&lt;br /&gt;&lt;br /&gt;小技の覚書&lt;br /&gt;&lt;br /&gt;* 外部クラスの利用&lt;br /&gt;&lt;br /&gt;Thread を覚えておいてあとでとめられるクラスを models の下に作ったが、&lt;br /&gt;クラスが認識されずエラーになった。どこかでコントローラとモデルの関連&lt;br /&gt;づけの記述があったような、なかったような... とりあえずは&lt;br /&gt;require 'models/mythreadmanager' のようにして利用できるようになった。&lt;br /&gt;あと、この require しているソース内にエラーがあった場合、rails の&lt;br /&gt;エラー画面にはその詳細が出てこないようだ。このあたりは設定で表示&lt;br /&gt;されるようにできるのかも知れないが、単体でデバッグして回避。&lt;br /&gt;&lt;br /&gt;* Thread のイディオム&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  begin     &lt;br /&gt;    @@threada = Thread.new do&lt;br /&gt;      # print "D: thread a2 starting...\n"&lt;br /&gt;      icnt = 0&lt;br /&gt;      while true&lt;br /&gt;        #print "thread a: " + Thread.current.to_s + " icnt " + icnt, "\n"&lt;br /&gt;        # printf "D: thread a2: %s icnt %d\n", Thread.current.to_s, icnt&lt;br /&gt;        sleep 10&lt;br /&gt;        icnt += 1&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    MyThreadManager.register @@threada&lt;br /&gt;  rescue&lt;br /&gt;    print "@@threada rescue\n"&lt;br /&gt;    p $!&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;基本的に begin/rescue の中で行う。そうしないと黙ってぬけられても&lt;br /&gt;気付かない。&lt;br /&gt;&lt;br /&gt;rescue は catch のように例外ごとに複数設けることもできるが、例外クラスを&lt;br /&gt;定義しなければならない。$! は短いメッセージしか出さないように見えたので&lt;br /&gt;例外そのものは取れないかと調べてみると rescue =&amp;gt; evar とすることで&lt;br /&gt;拾えることに気付くが、後に $! 自体が例外オブジェクトであり、$! を使って&lt;br /&gt;スタックとレースも出せることに気付く。&lt;br /&gt;&lt;br /&gt;* logger の使用&lt;br /&gt;&lt;br /&gt;require 'logger' して次の２行程度で commons-logging みたいな機能が利用&lt;br /&gt;できるようになる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  @@log = Logger.new STDOUT&lt;br /&gt;  @@log.level = Logger::WARN&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;* private 指定&lt;br /&gt;&lt;br /&gt;どこかで private 指定は C++ のように private: 以下に書いたものと&lt;br /&gt;漠然と覚えていたが、普通に定義して&lt;br /&gt;&lt;br /&gt;private :checkLocalDir　&lt;br /&gt;&lt;br /&gt;と private に続けてメソッド名のシンボルを書くことで private に&lt;br /&gt;なるようだ。&lt;br /&gt;&lt;br /&gt;* nil 地獄&lt;br /&gt;&lt;br /&gt;クラスのフィールドが増えてくると to_s のオーバーライドの中や&lt;br /&gt;ちょっとした if 文などで nil を参照したと言うことでエラーに&lt;br /&gt;なる。少しうるさすぎる気がしないでもない。&lt;br /&gt;&lt;br /&gt;* %r&lt;br /&gt;&lt;br /&gt;正規表現に / が多く現れる場合、vi や perl などでは / を ! で&lt;br /&gt;代用できる。これは ruby ではそのままでは動かないが &lt;br /&gt;%r!/{1,}$! とする事で実現できる。&lt;br /&gt;&lt;br /&gt;* unit test&lt;br /&gt;&lt;br /&gt;require 'test/unit' して Test::Unit::TestCase のサブクラスを&lt;br /&gt;作れば、テストクラスができる。テスト用のメソッドは test_ で&lt;br /&gt;はじめる。setup の用途も JUnit と同じ。&lt;br /&gt;&lt;br /&gt;* Queue&lt;br /&gt;&lt;br /&gt;Queue クラスはスレッド間の連携に便利。何でも渡せそう。&lt;br /&gt;&lt;br /&gt;* 外部コマンドの起動&lt;br /&gt;&lt;br /&gt;外部コマンドを使わざる終えない状況で、以下にうまくそれをコントロール&lt;br /&gt;できるかというのが問題になってくる。ポイントとしては子プロセスとの&lt;br /&gt;標準入出力、エラーを用いた通信と終了ステータスの確認だ。&lt;br /&gt;&lt;br /&gt;open("|sort", "r+") のようにすると返された IO に対して書き込み、読み込み&lt;br /&gt;できる。本当に簡単な処理であればこれでいいが、エラー出力は得られないし、&lt;br /&gt;コマンドのステータスも得られない。これにかんして Open3 モジュールを&lt;br /&gt;使うと stdin, out, err ともに得られることがわかるが、Open3.popen3 は&lt;br /&gt;内部で fork を使用している。これを使ってみてわかったが windows 版では&lt;br /&gt;fork がサポートされていないため動かない。open("|comm...") はどうして&lt;br /&gt;動くのかということになるが、調べる気が起きなかった。&lt;br /&gt;&lt;br /&gt;結局、次のようにコマンドへの入出力はリダイレクトを使って戻り値は&lt;br /&gt;system の戻り値をつかう方法が無難そうだし、windows でも動作した。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;r = system('mysql -u test --password=test test &amp;lt;a.sql &amp;gt;out 2&amp;gt;err')&lt;br /&gt;&lt;br /&gt;p r    # true for success, false for error&lt;br /&gt;p $?   # additional info on failure&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-3478428039077973817?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/3478428039077973817/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=3478428039077973817' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/3478428039077973817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/3478428039077973817'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/06/threads-on-rails.html' title='Threads on Rails'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-4095372893279025492</id><published>2007-05-30T22:26:00.000+09:00</published><updated>2007-05-30T22:32:18.297+09:00</updated><title type='text'>jhat, net/ftp, net/telnet</title><content type='html'>64-bit JVM の binary heap dump を見る必要が生じたので昔セットアップした&lt;br /&gt;hat で見てみる。そうすると 64-bit はサポートしていない (4 byte の id&lt;br /&gt;しかサポートしていない) といわれる。&lt;br /&gt;&lt;br /&gt;適当に探すと jdk6 の jhat は 64-bit JVM のデータも見れるとの事。&lt;br /&gt;確かに動いた。以前は興味もわかなかったが OQL という SQL みたいな&lt;br /&gt;言語で heap dump にいろいろ検索をかけられる。複雑なクエリでは&lt;br /&gt;クラスローダのリストを出したり System のプロパティをダンプしたりと&lt;br /&gt;いうこともできるらしい。勉強してみよう。&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;ruby の ftp などは mechanize などを使わないといけないと早合点して&lt;br /&gt;いたが、標準の Net パッケージに入っていることに気づいた。&lt;br /&gt;jruby 上では ftp のリストや telnet の login 等がエラーになって&lt;br /&gt;しまった。windows の ruby でやると エラーにならないことから、&lt;br /&gt;jruby っぽい。bug をあげればいいのだろうか？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-4095372893279025492?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/4095372893279025492/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=4095372893279025492' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4095372893279025492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/4095372893279025492'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/jhat-netftp-nettelnet.html' title='jhat, net/ftp, net/telnet'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-9038704509710415521</id><published>2007-05-28T18:19:00.000+09:00</published><updated>2007-05-29T10:53:43.019+09:00</updated><title type='text'>some experiments</title><content type='html'>企画中の Web Application の中に簡単にサーバー上のパスをたどれる&lt;br /&gt;機能を持たせたい。まだ Struts を学び始めのころいろいろ試行錯誤&lt;br /&gt;して断念したのを覚えていて、それからこれは億劫だ。&lt;br /&gt;&lt;br /&gt;でも、Rails ならば手間が少ないだろうとはじめてみる。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;パス用の TextField の右に link を用意して、そのリンクが押されたら&lt;br /&gt;ディレクトリが選べるようにする。一旦ルートを離れると同様のアクションを&lt;br /&gt;引数つきで呼び出すファイルのリストも表示する。一旦構成要素が選ばれ&lt;br /&gt;たら TextField の内容も更新する。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;これは結構簡単にできて、よさそうだったが、テキストフィールドの&lt;br /&gt;初期値を処理に反映できない。わかっている部分までパスを入れて、&lt;br /&gt;その後の部分をアクションに補助してもらうということができない。&lt;br /&gt;なぜなら、link はフォームのフィールドを送れないからだ。たとえ&lt;br /&gt;text_field でドメインオブジェクトを TextField に結び付けて&lt;br /&gt;いてもだ。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;submit_tag でボタンを作ってそのアクションでディレクトリを選択して&lt;br /&gt;いく。この方法ではアクションをボタンの id で判別するしかないし、&lt;br /&gt;引数は渡せない。１と併用しなければならないし、そうするとコードが&lt;br /&gt;増えるだけだ。ボタン固有の引数が渡せると便利なのだが...&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;もうひとつ、このような機能を持たせたいフィールド部分だけ、専用の&lt;br /&gt;フォームとして使用できないかと考えてみた。これにかんしては &lt;br /&gt;form tag のネストは標準的でないということで断念。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;最後の方法は JavaScript の利用だ。できればこれは避けたかった。&lt;br /&gt;汎用的なものを作るのが難しいのと、デバッグがやりにくいというのが&lt;br /&gt;大きな理由だ。ただし、DOM と非同期通信を使えばいろいろなことが&lt;br /&gt;できるはずだ。&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Spring 2.0 本でみた DWR のサンプルを思い出した。ぱっと見は現在の&lt;br /&gt;ウインドウの中にモーダルウィンドウが現れて、そこに操作をして&lt;br /&gt;submit という流れに見える。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;サンプルを見ていくと script.aculo.us の effect の Effect.Appear&lt;br /&gt;を使って小さなウィンドウを表示しているように見える。その機能だけを&lt;br /&gt;試してみると画面上の div 要素を効果をつけて表示している。どう見ても&lt;br /&gt;モーダルウィンドウを表示するとはことなる動きだ。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;ちょっと考えて、確認して納得したが、サンプルでは CSS を使って&lt;br /&gt;位置、サイズを固定した div 要素に対して Effect.Appear を使っている。&lt;br /&gt;サンプルとしてはいいのだが、これでは困ったことがおきるのではないか？&lt;br /&gt;画面上に他の画面に移行するフォームやリンクがあったらどうする？&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;script.aculo.us を検索していると lightbox というライブラリを見つけた。&lt;br /&gt;&lt;br /&gt;http://www.huddletogether.com/projects/lightbox2/&lt;br /&gt;&lt;br /&gt;サンプルで写真を選ぶと (CSS で作ったと思われる) ウィンドウが現れ&lt;br /&gt;拡大された写真が表示される。背景にはシェーディングがかかって&lt;br /&gt;暗くなっている。見た目はなかなかいいぞ。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;元はといえば WLS の deploy 画面が便利だなという漠然とした感想が&lt;br /&gt;あったのだが、よく考えるとこちらはフォームを使っていない。&lt;br /&gt;何らかの基点を記憶させて置くことはできるのかも知れないが、&lt;br /&gt;これくらいなら作れそう。&lt;br /&gt;&lt;br /&gt;http://localhost:7001/console/console.portal?&lt;br /&gt;  _nfpb=true&amp;&lt;br /&gt;  _pageLabel=AppApplicationInstallPage&amp;&lt;br /&gt;  AppApplicationInstallPortletISUNIX=YES&amp;&lt;br /&gt;  AppApplicationInstallPortletFILECHOOSERPATH=%2Fhome%2Froot&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;関連情報を探しているうちに ajax4jsf というのを見つけた。&lt;br /&gt;サンプルの war が見当たらない...&lt;br /&gt;&lt;br /&gt;https://ajax4jsf.dev.java.net/&lt;br /&gt;http://jboss.org/projects/jbossAjax4jsf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-9038704509710415521?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/9038704509710415521/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=9038704509710415521' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/9038704509710415521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/9038704509710415521'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/web-application-struts-rails-textfield.html' title='some experiments'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-322999688841631490</id><published>2007-05-20T11:26:00.000+09:00</published><updated>2007-05-20T11:28:09.456+09:00</updated><title type='text'>Ruby on Rails notes</title><content type='html'>Rails に関するページや本をざっとみてこれはデータベース依存の大きな&lt;br /&gt;フレームワークで、色々な制約があって単純に Web Application を移植&lt;br /&gt;する対象として見れないのではないかという印象を受けていたが、よく&lt;br /&gt;見て行くと、そうでもないらしい。&lt;br /&gt;&lt;br /&gt;単純なケースとして rails で作成したプロジェクトにひとつコントローラを&lt;br /&gt;設けるだけでページとして機能する。&lt;br /&gt;&lt;br /&gt;&amp;gt; rails simple&lt;br /&gt;&amp;gt; cd simple&lt;br /&gt;&amp;gt; ruby script\generate controller info&lt;br /&gt;&amp;gt; notepad app\views\index.rhtml&lt;br /&gt;&lt;br /&gt;これだけでよい。以前、色々試したときの経験から自動生成されている&lt;br /&gt;config\database.yml の設定が邪魔をするかとも心配したが、モデルが&lt;br /&gt;何もなければデータベース接続は発生しない。&lt;br /&gt;&lt;br /&gt;次のステップとしてリンクやフォームの処理が気になってくる。&lt;br /&gt;&lt;br /&gt;コントローラの中には次の様な記述がよく現れる。&lt;br /&gt; render :action =&amp;gt; 'new'&lt;br /&gt;&lt;br /&gt;ruby では推測可能な部分の括弧は書かなくてもよいという特徴がある。&lt;br /&gt;なんとなくハッシュを渡しているのはわかるが、なぜキーがシンボル&lt;br /&gt;(:name :に続けて識別子のようなもの)なのか今ひとつ不明。&lt;br /&gt;http://www.rubyonrails.org/ から API のページを見てみる。&lt;br /&gt;http://api.rubyonrails.org/　色々と説明はあるのだが今ひとつ&lt;br /&gt;仕組みがぴんとこない。&lt;br /&gt;&lt;br /&gt;http://www.rubyonrails.org/ に Source のリンクがある。&lt;br /&gt;そこに SVN の URL がある。ブラウザで開いてみるとソースをブラウズ&lt;br /&gt;出来た。&lt;br /&gt;http://svn.rubyonrails.org/rails/branches/1-2-stable&lt;br /&gt;&lt;br /&gt;API の各ページのはじめに定義があるファイル名が表示されている。&lt;br /&gt;そのパスを参考に実際のソースを見ることが出来る。&lt;br /&gt;&lt;br /&gt;render の場合は次のパス。&lt;br /&gt;http://svn.rubyonrails.org/rails/branches/1-2-stable/actionpack/lib/action_view/base.rb&lt;br /&gt;&lt;br /&gt;link_to の場合は次のパスになる。&lt;br /&gt;http://svn.rubyonrails.org/rails/branches/1-2-stable/actionpack/lib/action_view/helpers/url_helper.rb&lt;br /&gt;&lt;br /&gt;これらのソースに symbolize_keys というメソッドがハッシュに対して&lt;br /&gt;よばれているところがある。ハッシュに関するメソッドかと思い、小さな&lt;br /&gt;スクリプトで動作を確認しようとすると、そんなメソッドはないといわれて&lt;br /&gt;しまう。&lt;br /&gt;&lt;br /&gt;Rails の API を見ると vendor/rails/activesupport/lib/active_support/core_ext/hash/keys.rb&lt;br /&gt;の中で定義されている。パスの名前から (core_ext) rails の activesupport&lt;br /&gt;でハッシュの機能を拡張していることのように見える。&lt;br /&gt;&lt;br /&gt;activesupport を require して試してみようとも思ったが rails の&lt;br /&gt;コントローラで試しても同じことだろうと思ってコントローラの中で&lt;br /&gt;ハッシュに対して symbolize_keys をハッシュに対して呼んでみる。&lt;br /&gt;&lt;br /&gt;その結果 "abc" =&amp;gt; "ABC" が :abc =&amp;gt; "ABC" のように変わって&lt;br /&gt;入ることがわかった。これからいくと render/link_to の引数で&lt;br /&gt;&lt;br /&gt; render :action =&amp;gt; 'new'&lt;br /&gt;&lt;br /&gt;と書くのは&lt;br /&gt;&lt;br /&gt; render 'action' =&amp;gt; 'new'&lt;br /&gt;&lt;br /&gt;と同じということだろう。ではなぜか？&lt;br /&gt;&lt;br /&gt;おそらく、文字列のためのメモリをセーブするためではないか。&lt;br /&gt;Java でいうところの String.intern() にあたるのではないかと&lt;br /&gt;おもう。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;では上記の render 文が何をするかということだが、action で&lt;br /&gt;指定された view をクライアントに返すということのようだ。&lt;br /&gt;極端な場合、コントローラーアクションは色々定義しても&lt;br /&gt;ひとつの view (rhtml file) で表示させることも出来る。&lt;br /&gt;&lt;br /&gt;コントローラを作ると ApplicationController のサブクラスが&lt;br /&gt;作られるがこの中にアクションに対応したメソッドを定義して&lt;br /&gt;おくことで呼び出すことが出来る。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  def list&lt;br /&gt;    @item_pages, @items = paginate :items, :per_page =&gt; 10&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;この後、アクションと同じ名前 + .rhtml で表示が行われる。&lt;br /&gt;&lt;br /&gt;index.rhtml に関しては index というアクションがなくても&lt;br /&gt;良いようだ。また、'index' というアクションで index ページ&lt;br /&gt;を表示させることもできる。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;.rhtml (embedded ruby) の側ではリンクに次の様なものが現れる。&lt;br /&gt;&lt;br /&gt; &amp;lt;%= link_to 'Show', :action =&amp;gt; 'show', :id =&amp;gt; item %&amp;gt;&lt;br /&gt; &amp;lt;%= link_to 'Previous page', { :page =&amp;gt; @item_pages.current.previous } if @item_pages.current.previous %&amp;gt;&lt;br /&gt;&lt;br /&gt;link_to も Rails のメソッドで API doc を見て行くと仕様がわかる。&lt;br /&gt;&lt;br /&gt;link_to(name, options = {}, html_options = nil, *parameters_for_method_reference)&lt;br /&gt;&lt;br /&gt;最初のケースでは :id =&amp;gt; item という引数を渡しているがここには任意の&lt;br /&gt;物が指定できるようだ。ただし、受けたコントローラでは symbolize_keys &lt;br /&gt;の逆操作が行われているようで、key を :myparam としてもコントローラで&lt;br /&gt;params をダンプしてみるとキーは "myparam" となっている。ただし、&lt;br /&gt;依然として params[:myparam] での参照は可能。&lt;br /&gt;&lt;br /&gt;また、item は item.id と同意ということのようだが、これがどこからきている&lt;br /&gt;かは今のところはっきりしない。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;http://railsapi.masuidrive.jp&lt;br /&gt;AJAX を使用した部分的に日本語化された rails のマニュアル。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  def list&lt;br /&gt;    @item_pages, @items = paginate :items, :per_page =&amp;gt; 10&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これはレコード数が多くなる可能性のあるページに使うイディオムの&lt;br /&gt;様だが左辺が二つある。よく考えると多重代入だし pagenate の API &lt;br /&gt;にも pagenator と collection を返すと書いてある。&lt;br /&gt;&lt;br /&gt;複数の値を返すという概念は C++/Java にはないので少し困惑したが、&lt;br /&gt;多重代入の本質はリストを返すことと、それをどのように代入、グルーピング&lt;br /&gt;するかということで、メソッドの最後でリストを評価すればいいと言う&lt;br /&gt;事。便利だが、仕様をしっかり書いておく必要がある。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;フォーム&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;% form_tag :action =&amp;gt; 'escape' do %&amp;gt;&lt;br /&gt;  &amp;lt;%= text_area 'etext', 'rawtext', :rows =&amp;gt; 8  %&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;  &amp;lt;%= submit_tag "Escape" %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Form は form_tag を使って作ることが出来る。:action にポストを&lt;br /&gt;受けるアクションの名前を指定する。&lt;br /&gt;text_area の引数に迷ってしまったが、適当でもポストはできた。&lt;br /&gt;ただ、同じ view でうけると表示上のデータは消えてしまう。&lt;br /&gt;要は部品にバインドできていない状態だ。&lt;br /&gt;&lt;br /&gt;これは最初の引数をコントローラのフィールドのドメインオブジェクトの&lt;br /&gt;名前に、二番目をそのフィールドにすることで解決できたようだ。&lt;br /&gt;上記の例では&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  def escape&lt;br /&gt;    @etext = Etext.new&lt;br /&gt;    @etext.rawtext = params[:etext][:rawtext]&lt;br /&gt;    @etext.escape&lt;br /&gt;    render :action =&amp;gt; "index"&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Etext は app/models/etext.rb で次のように定義している&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Etext&lt;br /&gt;  attr_accessor :rawtext&lt;br /&gt;  attr_accessor :escaped_text&lt;br /&gt;  def escape&lt;br /&gt;    @escaped_text = @rawtext.gsub(/&amp;amp;/, '&amp;amp;amp;').&lt;br /&gt;      gsub(/&amp;lt;/, '&amp;amp;lt;').gsub(/&amp;gt;/, '&amp;amp;gt;');   &lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;生成される HTML は次のようになる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;form action="/info/escape" method="post"&amp;gt;&lt;br /&gt;  &amp;lt;textarea cols="40" id="etext_rawtext" &lt;br /&gt;name="etext[rawtext]" &lt;br /&gt;rows="8"&amp;gt;...&amp;lt;/textarea&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;  &amp;lt;input name="commit" type="submit" &lt;br /&gt;value="Escape" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ポストされたデータは params という名前のハッシュで参照できて&lt;br /&gt;次のようになっている。&lt;br /&gt;&lt;br /&gt;{"commit"=&amp;gt;"Escape", "action"=&amp;gt;"escape", &lt;br /&gt;"controller"=&amp;gt;"info", "etext"=&amp;gt;{"rawtext"=&amp;gt;"..."}}&lt;br /&gt;----------&lt;br /&gt;||= &lt;br /&gt;&lt;br /&gt;これは変数が nil の場合のみ右辺値を左辺値に代入するというオペレータ&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;variable.nil?&lt;br /&gt;&lt;br /&gt;これは変数が nil かどうかをテストするメソッド。未定義、未設定のものに&lt;br /&gt;テストできるのは面白い。C++/Java でやれば例外、エラーになるところだ。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;@rawtext.gsub(/&amp;/, '&amp;amp;')&lt;br /&gt;&lt;br /&gt;gsub() は指定された置き換えの結果を返すが gsub!(...) では元の&lt;br /&gt;文字列が書き換えられる。! は破壊的動作のしるし。C++ でいうところの&lt;br /&gt;非 const 関数といったところか。? は問い合わせ&lt;br /&gt;をするようなメソッド名の最後につけておくという慣例らしい。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;クラス名は大文字で始める必要がある。&lt;br /&gt;&lt;br /&gt;フィールドの定義は attr_accessor でできる。引数はフィールド名の&lt;br /&gt;前に : を付けた物(シンボル)&lt;br /&gt;&lt;br /&gt;  attr_accessor :rawtext&lt;br /&gt;  attr_accessor :escaped_text&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;Model の定義に関係を belongs_to などで指定できる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class ListItem &amp;lt;ActiveRecord::Base&lt;br /&gt;  belongs_to :user&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;一見、設定ファイルに関係性を明示しているようにも見えるが(案外、それが&lt;br /&gt;目的の設計かも知れないが) これは Ruby のクラス定義である。では&lt;br /&gt;belongs_to は一体何なのか。これも API をたどって行ってわかったが、&lt;br /&gt;これは ActiveRecord::Base のクラスメソッドである。クラスメソッドが&lt;br /&gt;このようなところに書いてあると何が起こるかというとクラスがロード&lt;br /&gt;されるときにこのクラスメソッドが実行される。なるほどね～。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;Windows 上のファイル編集には Terapad と cygwin 内の vim を使っていた。&lt;br /&gt;たまたまフリーの EmEditor をいうのを見つけたので使ってみると Terapad&lt;br /&gt;の Tab 版といった感じでなかなかよさそう。デスクトップがごちゃごちゃに&lt;br /&gt;ならないところがいい。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;view の中では controller のインスタンス変数を文法上そのままアクセス&lt;br /&gt;できるが、これはリフレクションのような手法を使って巧みに作り込まれた&lt;br /&gt;物らしい。controller オブジェクトだが、シングルトンではないらしい。&lt;br /&gt;あるアクションで設定したインスタンスフィールドを別なアクションで&lt;br /&gt;表示してみると nil になっていた。&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;最初は暗号のように見えたコントローラや rhtml の記述もその意味がわかって&lt;br /&gt;くるとなかなか味がある。Ruby は以前、挑戦したのだが、その時点では&lt;br /&gt;将来性が良くわからず直ぐに忘れてしまった。数年を経て C++ やら Java を&lt;br /&gt;（自分としては）深く使い込んだ今見直してみると中々興味深い言語だ。&lt;br /&gt;Rails はその機能をうまく拡張、利用しているようだ。&lt;br /&gt;&lt;br /&gt;native library 依存がない物であればほぼ jruby で動くというところも&lt;br /&gt;すばらしい。ruby - bytecode 変換が早く実現されないかとたのしみでもある。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-322999688841631490?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/322999688841631490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=322999688841631490' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/322999688841631490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/322999688841631490'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/ruby-on-rails-notes.html' title='Ruby on Rails notes'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-6741984113337032498</id><published>2007-05-16T20:36:00.000+09:00</published><updated>2007-05-16T21:05:22.510+09:00</updated><title type='text'>Ruby on Rails First Impression</title><content type='html'>JavaOne の Ruby on Rails のデモ -- サンプルを war にして app server に&lt;br /&gt;配置してみたり、動的更新をしてみたり -- がどうも気にかかっていたので、&lt;br /&gt;以前やりかけてやめていた Ruby on Rails から挑戦。&lt;br /&gt;&lt;br /&gt;手近に Linux がないので Windows で試す。日本語の短いデモにしたがって &lt;br /&gt;ActiveScriptRuby で出てくるサイトからダウンロード、インストール。&lt;br /&gt;gem は最初から使えるようで、remote で rails をインストール。&lt;br /&gt;&lt;br /&gt;MySQL Manager もあるらしいことは知っていたがずっとコマンドラインだった。&lt;br /&gt;でも使いやすそうなのでインストール。&lt;br /&gt;&lt;br /&gt;あとはデモどおりに作っていくとその通りに動く。上記の短い日本語のデモは&lt;br /&gt;単純すぎていまひとつだったが、環境構築に役立った。本家のデモを見ていく&lt;br /&gt;事で view のいじり方の雰囲気がわかった。&lt;br /&gt;&lt;br /&gt;同じ事をプロキシの中でやろうとしてみた。gem には --http-proxy オプションが&lt;br /&gt;あるのだがこれがなかなか動かない。gem は gem ファイルからもインストール&lt;br /&gt;できるので rails の gem ファイルをダウンロードしてきてインストールしようと&lt;br /&gt;するが、結構依存するモジュールがあり、エラーを食らってはダウンロード、&lt;br /&gt;インストールを繰り返し、何とか動くところまで持っていけた。&lt;br /&gt;&lt;br /&gt;次に Unix 上での動作確認をしたいのだが、対象 OS が OSS に弱くてディスクも&lt;br /&gt;あまりないので、あきらめようとしていたが、JRuby、そして JRuby on Rails も&lt;br /&gt;結構動くらしいことを知る。&lt;br /&gt;&lt;br /&gt;適当な JRuby をダウンロード、セットアップすれば、JDK があれば動いてくれる。&lt;br /&gt;そのあとは gem 操作はほぼ同じ。ただし、多くのコマンドは &lt;br /&gt;&lt;br /&gt;jruby $JRUBY_HOME/bin/gem ... のように jruby でコマンドラインをはじめる&lt;br /&gt;必要があるようだ。ファイルを一つ一つインストールしたときの gem ファイルが&lt;br /&gt;役に立った。&lt;br /&gt;&lt;br /&gt;いろいろなところで書かれてはいたが、Rails はデータドリブンなので&lt;br /&gt;どうしてもデータベースを用意しなければいけないらしい。Controller と&lt;br /&gt;View だけでいろいろ試して見ることができたら便利そうだろうと model &lt;br /&gt;の作成を飛ばしてやってみたが、generate scaffold の中でアクセスに&lt;br /&gt;いってしまう。&lt;br /&gt;&lt;br /&gt;そういうものだと割り切ってリモートの MySQL のデータベースを指定。&lt;br /&gt;scaffold もできた。&lt;br /&gt;&lt;br /&gt;$ jruby script/generate controller abc&lt;br /&gt;      exists  app/controllers/&lt;br /&gt;      exists  app/helpers/&lt;br /&gt;      create  app/views/abc&lt;br /&gt;      exists  test/functional/&lt;br /&gt;      create  app/controllers/abc_controller.rb&lt;br /&gt;      create  test/functional/abc_controller_test.rb&lt;br /&gt;      create  app/helpers/abc_helper.rb&lt;br /&gt;&lt;br /&gt;$ jruby script/generate scaffold abc&lt;br /&gt;      exists  app/controllers/&lt;br /&gt;      exists  app/helpers/&lt;br /&gt;      create  app/views/abcs&lt;br /&gt;      exists  app/views/layouts/&lt;br /&gt;      exists  test/functional/&lt;br /&gt;  dependency  model&lt;br /&gt;      exists    app/models/&lt;br /&gt;      exists    test/unit/&lt;br /&gt;      exists    test/fixtures/&lt;br /&gt;      create    app/models/abc.rb&lt;br /&gt;      create    test/unit/abc_test.rb&lt;br /&gt;      create    test/fixtures/abcs.yml&lt;br /&gt;#28000Access denied for user 'root'@'localhost' (using password: NO)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ jruby script/generate scaffold abc&lt;br /&gt;      exists  app/controllers/&lt;br /&gt;      exists  app/helpers/&lt;br /&gt;      exists  app/views/abcs&lt;br /&gt;      exists  app/views/layouts/&lt;br /&gt;      exists  test/functional/&lt;br /&gt;  dependency  model&lt;br /&gt;      exists    app/models/&lt;br /&gt;      exists    test/unit/&lt;br /&gt;      exists    test/fixtures/&lt;br /&gt;   identical    app/models/abc.rb&lt;br /&gt;   identical    test/unit/abc_test.rb&lt;br /&gt;   identical    test/fixtures/abcs.yml&lt;br /&gt;/usr/local/jruby-0.9.2/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:155 warning: JRuby does not currently support defining finalizers&lt;br /&gt;      create  app/views/abcs/_form.rhtml&lt;br /&gt;      create  app/views/abcs/list.rhtml&lt;br /&gt;      create  app/views/abcs/show.rhtml&lt;br /&gt;      create  app/views/abcs/new.rhtml&lt;br /&gt;      create  app/views/abcs/edit.rhtml&lt;br /&gt;      create  app/controllers/abcs_controller.rb&lt;br /&gt;      create  test/functional/abcs_controller_test.rb&lt;br /&gt;      create  app/helpers/abcs_helper.rb&lt;br /&gt;      create  app/views/layouts/abcs.rhtml&lt;br /&gt;      create  public/stylesheets/scaffold.css&lt;br /&gt;&lt;br /&gt;---------&lt;br /&gt;&lt;br /&gt;rhtml はほとんど JSP の感覚で触れる。リンク周りの書き方が少しわかりづらいが&lt;br /&gt;テーブルの背景色を互い違いにするといったことぐらいであればうろ覚えの&lt;br /&gt;Ruby コードをスクリプトレットのように使って簡単に実現できてしまった。&lt;br /&gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;  &amp;lt;% for column in Abc.content_columns %&amp;gt;&lt;br /&gt;    &amp;lt;th&amp;gt;&amp;lt;%= column.human_name %&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;% end %&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% idx=0; %&amp;gt;&lt;br /&gt;&amp;lt;% for abc in @abcs %&amp;gt;&lt;br /&gt;  &amp;lt;% if (idx%2)==0; bgcolor="#ffffff"; else ; bgcolor="#cccccc"; end %&amp;gt;&lt;br /&gt;  &amp;lt;tr bgcolor=&amp;lt;%= bgcolor %&amp;gt; &amp;gt;&lt;br /&gt;  &amp;lt;% for column in Abc.content_columns %&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;%=h abc.send(column.name) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;% end %&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Show', :action =&amp;gt; 'show', :id =&amp;gt; abc %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Edit', :action =&amp;gt; 'edit', :id =&amp;gt; abc %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Destroy', { :action =&amp;gt; 'destroy', :id =&amp;gt; abc }, :confirm =&amp;gt; 'Are you&lt;br /&gt;sure?', :method =&amp;gt; :post %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% idx = idx + 1 %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%= link_to 'Previous page', { :page =&amp;gt; @abc_pages.current.previous } if @abc_pages.curren&lt;br /&gt;t.previous %&amp;gt;&lt;br /&gt;&amp;lt;%= link_to 'Next page', { :page =&amp;gt; @abc_pages.current.next } if @abc_pages.current.next %&lt;br /&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;一旦 rhtml を生成した後でテーブルに変更を加えると list 操作には&lt;br /&gt;すぐ反映されるが new, edit には反映されない。これらは _form.rhtml&lt;br /&gt;をインクルードしていて、それ自身はデータベースの構造変更に&lt;br /&gt;追従するわけではない。ここで generate scaffold すると存在する&lt;br /&gt;ファイルに関しては上書きするかどうか聞いてきてくれる。_form.rhtml は&lt;br /&gt;今のところ触っていなかったので、この方法で更新。&lt;br /&gt;&lt;br /&gt;$ jruby script/generate scaffold abc&lt;br /&gt;      exists  app/controllers/&lt;br /&gt;      exists  app/helpers/&lt;br /&gt;      exists  app/views/abcs&lt;br /&gt;      exists  app/views/layouts/&lt;br /&gt;      exists  test/functional/&lt;br /&gt;  dependency  model&lt;br /&gt;      exists    app/models/&lt;br /&gt;      exists    test/unit/&lt;br /&gt;      exists    test/fixtures/&lt;br /&gt;   identical    app/models/abc.rb&lt;br /&gt;   identical    test/unit/abc_test.rb&lt;br /&gt;   identical    test/fixtures/abcs.yml&lt;br /&gt;/usr/local/jruby-0.9.2/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:155 warning: JRuby does not currently support defining finalizers&lt;br /&gt;overwrite app/views/abcs/_form.rhtml? [Ynaqd] Y&lt;br /&gt;       force  app/views/abcs/_form.rhtml&lt;br /&gt;overwrite app/views/abcs/list.rhtml? [Ynaqd] n&lt;br /&gt;        skip  app/views/abcs/list.rhtml&lt;br /&gt;   identical  app/views/abcs/show.rhtml&lt;br /&gt;   identical  app/views/abcs/new.rhtml&lt;br /&gt;overwrite app/views/abcs/edit.rhtml? [Ynaqd] n&lt;br /&gt;        skip  app/views/abcs/edit.rhtml&lt;br /&gt;   identical  app/controllers/abcs_controller.rb&lt;br /&gt;   identical  test/functional/abcs_controller_test.rb&lt;br /&gt;   identical  app/helpers/abcs_helper.rb&lt;br /&gt;   identical  app/views/layouts/abcs.rhtml&lt;br /&gt;   identical  public/stylesheets/scaffold.css&lt;br /&gt;&lt;br /&gt;このように JRuby on Rails は簡単に動いてしまったが、それを &lt;br /&gt;war ファイルに変換する方法がすぐにわからないので検索してみると&lt;br /&gt;Rails に似た Trails というのがあるらしい。こちらは最初から &lt;br /&gt;java 用で model は java でコーディングする必要があるようだ。&lt;br /&gt;今回は時間切れなので Trails はまたの機会にする。&lt;br /&gt;&lt;br /&gt;古い JBoss や Tomcat をはじめて触ってはまりまくったときに比べると&lt;br /&gt;すんなりと動作まで持っていけた。確かに柔軟性にかけそうな部分は&lt;br /&gt;あるし、細かな書き方がいまひとつわからないがあっさりと動いて&lt;br /&gt;くれるともっともっと触りたくなる。こうやって信者になってくのか???&lt;br /&gt;&lt;br /&gt;うろ覚えで書いてみたものが動いた。文法は Perl ほどではないが、&lt;br /&gt;どうも好きになれない...&lt;br /&gt;&lt;br /&gt;def mathop(n)&lt;br /&gt;  rv = 0&lt;br /&gt;  i = 0&lt;br /&gt;  while i &amp;lt;= n&lt;br /&gt;    rv += i&lt;br /&gt;    i=i+1&lt;br /&gt;  end&lt;br /&gt;  return rv&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;printf "result %d\n", mathop(100)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-6741984113337032498?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/6741984113337032498/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=6741984113337032498' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/6741984113337032498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/6741984113337032498'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/ruby-on-rails-first-impression.html' title='Ruby on Rails First Impression'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-9088046548043985321</id><published>2007-05-09T13:51:00.000+09:00</published><updated>2007-05-09T14:27:24.958+09:00</updated><title type='text'>Axis2, Spring Web Services, JavaOne 2007 Opening</title><content type='html'>XML-RPC に使える OSS として Axis を調べていたけど、どうやら Axis2 に&lt;br /&gt;置き換えられている。Spring Web Services もオフィシャルリリースまで&lt;br /&gt;もう一歩というところ。&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;JavaOne 2007 General Session から&lt;br /&gt;昨年もそうだったが始まる前のステージがかっこいい。&lt;br /&gt;Joe Green も板についてきた。マクネリも半袖のジョブスがうちにもきて&lt;br /&gt;良かったと冗談を言っていた。&lt;br /&gt;&lt;br /&gt;何に含まれているのか聞き取れなかったがリアルタイム java platform には&lt;br /&gt;javax.realtime.RealtimeThread というスレッドがある。Solaris はリアルタイム&lt;br /&gt;版の java 環境をサポートするための機能をもつ。この環境での GC が&lt;br /&gt;どういうものなのか気になる。&lt;br /&gt;&lt;br /&gt;ERICSSON GlassFish ベースのモジュールをオープンソースとして寄贈する&lt;br /&gt;&lt;br /&gt;NASDAQ の取引は java プラットホーム上で行われており日に 50億トランザクションに&lt;br /&gt;上るときもある。2007/02/27 の大量発注も裁ききった。&lt;br /&gt;&lt;br /&gt;SONY: BlueRay が順調で何より&lt;br /&gt;&lt;br /&gt;NetBeans 6.0: 新しい editor やサポート言語の拡張など&lt;br /&gt;&lt;br /&gt;openJDK のオープン化が完了。最近見ていなかったが、クラスライブラリも&lt;br /&gt;open になったのか？ TCK というテストキットもオープンになった。&lt;br /&gt;(Apache から test kit がオープンでなかったので Harmony VM が最初の&lt;br /&gt;open JVM になれなかったと苦情があった...)&lt;br /&gt;&lt;br /&gt;GPLv2 を利用。&lt;br /&gt;&lt;br /&gt;Faster, faster, faster -- Java SE 6.0 に起動、動作にかかわるパフォーマンス&lt;br /&gt;向上を次々にリリースしていく。&lt;br /&gt;&lt;br /&gt;JavaFX:&lt;br /&gt;Java SE 上で動くスクリプト環境で、リッチな GUI, Web 等が作れる。&lt;br /&gt;Flash or PS シリーズの GUI 見たいな感じのものをデモしていた。&lt;br /&gt;&lt;br /&gt;JavaFX Mobile:&lt;br /&gt;Mobile にも SE 環境を提供し、その上で動く FX も提供していく。&lt;br /&gt;&lt;br /&gt;Yahoo GO : Java FX Mobile を使い、リッチなポータル、サーチ画面を提供していく。&lt;br /&gt;&lt;br /&gt;インターネットにつながるデバイスの総数で考えると携帯は PC の 20 倍である。&lt;br /&gt;18 億のモバイル Java user がいる。この部分にてこ入れしていく。&lt;br /&gt;&lt;br /&gt;教育や、環境にも貢献していきたい...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-9088046548043985321?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/9088046548043985321/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=9088046548043985321' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/9088046548043985321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/9088046548043985321'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/axis2-spring-web-services-javaone-2007.html' title='Axis2, Spring Web Services, JavaOne 2007 Opening'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-8709104457481236704</id><published>2007-05-07T19:24:00.000+09:00</published><updated>2007-05-07T19:26:22.014+09:00</updated><title type='text'>iBATIS JPetStore-5.0 sample</title><content type='html'>修正なし、DB セットアップなしで動いてくれるところがうれしい。Tomcat, Jetty で&lt;br /&gt;問題なく動作した。&lt;br /&gt;&lt;br /&gt;以前少しだけ触った winstone だが、JSP のタグがそのまま表示されていて&lt;br /&gt;機能が限られていると思っていたが、使い方がまずかった。Winstone 自体には&lt;br /&gt;JSP のランタイム、コンパイラがないのだ。&lt;br /&gt;&lt;br /&gt;Tomcat から ./lib または --commonLibFolder=... で指定したディレクトリに&lt;br /&gt;jasper 関連、commons-logging.jar をコピーして --useJasper=true を&lt;br /&gt;つけて起動するとちゃんと動いた。&lt;br /&gt;&lt;br /&gt;java -jar ../winstone-0.9.6.jar --httpPort=8989 \&lt;br /&gt;--ajp13Port=8988 --useJasper=true \&lt;br /&gt;--warfile=../ibatis_sample/JPetStore-5.0/build/wars/jpetstore.war&lt;br /&gt;&lt;br /&gt;iBATIS で BMP を実装しているケースを少し確認しないといけないので&lt;br /&gt;サンプルを読み解いていく必要がある。&lt;br /&gt;&lt;br /&gt;ゼロから作ってもいいのだが、設定ファイルの配置に関する決まりごとなど&lt;br /&gt;あるとはまりそうなのでサンプルからはいるのがよさそう。&lt;br /&gt;&lt;br /&gt;あと Abator という Eclipse plugin で設定ファイルが簡単に作れるようだが、&lt;br /&gt;私は NetBeans 派。NetBeans/Eclipse を同時にあげるメモリもない...&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Spring のサブプロジェクトに rich client とか web service といった&lt;br /&gt;面白そうなものを発見。今度試してみよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-8709104457481236704?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/8709104457481236704/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=8709104457481236704' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8709104457481236704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/8709104457481236704'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/ibatis-jpetstore-50-sample.html' title='iBATIS JPetStore-5.0 sample'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-1122005969066814574</id><published>2007-05-07T16:03:00.001+09:00</published><updated>2007-05-07T16:47:12.007+09:00</updated><title type='text'>Transaction</title><content type='html'>Spring framework の TransactionManager を使用してみる。&lt;br /&gt;(この部分に関しては初めてなので、内容は実験的なもので&lt;br /&gt;実践的なものではありません。) &lt;br /&gt;&lt;br /&gt;Hibernate で大量のデータを insert していくと非常に時間がかかる。&lt;br /&gt;メモリ内に持つ場合に比べてオーダが２つか３つ異なる。出し方は&lt;br /&gt;忘れたが、auto-commit モードでは遅いよ見たいな事を言われたことが&lt;br /&gt;あったので、設定ファイルでプロパティとしてオフにしてみたり&lt;br /&gt;SQLConnection/Statement を得てオフにしてみたりしたが効果がない。&lt;br /&gt;&lt;br /&gt;ではいったいどうやって auto-commit をオフにするかを考えていた。&lt;br /&gt;もちろん、全てを素の JDBC でやる気は毛頭ない。ぼんやりと思って&lt;br /&gt;いたのは Spring の TransactionManager を使えばオフになるのでは&lt;br /&gt;ということ。&lt;br /&gt;&lt;br /&gt;1.X の文法はなんともわかりにくかった。2.0 の aop/tx の形式なら&lt;br /&gt;何とかなるかもということでやってみる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;aop:config&amp;gt;      &lt;br /&gt;        &amp;lt;aop:advisor pointcut="execution(* *..XRecDaoImplTx.insertXRecord(..))"&lt;br /&gt;                     advice-ref="txAdvice"/&amp;gt;&lt;br /&gt;    &amp;lt;/aop:config&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;tx:advice id="txAdvice"&amp;gt;&lt;br /&gt;        &amp;lt;tx:attributes&amp;gt;&lt;br /&gt;            &amp;lt;tx:method name="insertXRecord"&lt;br /&gt;                       propagation="REQUIRED"&lt;br /&gt;                       timeout="20"/&amp;gt;&lt;br /&gt;        &amp;lt;/tx:attributes&amp;gt;&lt;br /&gt;    &amp;lt;/tx:advice&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ところがこれだけではどうも効果がわからない。&lt;br /&gt;aop, transaction のログレベルを DEBUG にすると動作がなんとなく&lt;br /&gt;わかるようになる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;log4j.category.org.springframework.transaction=DEBUG&lt;br /&gt;log4j.category.org.springframework.aop.config=DEBUG&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[main] DEBUG (NameMatchTransactionAttributeSource.java:addTransactionalMethod) - Adding transactional method [insertXRecord] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT,timeout_20]&lt;br /&gt;[main] DEBUG (NameMatchTransactionAttributeSource.java:addTransactionalMethod) - Adding transactional method [xrec1Tx] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT,timeout_20]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:bindResource) - Bound value [org.springframework.jdbc.datasource.ConnectionHolder@146c2f2] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] to thread [main]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:initSynchronization) - Initializing transaction synchronization&lt;br /&gt;[main] DEBUG (TransactionAspectSupport.java:prepareTransactionInfo) - Getting transaction for [ibatisinteg.dao.XRecDao.insertXRecord]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:getResource) - Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@146c2f2] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] bound to thread [main]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:getResource) - Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@146c2f2] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] bound to thread [main]&lt;br /&gt;[main] DEBUG (TransactionAspectSupport.java:commitTransactionAfterReturning) - Completing transaction for [ibatisinteg.dao.XRecDao.insertXRecord]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:clearSynchronization) - Clearing transaction synchronization&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:unbindResource) - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@146c2f2] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] from thread [main]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:bindResource) - Bound value [org.springframework.jdbc.datasource.ConnectionHolder@178bb14] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] to thread [main]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:initSynchronization) - Initializing transaction synchronization&lt;br /&gt;[main] DEBUG (TransactionAspectSupport.java:prepareTransactionInfo) - Getting transaction for [ibatisinteg.dao.XRecDao.insertXRecord]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:getResource) - Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@178bb14] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] bound to thread [main]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:getResource) - Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@178bb14] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] bound to thread [main]&lt;br /&gt;[main] DEBUG (TransactionAspectSupport.java:commitTransactionAfterReturning) - Completing transaction for [ibatisinteg.dao.XRecDao.insertXRecord]&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:clearSynchronization) - Clearing transaction synchronization&lt;br /&gt;[main] DEBUG (TransactionSynchronizationManager.java:unbindResource) - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@178bb14] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@1d9a2ab] from thread [main]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;よく見ると Getting Transaction for [method name] と Completing transaction for [method name]&lt;br /&gt;が繰り返し出てきている。実際に数えると insert と同じ回数出てきている。&lt;br /&gt;&lt;br /&gt;これから、ポイントカットに入るときに開始して、出るときに終了しているらしいことが&lt;br /&gt;わかる。これでは元のつくりより遅いではないか。&lt;br /&gt;&lt;br /&gt;では大量の insert を行う処理を呼ぶ側につけてはどうか。&lt;br /&gt;&lt;br /&gt;これをやっているときにも少しつまづいた。ポイントカットに指定するメソッドは&lt;br /&gt;インターフェイスで定義されたものの実装でなければならないようである。&lt;br /&gt;当然、static メソッドは使えない。継承関係が複雑な場合(あるインターフェイスを&lt;br /&gt;実装した抽象クラスのサブクラスが他のインターフェイスを実装していてといった&lt;br /&gt;感じ) でもうまく動かなかった。&lt;br /&gt;&lt;br /&gt;試行錯誤の後、この方法でトランザクション中はコミットが入らずデータの追加が&lt;br /&gt;早くできた。失敗した場合のことはまだ考えていない。エラーが起きないように&lt;br /&gt;データを用意するか、それともエラーが起きたときにデータをチェックして正しい&lt;br /&gt;データのみ登録するか、それぞれ面倒そうなのでじっくり考えることにしよう。&lt;br /&gt;&lt;br /&gt;最初に設定したデータベース処理に近いポイントカットも enable してみると&lt;br /&gt;パフォーマンスの低下は見られなかった。どうやらネストしたトランザクション&lt;br /&gt;スコープからぬける際はフラッシュはかからないようだ。&lt;br /&gt;&lt;br /&gt;ibatis のバッチモードも大量データ追加に効果があるようなことが書かれていたので&lt;br /&gt;試してみたが、いまひとつ。むしろ TransactionManager が効果的のようだ。&lt;br /&gt;(試したサンプルは batch mode を transaction 開始、終了で囲んであったので&lt;br /&gt;batch だけやっても意味はないのかも)&lt;br /&gt;&lt;br /&gt;Hibernate のパフォーマンスだが、最終的にはトランザクションを使わない場合の&lt;br /&gt;2, 3 倍程度となった。(Embedded Derby の場合) これは少し期待はずれ。&lt;br /&gt;MySQL でやると改善率は高いのだが、もともとがとても遅いわけでやはりこれも&lt;br /&gt;使えない。&lt;br /&gt;&lt;br /&gt;Hibernate をつかったプログラムでは自前でバッチ更新するコードを入れていた&lt;br /&gt;(Hibernate template に Collection をわたす)。この場合、ひとつのセッションの&lt;br /&gt;中で更新・追加が行われるわけで TransactionManager を使わなくとも早く&lt;br /&gt;できることがわかった。ただ、エラーハンドリングをどうするかは依然として&lt;br /&gt;課題である。ibatis のバッチモードもこのようなことなのかも知れない。&lt;br /&gt;&lt;br /&gt;かなり入り口の部分でポイントカットを設定して走らせて見ると OutOfMemoryError が&lt;br /&gt;でた。commit するまではどこかにためておかれるみたい。定期的にフラッシュする&lt;br /&gt;簡単な方法があると良いのだが。トランザクションの本来の使い方から大きく&lt;br /&gt;逸脱しているので難しそうだが...&lt;br /&gt;&lt;br /&gt;結局、大量のデータ登録を行うには DB 固有の import がもっとも速そう。しかし、&lt;br /&gt;これもいろいろな制約のついたテーブル構造・関係の下ではいろいろなエラーが&lt;br /&gt;おきうるので頭が痛い...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-1122005969066814574?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/1122005969066814574/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=1122005969066814574' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1122005969066814574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/1122005969066814574'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/transaction.html' title='Transaction'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-5719205264763212842</id><published>2007-05-03T09:31:00.000+09:00</published><updated>2007-05-03T09:50:38.869+09:00</updated><title type='text'>XML catalog</title><content type='html'>SqlMap の設定を NetBeans で作っていると、補完機能が効かないのに気づいた。&lt;br /&gt;&lt;br /&gt;以前作った spring 用の XML catalog ファイルを参考に catalog ファイルを作成してみる。&lt;br /&gt;あっさりと動いた。このケースでは DTD のエントリしかないが、XML Schema でも同じ。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt; PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"&lt;br /&gt; "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"&amp;gt;&lt;br /&gt;&amp;lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"&amp;gt;&lt;br /&gt;  &amp;lt;system systemId="http://www.ibatis.com/dtd/sql-map-config-2.dtd"&lt;br /&gt;    uri="sql-map-config-2.dtd" /&amp;gt;&lt;br /&gt;  &amp;lt;system systemId="http://www.ibatis.com/dtd/sql-map-2.dtd"&lt;br /&gt;    uri="sql-map-2.dtd" /&amp;gt;&lt;br /&gt;&amp;lt;/catalog&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こちらが spring 用に作ったもの。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt; PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"&lt;br /&gt; "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"&amp;gt;&lt;br /&gt;&amp;lt;catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"&amp;gt;&lt;br /&gt;  &amp;lt;system systemId="http://www.springframework.org/dtd/spring-beans.dtd"&lt;br /&gt;    uri="spring-beans.dtd" /&amp;gt;&lt;br /&gt;  &amp;lt;system systemId="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&lt;br /&gt;    uri="spring-beans-2.0.xsd" /&amp;gt;&lt;br /&gt;  &amp;lt;system systemId="http://www.springframework.org/schema/util/spring-util-2.0.xsd"&lt;br /&gt;    uri="spring-util-2.0.xsd" /&amp;gt;&lt;br /&gt;  &amp;lt;system systemId="http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&lt;br /&gt;    uri="spring-aop-2.0.xsd" /&amp;gt;&lt;br /&gt;&amp;lt;/catalog&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ファイルは DTD, Schema のあるディレクトリに .xcat の拡張子で保存した。&lt;br /&gt;NetBeans の Runtime tab / DTD and XML Schema Catalogs を右クリック, Add Catalogs&lt;br /&gt;で追加できる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-5719205264763212842?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/5719205264763212842/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=5719205264763212842' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/5719205264763212842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/5719205264763212842'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/xml-catalog.html' title='XML catalog'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-2609973474159535846</id><published>2007-05-01T02:48:00.001+09:00</published><updated>2007-05-01T02:53:40.191+09:00</updated><title type='text'>HTML escape</title><content type='html'>このサイトでは &lt;, &gt; のエスケープが効いていないみたい。プログラムや、XML の&lt;br /&gt;ソースを引用するには少し不便。以前作った PHP 版の簡易エスケープツールを&lt;br /&gt;SpringMVC で作り直してみた。とりあえず動作確認。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;     xmlns:util="http://www.springframework.org/schema/util"&lt;br /&gt;     xmlns:aop="http://www.springframework.org/schema/aop"&lt;br /&gt;     xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt;     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;     http://www.springframework.org/schema/util&lt;br /&gt;     http://www.springframework.org/schema/util/spring-util-2.0.xsd&lt;br /&gt;     http://www.springframework.org/schema/aop&lt;br /&gt;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- Acegi config --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="authenticationManager"&lt;br /&gt;        class="org.acegisecurity.providers.ProviderManager"&amp;gt;&lt;br /&gt;      &amp;lt;property name="providers"&amp;gt;&lt;br /&gt;          &amp;lt;list&amp;gt;&lt;br /&gt;              &amp;lt;ref local="daoAuthenticationProvider"/&amp;gt;&lt;br /&gt;          &amp;lt;/list&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="daoAuthenticationProvider"&lt;br /&gt;        class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"&amp;gt;&lt;br /&gt;      &amp;lt;property name="userDetailsService" ref="userDetailsService"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="userDetailsService"&lt;br /&gt;        class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"&amp;gt;&lt;br /&gt;      &amp;lt;property name="userProperties"&amp;gt;&lt;br /&gt;          &amp;lt;props&amp;gt;&lt;br /&gt;              &amp;lt;prop key="admin"&amp;gt;pass,ROLE_USER,ROLE_ADMIN&amp;lt;/prop&amp;gt;&lt;br /&gt;              &amp;lt;prop key="guest"&amp;gt;pass,ROLE_USER&amp;lt;/prop&amp;gt;&lt;br /&gt;          &amp;lt;/props&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="accessDecisionManager"&lt;br /&gt;        class="org.acegisecurity.vote.AffirmativeBased"&amp;gt;&lt;br /&gt;      &amp;lt;property name="decisionVoters"&amp;gt;&lt;br /&gt;          &amp;lt;bean class="org.acegisecurity.vote.RoleVoter"/&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="authenticationProcessingFilter"&lt;br /&gt;        class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&amp;gt;&lt;br /&gt;      &amp;lt;property name="authenticationManager" ref="authenticationManager"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="filterProcessesUrl" value="/process-login"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="defaultTargetUrl" value="/index.jsp"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="authenticationFailureUrl" value="/error/error-login.html"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="logoutFilter"&lt;br /&gt;        class="org.acegisecurity.ui.logout.LogoutFilter"&amp;gt;&lt;br /&gt;      &amp;lt;constructor-arg value="/"/&amp;gt;&lt;br /&gt;      &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;          &amp;lt;bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/&amp;gt;&lt;br /&gt;      &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;      &amp;lt;property name="filterProcessesUrl" value="/process-logout"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="sessionIntegrationFilter"&lt;br /&gt;        class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="anonymousProcessingFilter"&lt;br /&gt;        class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter"&amp;gt;&lt;br /&gt;      &amp;lt;property name="userAttribute" value="anonymous,ROLE_ANONYMOUS"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="key" value="anonymousKey"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="filterSecurityInterceptor"&lt;br /&gt;        class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"&amp;gt;&lt;br /&gt;      &amp;lt;property name="authenticationManager" ref="authenticationManager"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="accessDecisionManager" ref="accessDecisionManager"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="objectDefinitionSource"&amp;gt;&lt;br /&gt;          &amp;lt;value&amp;gt;&lt;br /&gt;              CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON&lt;br /&gt;              PATTERN_TYPE_APACHE_ANT&lt;br /&gt;              /login.html=ROLE_ANONYMOUS,ROLE_USER&lt;br /&gt;              /process-login=ROLE_ANONYMOUS,ROLE_USER&lt;br /&gt;              /user-info.jsp=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /error/**=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /css/**=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /index.jsp=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /welcome.html=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /vmstat.html=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /*.js=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /dynimg/**=ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN&lt;br /&gt;              /admin/**=ROLE_ADMIN              &lt;br /&gt;              /**=ROLE_USER,ROLE_ADMIN&lt;br /&gt;          &amp;lt;/value&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="exceptionTranslationFilter"&lt;br /&gt;        class="org.acegisecurity.ui.ExceptionTranslationFilter"&amp;gt;&lt;br /&gt;      &amp;lt;property name="authenticationEntryPoint"&amp;gt;&lt;br /&gt;          &amp;lt;bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&amp;gt;&lt;br /&gt;              &amp;lt;property name="loginFormUrl" value="/login.html"/&amp;gt;&lt;br /&gt;              &amp;lt;property name="forceHttps" value="false"/&amp;gt;&lt;br /&gt;          &amp;lt;/bean&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;      &amp;lt;property name="accessDeniedHandler"&amp;gt;&lt;br /&gt;          &amp;lt;bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"&amp;gt;&lt;br /&gt;              &amp;lt;property name="errorPage" value="/error/error-access.html"/&amp;gt;&lt;br /&gt;          &amp;lt;/bean&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"&amp;gt;&lt;br /&gt;      &amp;lt;property name="filterInvocationDefinitionSource"&amp;gt;&lt;br /&gt;          &amp;lt;value&amp;gt;&lt;br /&gt;              CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON&lt;br /&gt;              PATTERN_TYPE_APACHE_ANT&lt;br /&gt;              /**=sessionIntegrationFilter,logoutFilter,authenticationProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor&lt;br /&gt;          &amp;lt;/value&amp;gt;&lt;br /&gt;      &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;  &amp;lt;!-- end Acegi config --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="customerService" class="uxtool.webflow.DefaultCustomerService"&amp;gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-2609973474159535846?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/2609973474159535846/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=2609973474159535846' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/2609973474159535846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/2609973474159535846'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/05/html-escape.html' title='HTML escape'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5404752707210924231.post-7071340490222286225</id><published>2007-04-30T18:35:00.000+09:00</published><updated>2007-04-30T20:08:08.550+09:00</updated><title type='text'>Axis, XML RPC, JAX-RPC などなど</title><content type='html'>もやもやっとしてた Axis を少し勉強。&lt;br /&gt;&lt;br /&gt;最近の更新履歴を見る限りあまり活発な状態には見えない。&lt;br /&gt;&lt;br /&gt;バイナリディストリビューションを展開すると webapps の下に axis という&lt;br /&gt;ディレクトリがあって webapp の形をしている。これをディレクトリごと&lt;br /&gt;サーブレットコンテナの webappsにコピーする。設定ファイルを更新&lt;br /&gt;したりする必要があるので WAR にまとめてはいけない。&lt;br /&gt;&lt;br /&gt;何が出来るかというとコンテナに配置した Axis サーバにユーザが&lt;br /&gt;作ったサービスを登録して呼び出すことが出来る。&lt;br /&gt;&lt;br /&gt;形式には AdminService を使って wsdd ファイルを与えて一連の&lt;br /&gt;クラスを登録する方法と java program のソースを .jws 拡張子で&lt;br /&gt;webapps/axis に置き、サーバにコンパイル、配備させる方法の&lt;br /&gt;二つがある。後者はパッケージや、複雑な指定が出来ないため、&lt;br /&gt;凝ったことは出来ない。&lt;br /&gt;&lt;br /&gt;WSDL というサービスを記述した情報がクライアントアクセスに必要に&lt;br /&gt;なるが、これは手で書くわけではなく、.wsdd を元に動的に生成されて&lt;br /&gt;いるらしい。サービスの URL に?wsdl をつけてブラウザでアクセス&lt;br /&gt;すると表示される。&lt;br /&gt;&lt;br /&gt;Axis/SOAP の位置づけを考えれば当然なことなのだが、扱える&lt;br /&gt;データ型に色々と制約がある。XML でマーシャリングするという&lt;br /&gt;ことは、XML スキーマで記述できるデータでなければならない&lt;br /&gt;ということであり、標準定義されているのはプリミティブ型、文字列、&lt;br /&gt;日付程度である。wsdd に型に関する情報を記述すれば比較的&lt;br /&gt;シンプルな JavaBeansは扱えるが、込み入ったオブジェクト群を&lt;br /&gt;送るのは面倒なことに思える。コレクションも送れない。RMI では&lt;br /&gt;ないのだ。wsdd を熟知するかその記述を自動化する方法が&lt;br /&gt;ないうちはプリミティブデータの配列程度に収めておくのが無難&lt;br /&gt;そうだ。文字列でやり取りをして必要に応じてそれをパースする&lt;br /&gt;ほうがシンプルでよいのかも。でもそう考えるとせっかくデータ&lt;br /&gt;記述性に優れた XML を使ってる意味がよくわからなくなる。&lt;br /&gt;Bean の配列程度でもある程度の表現は出来ないことはない。&lt;br /&gt;逆に考えると Java オブジェクトを渡すということは双方で同じクラス&lt;br /&gt;定義を使用しないといけないことになる。ざっと見た感じでは&lt;br /&gt;RMI では可能なクラスの共有方法などがない。&lt;br /&gt;&lt;br /&gt;少しがっかりしたが、関連技術を調べてみるとそうでもないらしい。&lt;br /&gt;ここでは XML RPC の詳細を述べていないが、まずサンプル&lt;br /&gt;として最初に動かす物や JWS は privider="java:RPC"&lt;br /&gt;(or style="RPC")になっている。プロバイダが java:RPC で&lt;br /&gt;あれば Axis ランタイムがシリアライズ、デシリアライズを行う。&lt;br /&gt;その際に XML Schema での記述力、標準で用意された&lt;br /&gt;データタイプに縛られるということである。&lt;br /&gt;&lt;br /&gt;スタイルには java RPC のほかに Document, Wrapped, Message&lt;br /&gt;がある。斜め読みだが、Document スタイルを使うとユーザーが&lt;br /&gt;データのシリアライズ。デシリアライズを記述できるように書いて&lt;br /&gt;あるページもある。Axis のドキュメントを見る限りは XML として&lt;br /&gt;サーバー側でデータを受けるときにつかうスタイルは Message&lt;br /&gt;スタイルなので Document ではないのではないかと思ったりもしたが、&lt;br /&gt;Message スタイルで定義できるメソッドのシグネチャに次の&lt;br /&gt;物があり、"Document で..."  という記述はこのシグネチャの中の &lt;br /&gt;(DOMだっけ?)  のXML 記述型としての Document のことを&lt;br /&gt;言っていたのだと思う。&lt;br /&gt;&lt;br /&gt;  public Document method(Document body);&lt;br /&gt;&lt;br /&gt;スタイルとしての Document, Wrapped は今ひとつ有用性がわからない。&lt;br /&gt;&lt;br /&gt;関連する規格に関しても確認してみた。まだ、大雑把で、バージョン&lt;br /&gt;ごとの違いもとてもあいまいなのだが...&lt;br /&gt;&lt;br /&gt;JAX-RPC&lt;br /&gt;XML RPC の規格。Java 1.4 でも動作するが機能は少なそう。&lt;br /&gt;&lt;br /&gt;JAX-WS&lt;br /&gt;JAX-RPC の後継のようだが Java 1.5 の機能に依存している。&lt;br /&gt;&lt;br /&gt;JAXB&lt;br /&gt;Java と XML データのバインディングの規格。&lt;br /&gt;&lt;br /&gt;Java オブジェクトのやり取りという点では Axis に Message スタイルの&lt;br /&gt;サービスを用意して JAXB でデータのシリアライズ、デシリアライズを&lt;br /&gt;するようにすると RMI に近い感覚で使えそう。&lt;br /&gt;&lt;br /&gt;調べてみると面倒そうなところが見えてきて少し億劫になってしまいそうだ。&lt;br /&gt;----&lt;br /&gt;今日のレッスンは少し少なめ。スタイルもオーソドックスに逆戻り。&lt;br /&gt;でも、それがいいかも。&lt;br /&gt;今期はこんなところで次に期待。方向転換をいれてくれると面白いけど。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5404752707210924231-7071340490222286225?l=dolduke.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dolduke.blogspot.com/feeds/7071340490222286225/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5404752707210924231&amp;postID=7071340490222286225' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/7071340490222286225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5404752707210924231/posts/default/7071340490222286225'/><link rel='alternate' type='text/html' href='http://dolduke.blogspot.com/2007/04/axis-xml-rpc-jax-rpc.html' title='Axis, XML RPC, JAX-RPC などなど'/><author><name>dolduke</name><uri>http://www.blogger.com/profile/10978457837575290770</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
