エビちゃんスタイル

先週の微音祭は天気が悪かったこともあり,栗先生に見られたらがっかりされそうなコーデだったのですが,今日は誰に会っても期待 (?) を裏切らないコーデではなかったかと (笑).
なんたってハラコのブルゾン,かなーり妖しいです♪

プロデューサーズ・フェスタ 2006

行ってきました.
2 週連続,通算 8 回目となる生友里ちゃん体験!!!!
先日,蛯原友里ちゃんが「時の人」なるものに選ばれたというニュースがありましたが,その表彰があったのです.


イベント自体は 13:00 からだったのですが,友里ちゃんが登場する「ザ・ヒットメーカー 2006」は 17:00 からということで,何時から出かけるか結構迷いました.
指定席ではなさそうなので,前の方で見るにはイベント開始前から行った方がいいに違いない.
しかし,友里ちゃん以外に興味はない.
結局,朝 07:00 くらいに睡魔に負けて寝てしまったので,かなり遅めで 16:00 くらいに会場に着きました.
それがちょうど前のコーナーが終わったところで,多くの人が席を立って配られていた飲み物を取りに行ったりしてたので,幸いとばかりに前の方へ突撃.
空席を探したところ,4 列目中央通路脇の席を確保!!!!
いやぁ,イベントが始まってから 3 時間も経過していたのにこんな前の方の席を苦もなくゲットできるとは.
これって日頃の行いって奴ですか?
ステージにはすでに「ザ・ヒットメーカー 2006」で表彰される 4 人分のスツールが置かれていたのですが,そこまで推定 10m 弱.
先週の 30m から大幅に前進!!
とはいっても,かつての 2〜3m からは大幅に後退ですが,これはもうしょうがない.


実は会場に着くまでこれがなんのイベントか知らなかったのですが,どうやらプロデューサーのプロデューサーによるプロデューサーのためのイベントだったらしい.

(社)日本映画テレビプロデューサー協会が主催するテレビドラマや映画製作の第一線で活躍するプロデューサーたちによる、年に一度のビッグなイベント!
あの有名プロデューサーたちと会えて、話が聞けて、そして直接話せる!
プロデューサーと各界のトップ・クリエーターが生の言葉で語る知られざる制作現場の裏側と、映像ドラマの最先端!今年の会場は、お台場のフジテレビ!
このフェスタであなたも制作現場のリアルな雰囲気を体験できる!

そんなわけで (どんなわけで?),会場に集まっていたのはプロディーサーとか脚本家を志望している人達だったらしい.
そして 16:10 からの「出会いの広場」というコーナーは

休憩時間を利用した、参加者とセミナー講師、日本映画テレビプロデューサー協会会員との自由な交流の場です。

ということで,席に座ってるのはほんの僅か.
ほとんどの人が席の後ろの方にあるスペースで歓談してましたね.
でもでも,おいらの興味は友里ちゃんだけなので,席でうとうとしてました.


そして 17:00.
ほぼ定刻通りに「ザ・ヒットメーカー 2006」がスタート!!
このイベントは

映像文化をはじめ、各種制作、芸術活動において顕著なエンターテインメントを創り出し、世の中に提示したヒットメーカーを日本映画テレビプロデューサー協会会員約500名が投票により選出します。選出された方々を招いて、ヒットメーカー授与式と、受賞者によるパネルディスカッションを行います。

というもので,今回選出されたのは以下の方々.

映画 三谷幸喜
テレビ 大石静
出版 劇団ひとり
時の人 蛯原友里

まずはテレビ東京大江麻理子アナが司会として登場.
会場はお台場のフジテレビだったんですけどねぇ.
そして受賞者の 4 人が上に書いた順に登場.
最後に友里ちゃんもキタ―!!!!


この日の友里ちゃんは黒いレース (中は白っぽい) のワンピースにシルバーのミュール.
先週と違って,友里ちゃんの顔がちゃんと見える!!!!
耳元でピアスが揺れてるのまでバッチリ見えます.嬉しい♪
相変わらず細くて長い手脚,お人形さんのような顔,堪能しまくりです♥


し・か・も
友里ちゃんを含めた受賞者の 4 人,ステージに向かって左から上に書いた順に並んでいます.
つまり,友里ちゃんは向かって一番右.
ここがですね,おいらの席からは一切の障害 (前の席の人の頭) なく見えるのですよ.
友里ちゃんの頭からつま先まで,切れることなく全身がバッチリ見えるのです.\(^o^)/
なんという幸運♪
そんなわけで (どんなわけで?),表彰式そっちのけで友里ちゃんを凝視し続けました.


