glassfish_railsは動くのに、jetty_railsが上手く動かない

Rails 2.2でスレッド・セーフになると、JRuby上で動かす利点がさらに増えるよねってことで、JRuby On Railsを試したりしてる。

GlassFish Gemを使って、GlassFish v3にdeployするのは超簡単。
JRubyをinstallして、パスとか通したりしたら、
jruby -S gem install rails
で、JRuby用のRailsをinstall。ちなみにRubyGemsは最初から入ってる。
jruby -S rails demo
で、Railsアプリの雛形作成。
jruby -S gem install glassfish
で、GlassFish Gemのinstall。
jruby -S glassfish_rails demo
で、GlassFishを起動できる。んだけど、注意点が一つ。
WEBRickなりMongrelなりを起動するときは、作成したRailsアプリのディレクトリ(この場合demo)の中で、
ruby script/server
ってやってたけど、glassfish_railsコマンドはdemoの一個上のディレクトリで実行する。
そうすれば、http://localhost:3000/で、例のRailsのスタートページ(動作環境とかがAjaxで見えるやつ)が見える。
demoの中で実行した場合は、Railsアプリはdeployされず、GlassFishの動作確認ページっぽいのしかでてこない。

んで、その辺の情報を調査してるときに、rackに基づいて作られてるアプリをJavaのアプリケーションサーバ上で動かせるJRuby-Rackを発見。
これならRailsだけじゃなくてMerbで作ったアプリケーションなんかもGlassFishとかで動かせちゃう。

さらに、そのJRuby-Rackを使ってJetty上でRailsや、MerbなどのRackベースのframeworkで作られたアプリケーションを動かせるようにする、jetty-railsを発見。
こいつは、RailsやMerb以外にも、GlassFish GemではできないJava Servletアプリケーションも動かせるらしい。
GlassFish Gemの手軽さで、RailsとServletの共存ができるなんて素晴しいってことで、さっそく試してみた。

jruby -S gem install jetty-rails
で、install。
GlassFish Gemとは違って、Railsアプリのディレクトリ(今回はdemo)に入って、
jruby -S jetty_rails
で、上手くいくはずなのに、次のようなエラーが。