表彰の後はパネルディスカッション.
でもでも,友里ちゃんにはちょっと辛かったかも.
4 人は「ヒットメーカー」ということで選ばれたわけですが,他の 3 人が映画やドラマ・小説を「売った」人達なのに対して,友里ちゃんの場合は友里ちゃん自身が「売れた」みたいな面は否めません.
向かって左に座っている三谷さんから順にインタビューみたいなのが行われたのですが,途中で大石さんや劇団ひとりに話が振られたりするのに友里ちゃんには声がかからない.
大石さんの時も,劇団ひとりの時も同様.
司会の大江アナと三人の間だけで話が進んで,友里ちゃんは一人蚊帳の外といった感じ.
その間もおいらはひたすら友里ちゃんを凝視していたわけですが,ちょっとかわいそうな状況でした.
まぁ,友里ちゃん自身がどう感じていたかは分かりませんが.


そしてようやく友里ちゃんが話を聞かれる番.
「時の人」に選ばれた感想なんかを述べた後...

大江アナ:気も引き締まる思いじゃありませんか?
友里ちゃん:はいっ??

聞いてなかったようです.(^^;
JR 京都伊勢丹トークショーでも似たようなことがあったなぁ.
あの時は「はっ?」だったか.
ともあれ (JW),会場爆笑でした.
一応フォローしておくと,大江アナがアナウンサーにしては語尾不明瞭だったり質問が意味不明だったり同じような質問を繰り返したりで,三谷さんなんかも困ってる様子だったので,友里ちゃんがぼーっとしてたわけではないと思います.


そんなこんなでちょっと居心地が悪そうな友里ちゃんでしたが,おいらはひたすら友里ちゃんを凝視.
三谷さんも劇団ひとりもどんな顔でどんな服着てたか憶えてないくらい,ひたすら友里ちゃんだけ見てました.
しかし!!
17:50 頃,劇団ひとりが部隊に戻らなくてはいけないという事で退席.
すると三谷さんが空いた席に移るように友里ちゃんに促しちゃいました.
まぁ,向かって左から大江アナ・三谷さん・大石さん・空席・友里ちゃんという並びじゃますます友里ちゃんが孤立して見えちゃうわけですが...
さっきまで劇団ひとりがいた席,それはおいらの席の真っ正面.
おいらの席は 4 列目.
友里ちゃんとの間には 3 人の頭が.(;_;)
さっきまでなんの障害もなく友里ちゃんの全身を凝視できていたのに...
しくしくしく.
でもでも,幸い中央の通路脇だったこともあり,通路に身を乗り出してなんとか友里ちゃんを凝視し続けました.


最後の方で「ヒットを生み出すためにどんなアンテナを張ってますか?」という質問があったのですが,それに対して友里ちゃんは「海外のショーにも出たいので海外のファッション誌を読んだりしてます」ってなことを答えてました.
マジですか?
個人的には雑誌モデルとショーモデルはかなり違うカテゴリだと思っていたのでちょっと驚きでした.
TGCCanCam のイベントでランウェイを歩く機会は少なからずあるわけで,それが楽しかったのかなぁ.
ともあれ (JW),夢が叶うといいね!!


ってな感じで,18:10 くらいに終了.
約 70 分もの間,友里ちゃんを凝視することができました♪
堪能,堪能♥ これぞ目の保養♡
たっぷり癒されました♪


Seasar 2.4リリース! 今更でも恥ずかしくない、始めてみようDIプログラミング HOT deploy 編

昨日は SMART deploy 編と言いつつ,実際に試せるのは WARM/COOL だけで,HOT deploy は追加のコードが必要とだけ書いて説明を端折ってしまいました.心より恥じる.
そんなわけで (どんなわけで?),今日は昨日のサンプルを HOT deploy 対応にしてみます.


まずは実行用の Test クラスを修正します.

Test.java
package test;

import org.example.service.PrintService;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.framework.container.hotdeploy.HotdeployUtil;

public class Test {
    public static void main(String[] args) throws Exception {
        SingletonS2ContainerFactory.init();
        S2Container container = SingletonS2ContainerFactory.getContainer();

        Class.forName(PrintService.class.getName());
        for (int i = 0; i < 3; ++i) {
            HotdeployUtil.start();
            PrintService printer = (PrintService) container
                    .getComponent("printService");
            printer.print();
            HotdeployUtil.stop();
        }
    }
}

main() メソッドでコンテナを初期化している最初の 2 行は昨日と同じです.
その後の Class#forName() は後述.
for 文は HOT deploy の効果を確認するために追加しています.
そして for ループの中に加えられた HotdeployUtil#start()stop() が HOT deploy のためのおまじないです.
HOT deploy は,この start() から stop() までが一つのコンテキストとなります.
このコンテキスト内では HotdeployClassLoader がスレッドのコンテキストクラスローダーに設定され,新たなクラスはこのクラスローダーにロードされます.
このクラスローダーは HotdeployUtil#stop() で破棄されます.
次の繰り返しになると,また新たにクラスローダーが作成され,クラスも改めてロードされます.
簡単に言うと,これが HOT deploy の全てです.


Web アプリの場合は HotdeployServletFilterHotdeployUtil#start()stop() をお任せできます.
つまり,一つのリクエストが一つのコンテキストになります.


修正するファイルがもうひとつ.

s2container.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="hotdeploy.dicon"/>
</components>

warmdeploy.dicon に代えて,hotdeploy.dicon をインクルードしています.


それでは実行してみます.
その前に,Test#main() のループの中にブレークポイントを設定してください.
そしてデバッグ実行します.
ループに入ったところで止まるので,まずはゴー!! (Eclipse だと F8).
次のように出力されます.

DEBUG 2006-11-19 01:06:55,750 [main] BEGIN org.example.service.impl.PrintServiceImpl#print()
DEBUG 2006-11-19 01:06:55,750 [main] BEGIN org.example.service.impl.MessageServiceImpl#getMessage()
DEBUG 2006-11-19 01:06:55,765 [main] END org.example.service.impl.MessageServiceImpl#getMessage() : 新大陸へようこそ
新大陸へようこそ
DEBUG 2006-11-19 01:06:55,765 [main] END org.example.service.impl.PrintServiceImpl#print() : null


2 回目のループで止まっているはずなので,ここで MessageServiceImpl を修正します.
もちろん実行したまま.

MessageServiceImpl.java
package org.example.service.impl;

import org.example.service.MessageService;

public class MessageServiceImpl implements MessageService {
    public String getMessage() {
        return ("エビちゃん最高!!");
    }
}

そしてゴー (F8)!!

DEBUG 2006-11-19 01:08:49,421 [main] BEGIN org.example.service.impl.PrintServiceImpl#print()
DEBUG 2006-11-19 01:08:49,421 [main] BEGIN org.example.service.impl.MessageServiceImpl#getMessage()
DEBUG 2006-11-19 01:08:49,421 [main] END org.example.service.impl.MessageServiceImpl#getMessage() : エビちゃん最高!!
エビちゃん最高!!
DEBUG 2006-11-19 01:08:49,421 [main] END org.example.service.impl.PrintServiceImpl#print() : null

ちゃんとメッセージが変わりました.


まだ繰り返しの中で止まっているはずなので,今度は新たなクラスを追加して MessageService のインタフェースごと変えてみましょう.
次のパッケージを作成します.

  • org.example.dto

そして新たなクラス,MessageDto を作成します.

package org.example.dto;

public class MessageDto {
    private String text;

    public MessageDto(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}


MessageServiceDTO を返すように修正します.

MessageService.java
package org.example.service;

import org.example.dto.MessageDto;

public interface MessageService {
    public MessageDto getMessage();
}


実装クラスも修正します.

MessageServiceImpl.java
package org.example.service.impl;

import org.example.dto.MessageDto;
import org.example.service.MessageService;

public class MessageServiceImpl implements MessageService {
    public MessageDto getMessage() {
        return new MessageDto("大好き! ぷよぷよ!!");
    }
}


最後に MessageService を利用している PringServiceImpl を修正します.

PrintServiceImpl.java
package org.example.service.impl;

import org.example.service.MessageService;
import org.example.service.PrintService;

public class PrintServiceImpl implements PrintService {
    private MessageService messageService;

    public void setMessageService(MessageService messageService) {
        this.messageService = messageService;
    }

    public void print() {
        System.out.println(messageService.getMessage().getText());
    }
}


そしてゴー (F8)!!

DEBUG 2006-11-19 01:14:09,015 [main] BEGIN org.example.service.impl.PrintServiceImpl#print()
DEBUG 2006-11-19 01:14:09,015 [main] BEGIN org.example.service.impl.MessageServiceImpl#getMessage()
DEBUG 2006-11-19 01:14:09,015 [main] END org.example.service.impl.MessageServiceImpl#getMessage() : org.example.dto.MessageDto@c8570c
大好き! ぷよぷよ!!
DEBUG 2006-11-19 01:14:09,015 [main] END org.example.service.impl.PrintServiceImpl#print() : null

そんなわけで (どんなわけで?),実行途中でも HOT deploy できていることが確認できました♪


さて.
このサンプルでは,4 つのクラス (インタフェース 含む) が登場していました.

  • MessageService
  • MessageServiceImpl
  • PrintService
  • PrintServiceImpl

途中で追加したクラスもあります.

  • MessageDto

これらの中で,HOT deploy できないものが一つだけあります.
それは

  • PrintService

です.
なぜなら,このインタフェースは HOT deploy なコンテキストの外側にいる,Test クラスから参照されるからです.
もし HotdeployClassLoaderPrintService をロードしてしまうと,Test#main()

            PrintService printer = (PrintService) container
                    .getComponent("printService");

という部分で ClassCastException が発生します.
Test からは HotdeployClassLoader は見えないため,本来のクラスローダー (このサンプルではシステムクラスローダー) から PrintService をロードします.
しかし,S2 コンテナから返されるのは HotdeployClassLoader からロードされた PrintService (を実装したクラス) のインスタンスです.
Java では異なるクラスローダーからロードされたクラスは別のクラスとして扱われ,代入やキャストができません.
そのため ClassCastException が発生します.


このような事態を極力避けるため,HotdeployClassLoader はオリジナルのクラスローダー (このサンプルではシステムクラスローダー) にロード済みのクラスはロードしないようになっています.
ところが,Test#main() を実行する場合に PrintService がシステムクラスローダーにロードされるタイミングは,予想外に遅いです.
もし Test#main()

        Class.forName(PrintService.class.getName());

という行がないと,コンテナから返された PrintService (を実装したクラス) のインスタンスが返された後,それをフィールドに代入する直前までロードされません.
そのため,上記の Class#forName() を削除すると,コンテナから PrintService を取得する時点ではシステムクラスローダーに PrintService がロードされていないため,HotdeployClassLoader にロードされてしまいます.
その後システムクラスローダーが PrintService をロードして,めでたく ClassCastException になるという次第.
この挙動は結構悩ましいです〜.


ともあれ (JW),通常の Web アプリなどでは,HOT deploy のコンテキストの外側にいるのはフレームワーク (Teeda とか S2Struts) で,それらが HOT deploy 対象となるアプリケーションのクラスをロード/リンクすることはまずないと思います.
convention.dicon に記述するルートパッケージ配下のクラスを dicon に明示的に定義したり,ルートパッケージ配下にないクラスから直接参照したりといったことを避ければ ClassCastException に悩まされることはそれほどないと思います.
現在開発中の案件ではこれに悩まされているのは内緒だ.


そんなわけで (どんなわけで?),HOT deploy 編をお送りしました.
Seasar2.4 をダウンロードして,是非ともお試しください♪


Re: 某巨大掲示板

国産DIコンテナSeasar その7

689 :デフォルトの名無しさん :2006/11/19(日) 01:44:45
S2Dao+S2(現最新版)でHot Deployをしようとすると、getComponent()時に
「[ESSR0064]クラスXXDaoのコンストラクタが見つかりません」と出てしまいました。
インターフェースなのにクラスとして扱われているようです。
Cool Deployだとちゃんと動くのですが、Hot Deployだと特別な設定が必要なのでしょうか?
diconファイルはresources/以下にあるものをそのまま使っています。

COOL で動いているというのがちょっと気になりますが,詳細が分からないので普通に S2Dao を使うための説明をしてみるテスト.


Seasar2.4 は S2Dao に依存できないので,S2Dao 用の設定は含まれていません.
S2Dao を使えるようにするには,以下の設定が必要になります.


まずは Dao インタフェースに S2Dao のインターセプタを適用するための設定が必要です.
これは customizer.dicon で行います.
customizer.dicon の中にコンポーネント名が daoCustomizer となっている定義があるので,そこを次のように修正します.

customizer.dicon
    <component name="daoCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addCustomizer">
            <arg>defaultCustomizer</arg>
        </initMethod>
        <initMethod name="addCustomizer">
            <arg>
                <component class="org.seasar.framework.container.customizer.AspectCustomizer">
                    <property name="interceptorName">"dao.interceptor"</property>
                </component>
            </arg>
        </initMethod>
    </component>

二つめの <initMethod> が追加した部分です.


そして app.dicon (アプリケーションのルートとなる dicon) で dao.dicon をインクルードします.

app.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="dao.dicon"/>
    ・・・
</components>


これで S2Dao も動くんじゃないかと思います.
ただし,Dao のパッケージには注意してください.

  • ルートパッケージ.dao

になります.
ルートパッケージは convention.dicon に設定します.


Raptors 100 - 107 Lakers

\(^o^)/
Kobe 復調の 31 得点!!
試合間隔が空いたのがよかったようです.
そして NBA 史上最年少で 17,000 得点達成だそうです.
おめでとう!! Kobe!!


前の試合で K.Brown も復帰してたのね.
こっちもおめ!!