C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:513:in `new_constants_in': protected method `log' called for ActiveSupport::Dependencies:Module (NoMethodError)
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:510:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/lib/jetty_rails.rb:13
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/lib/jetty_rails.rb:27:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:36
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:19:in `load'
from C:/jruby/jruby-1.1.4/bin/jetty_rails:19

config/jetty_rails.ymlを

---
:servers:
- :context_path: /demo
  :adapter: :rails
  :base: jetty_rails_proj
  :environment: development
  :port: 3000
:environment: production
:jruby_min_runtimes: 1
:jruby_max_runtimes: 2
:thread_pool_max: 40
:thread_pool_min: 1
:acceptor_size: 20

こんな感じで作って、config/environment.rbに
ActionController::AbstractRequest.relative_url_root = "/demo"
を追加しても同じ。

むーん。

===追記(10/30)===
どうやらJRuby1.1.4のバグのようです。
http://blogs.sun.com/cinnabar/entry/jetty_rails_with_jruby1_1

===追記(11/7)===
http://blogs.sun.com/cinnabar/entry/jruby1_1_5_releaseにある通り、JRuby1.1.5で動作するのを確認しました。

元「協力会社さん」として

「外注と同じ仕事しかしないなら辞めろ」
http://d.hatena.ne.jp/yuripop/20081021/p1

を受けて、id:yuripopと「協力会社さん」という立場で一緒の現場で働いていた身として、色々書いておきたいことがある。

って思ったけど、

前は、だれのブログを見ても必ずJavaのソースがあるとか、いかにコードを書くかという話だった感じだけど、いまはいかに仕事をするかとか、いかに生きるかとか。技術話から業界話にシフトしたのか。
http://d.hatena.ne.jp/nowokay/20081021#1224616671

を見て、あーやっぱ僕はコード書こうって思ったのでやめとく。

ただ、ひとつだけ。
色々あった現場だけど、僕はid:yuripopと一緒の現場にいれてよかったなぁって思うよ、うん。

第一回ひがやすを飲み会

第一回ひがやすを飲み会に参加したつもりが、いつの間にかjava-jaに参加していた。

吉岡さんがWassrの「今夜は飲みに行けるよ!」ボタンをずっと褒めてた。その後、酔っ払ってからはずっと眼鏡っ子を口説いてた、気がする。
あと、池面眼鏡っ子くどいてる姿も写メ撮った。
その後、早めにyuripopと一緒に帰った。品川駅まで。

翌日、傘置き忘れたことに気がついた。

Wicket in Action

ようやく、Wicket in ActionがAmazonから届きましたー。
PDF本も買ってたけど、やっぱり紙の本の方が使いやすいなー。

とりあえず最新のWicket1.4系を使って写経していく予定。

DB Magazine9月号に執筆しました

告知遅れたんだけど、DB Magazine9月号に執筆しました。
(もうすでに最新号は10月号です)
僕の本名知ってる人は、翔泳社のDB Magazineのページに僕の名前を見つけられるはず!
本名知らない人は、上のメニューのWHOから、mixiかFacebook見ればわかるかな。

リッチクライアント特集の中の主にjQueryについての部分を書かせていただきました。
DB Magazineっていう名前にとらわれず、いろんな技術の特集してるんだねー。

近所のカラオケのランキングが残念だった

先日、近所のカラオケにいきました。
カラオケの鉄人 大井町店

部屋に入るとテーブルの上に、「リクエストランキング」的なものが置いてあったので、見てみました。
それはどうやら、ちょっと前のもの(行ったのは8月だがランキングは2月のもの)だったのでちょっと残念だったのですが、ランキングの中身を見てもっと残念な気持ちになりました。

このランキングを見て残念だと思う奴のほうがもっと残念だという意見は大正解

唐突ですが

本日、婚姻届を区役所に提出いたします。

別に、オリンピックの開会式がある日だからとかじゃなく、
8が多い末広がりで縁起がいいからってわけでもなく、
08年08月08日なので覚えやすく、数年後結婚記念日を忘れたことによってdisられるのを避けるためです。

なお、史上初(?)の婚姻届を提出する場面をUstで生中継!とかやろうかと思ったけど、
絶対ぶち切れられるので止めときます。すみません。

Wicket-jaの第1回Wicket勉強会に行ってきました。

Wicket-jaとしては初のオフラインイベント。
会場をご提供くださいましたXarts株式会社様、ありがとうございました。

詳しい内容は、のエントリを参照してもらうとして、反省から。

まず、全部矢野さん任せになっちゃってたこと。発案から募集と人数調整や会場確保、懇親会の店予約や当日の準備・進行と全部矢野さんがやられてました。
これじゃだめだ、せめて何か手伝わないとって思ってUst係をやりましたが、Ust結構難しいなぁ。ちゃんとやるにはちゃんと機材がほしいね。cojiさんに教わるべきか。
まあ、第2回以降も開催されるはずなので、そのときはもうちょっとみんなで(僕も含めて)役割分担して矢野さんの負荷を分散させないと、Wicket本がいつまでたっても上梓されないことになりそうなので、みんなで手伝いましょう。

あとは、LTはもっとちゃんとLTっぽくするべきかなぁって思った。タイムキーパーちゃんとつけて時間着たら終了!続きは懇親会でって感じのほうがLTっぽい。
そういう意味で@yamashiroの「続きは懇親会で!」の声掛けはGJだったと思う。

内容に関しての感想としては、発表内容が割とバラけてたのがよかったなーって思った。
Wicketよく知ってる人もいれば、当日処理系インストールした人もいるぐらいだったので、参加者それぞれが勉強会に求めるものが違っていた。
Wicketって名前は知ってるけど実際に使うとどういう感じなんだろ?って知りたい人もいれば、Wicketの仕組みの深い部分を知りたい人もいれば、Wicketの採用/運用実績ってどうなの?って人もいた。
そういう多様な参加者に応えうるだけの発表がそろっていたんじゃないでしょうか。

僕の個人的な感想では、ComponentResolver関連の話をもっと深めてみたかったかな。
あんな仕組みあるって知らなかったし、あそこに拡張ポイントが用意されてるってことは、オレオレフレームワークを作るための土台として使うことも想定されてるんだろうなぁ、僕ならどういじるかなぁとか色々妄想が膨らんだ。
あと、運用実績の話も、意外と知らないところで使われてるもんだなーって思った。

第2回も2ヶ月以内を目標ぐらいに開催する予定なので、今回参加した方もできなかった方も、是非ご参加ください。

Livelyのルーム作ってみた

貼ったらどうみえるのかテスト

見てるページのコメントをTwitterに投稿できるGreasemonkeyスクリプトを更新しました。

前回のエントリで公開したGreasemonkeyスクリプトには、ブログ主なりサイト管理者なりが自分のTwitterIDをページ内に埋め込んでくれていないと動かないという欠点がありました。

その辺なんとかならないかなーって思いながらも公開したんですが、そのエントリに付いたはてブにヒントが!

2008年06月25日 mattn サイト管理人のtwitter-idを調べるのにtako3を使う手もありかなー

おおお・・・!すばらしい!tako3っていうサービスがありましたね!
このサービスは、ある人が他にどんなサービス使ってるか情報を共有する他己紹介サービスです。昔見て「ほぉ~」って思ったのに忘れていた。

というわけで早速ググって見たところ、

tako3.comとFooo.nameのAPIを叩くユーザスクリプト - cameraLady:
http://june29.jp/2007/10/12/profile-urls-findr-powerd-by-tako3-and-fooo/

というものを発見!
tako3だけじゃなく同様のサービスであるFooo.nameにも対応しているようで、大いに参考にさせてもらいました。

というわけでtako3、Fooo.name対応版が完成しました!
これによって、ブログ主やサイト管理者がページに何かを埋め込んだりする必要なく、tako3やFooo.nameに登録さえされていれば、その人のサイト上でその人のTwitterアカウントに向けてコメントを記入することができます。
CodeReposに置いてあるので、ぜひ使ってみてください。
また、気に入らないところがあればぜひいじってください。

いや~、やっぱ何か作ったら恐れず公開すべきだねぇ。アイデアを下さったmattnさんありがとうございました。

なお、このエントリは、稚作サービスの「ぶっこめ!」を用いまして、上記ブックマークコメントを頂きましたmattnさんのブックマークへのトラックバックエントリとなっております。
はてなのIDコールを使ってmattnさんにこのエントリを知らせる仕組みになってるはずですが気づいてもらえましたか?

Twitterに見てるページのコメントを投稿できるグリモン作った。

インスパイア元:

Going My Way: ブログのエントリーへのコメントを Twitter に投稿できるボタン
http://kengo.preston-net.com/archives/003745.shtml

上記エントリでしてることは、ただのLinkを用意するだけだったので、
もうちょっとなんとかしたいなーってことで、Greasemonkeyの勉強も兼ねて作ってみました。

インストールはこちらから。

<div id="_cvt_twitterId" style="visibility: hidden;">hoge</div>

という要素が表示しているページに存在していると、ウィンドウ下部にTwitterへの投稿Formが出現します。
投稿ボタンを押すと、@hogeさんへの返信という形で、表示してるページのURLとともにコメントがTwitterへ投稿されます。

なので、この要素をまず、ブログ主なりサイト管理者なりが埋め込んでおかないと意味がないです。
この辺なんとかしたいんだけど無理かなぁ。
ちなみに、当ブログでは上記要素を埋め込んでいるのでこのGreasemonkeyをインストールすれば、Twitterへの投稿Formが出現するはずです。

Twitterへの投稿時の認証はブラウザによるBASIC認証なので、初回はID/PASSを聞かれると思います。

念のため、ソースコードも貼っときます。初Greasemonkeyなので、突っ込み大歓迎です。
ライセンスはNYSLです。
(追記) CodeReposにコミットしました。
http://svn.coderepos.org/share/lang/javascript/CvT/comment_via_twitter.user.js

// ==UserScript==
// @name           Comment via Twitter
// @namespace      com.mesolabs
// @description    Comment via Twitter
// @include        *
// ==/UserScript==

(function () {

    var cvtElement = document.getElementById("_cvt_twitterId")
    if (cvtElement) {
        var form = //
        <form action="#" id="_cvt_form">
            Comment via Twitter: <input type="text" id="_cvt_text" />
            <input type="button" value="投稿" id="_cvt_submit" />
        </form>;

        var div = document.createElement("div");
        div.setAttribute("id", "_cvt_div");
        div.innerHTML = form.toSource();
        document.body.insertBefore(div, document.body.firstChild);
        setStyle();

        document.getElementById("_cvt_submit").addEventListener("click", submit, false);
    }

    function setStyle() {

        var style =
            <><![CDATA[
                #_cvt_div {
                    font-family: Arial, Helvetica, "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "MS Pゴシック", sans-serif;
                    font-size: 14px;
                    color: #000000;
                    bottom: 0pt;
                    left: 20%;
                    right: 20%;
                    z-index: 255;
                    background-color: #9ACCFF;
                    position: fixed;
                    padding: 10px;
                    margin: 0px;
                    display: block;
                    opacity: 0.75;
                }
                #_cvt_text {
                    width: 500px
                }
            ]]></>;

         GM_addStyle(style);
    }

    function submit() {

        var status = encodeURIComponent(
            "@" + cvtElement.textContent + " (" + document.location.href + ") " +
            document.getElementById("_cvt_text").value);
        var url = "http://twitter.com/statuses/update.json";

        document.getElementById("_cvt_text").value = "sending…";

        GM_xmlhttpRequest({
            method: "POST",
            url: url,
            data: "status=" + status,
            headers: {
                "Content-Type":"application/x-www-form-urlencoded",
                "X-Twitter-Client": "Comment via Twitter",
                "X-Twitter-Client-Version": "0.1"
            },
            onload: function(xhr) {
                document.getElementById("_cvt_text").value = "send";
            }
        });

    }

})();

« 前のページ次のページ »