<< 10月 2006 | Home | 12月 2006 >>
PR: 転職    葬式    マンスリーマンション 神戸    北海道    環境    FX    不動産担保融資    桐ヶ谷斎場    海外旅行    専門学校   

Tomcat 5.5.20で試す。

どうもjasperさんが怪しい。

<html>
<head>
</head>
<body>
Hello!
</body>
</html>

Tomcatに配備してJSPコンパイルすると、

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);

JSP呼んだら、即セッションが生成されてしまうな。これって仕様なんだろうか。Session Fixation対策とか、こういう実装を前提に考えないとまずいんかなぁ。それとも単にJasperの脆弱性ってことなんだろうか。

あれ?

なんかStruts2は無実のような...

2006-11-30 21:59:32.562::WARN:  Exception initializing page context
java.lang.RuntimeException: getSession() called.
        at TrapFilter$1.getSession(TrapFilter.java:23)
        at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRe
questWrapper.java:224)
        at org.apache.jasper.runtime.PageContextImpl._initialize(PageContextImpl
.java:172)
        at org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.
java:146)

罠を仕掛ける。

public class TrapFilter implements Filter {
    public void init(FilterConfig filterConfig) {}
    
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
        throws IOException, ServletException
    {
        request = new HttpServletRequestWrapper((HttpServletRequest)request) {
                public HttpSession getSession() {
                    throw new RuntimeException("getSession() called.");
                }

                public HttpSession getSession(boolean create) {
                    if (create) throw new RuntimeException("getSession(true) called.");
                    return super.getSession(create);
                }
        };
        chain.doFilter(request, response);
    }

    public void destroy() {}
}

Struts2 blank

なんかアプリではセッションなんか使ってないのに、のっけからsession idが発行されるなぁ。なんなんだこれは。

Struts2 urlタグ

urlタグを使うとリクエストパラメータを再利用できるようなので、サーバセッションを使わずにパラメータを引き継いでみる。

  <s:url id="postUrl" value="userEntry!register.action" includeParams="all"/>
  <s:form action="%{#postUrl}">

なんかうまく動かないので、生成されたHTMLを見てみると、

<form id="userEntry" name="userEntry" onsubmit="return true;" action="/sample/userEntry!register.action?user.email=ruimo%40ruimo.com&amp;user.gender=MAIL&amp;user.name=Ruimo+Uno&amp;user.ageRange=AGE40_49&amp;user.userid=ruimo" method="POST">

んー惜しい。&が二回エスケープされてますな。ソース見てみるとurlタグは、リクエストパラメータを区切るのに既に&amp;を使うようだ。で、formタグでそれをエスケープするもんだから&amp;amp;になってしまう模様。

scim-skkはいずこ?

shanai@shanai-laptop:~$ sudo apt-get install scim-skk
Password:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
Reading state information... 完了            
パッケージ scim-skk はデータベースには存在しますが、利用できません。
おそらく、そのパッケージが見つからないか、もう古くなっているか、
あるいは別のソースからのみしか利用できないという状況が考えられます
E: パッケージ scim-skk にはインストール候補がありません
shanai@shanai-laptop:~$ 

あった。

Ubuntuセットアップ

トラックポイントはnextsteeppさんとこのこの情報でうまくいった。

sudo Emacs /etc/X11/xorg.conf

で、"InputDevice"のIdentifier "Configured Mouse"を探して、以下を追加。

Option "EmulateWheel" "true"
Option "EmulateWheelButton" "2"
Option "EmulateInertia" "50"

無線LANもシステム=>システム管理=>ネットワークの管理でSSIDとWEPキーを入れるだけ。

firefoxがEmacsバインドじゃない点はSoftware/Mozillaに書いてあった方法で解決。

~/.gtkrc-2.0に以下を記述。

include "/usr/share/themes/Emacs/gtk-2.0-key/gtkrc"
gtk-key-theme-name = "Emacs"

Ubuntu 6.10

とりあえずVMWareで入れてみたら、いい感じだったんでThinkpad T42に入れてみた。

ThinkPadの特殊キー(液晶の明さとか、ボリュームとか)が効くし、ハイバーネートもサスペンドも問題無し。とりあえずトラックポイントの真ん中ボタンが効かないくらいかな(どっかに設定があるのかも)。メモリもFirefox上げた状態で150MBくらいしか使っていないし、いい感じ。

うちはIPはDHCPなんだけどDNSだけ固定で指定している。で、Ubuntuだとシステム->システム管理->ネットワーク管理で指定できるんだけど、再起動すると、なぜか192.168.0.1に戻ってしまう。

Googleさんに聞いてみたところ、ここに回避方法があった。この中のOption 2を使用して解決。

/etc/dhcp3/dhclient.confというファイルを、rootで開いて、prependという行の頭のコメント'#'を外して、DNSを設定する(複数ある時はカンマで区切る)。

prepend domain-name-servers 111.111.111.111,222.222.222.222;

って、もうこんな時間か。

猫ページ

猫ページ更新完了。

NetBeans 5.5

ちょっと出遅れて触ってみる。UMLツールはエンタープライズパックから独立したんだね。なんかlive source効かないようだけど。やり方が悪いのかな。

うっとん。

「ぼ、ぼくが乗っていては、いけませんか?」

いいけど、落ちないように気をつけてね。^^;

タワーを新調

猫タワーを新調したら、珍しいお客さんが。

Bloglines Plumber

なんか、こんなのが出た。

本日のハマり

さて、これはコンパイルエラーでしょうか?

package test;

import test.Test;   // 自分をimport

public class Test {
}
SUN JDK 1.4.2_11/1.5.0_09:

何ごともなくコンパイルされる。
IBM JDK 1.4.1:

test\Test.java:3: test.Test はコンパイル単位で定義されています。
import test.Test;
^
エラー 1 個

Eclipseってコンパイルに使用するJDKを指定できないんだろうか。実行、デバッグに使用する環境の指定は見つけたんだけど。やっぱりちゃんとAntで確認しておかないと危ないな。

卵と心筋梗塞、実は無関係だった

卵と心筋梗塞、実は無関係だった 厚労省9万人調査

しかしマーガリンの件といい、いい加減だよなぁ。今回はともかく、マーガリンの時なんて、体にいいなんて言われて食べ過ぎて心臓やられた人も多いだろうに。この手の情報って実は科学的に、きちんと検証していないものが多いんじゃないか?

電力線通信

【速報】話題の電力線通信アダプターの実力を検証!

どのくらいの距離とどくのか分からないけど、電子レンジに強ければ、店舗とかでは使えるかも。

izuオフ2

昨日はizuオフ2に行ってきた。初対面だったんで、待ち合わせ場所できょろきょろしていたのだけど。すごい背の高い人がいて、多分あの人がnekopさんだろうなー、とは思いつつも、なんか年齢層が若くて声をかけられず、結局電話してしまった。
ひがさんのお話も聞けたし、izuさんからKodo話も聞けて満足。テーブルが分かれていたので、テーブル間を移動すれば良かったな。しかし參鶏湯って、あんなにおいしいのか。今迄食べたやつって、どうも高麗人参の土くささが鼻について好きになれなかったのだけど、昨日のはとてもおいしかった。骨も脊髄のところなんか柔らかくなっていて、そのまま食べられるし。zwfkさん幹事お疲れさまでした。

Struts-2.0.2

今月末に出る模様。ベータが取れるかどうかは不明(多分取れない)。とりあえずXWorkの方がまだベータの模様。

結局Pebble-1.9のソースはみつからず。

で、Jadもデコンパイルに失敗するので、侍ズムさんとこにあった、Javascriptによる対策を入れてみる。でもaction.propertiesの変更が効かなかったので、post先は変更できず。これだとあまり効果無いかな。あとはaspectjでパッチあてるか、2.0に乗り換えるか。

うは。

久しぶりに、ちと忙しす。こんな時に限ってコメントスパム襲来。リファラチェックでも入れてみようかと思ったら、しまったPebble 1.9のソースとってなかった。2.0に上げるか、Jadでごまかすか、どうしよう。

4004

4004 Schematicって書いてあるからてっきり回路図公開かと思ったら、何これ? パターン図?

Officeのプリンタアイコン

いつもうっかり押しちゃうんだよな。そしてリモートプリンタによって、あらぬ場所に印刷物が。やばいよねーこれ。冷や汗もの。なんでダイアログ出すなり、1クッション置かないのかなぁ。業務用ソフトとしては、かなりやばい設計じゃないか?

あ、そうかツールバーからプリンタのアイコンを削除しておけばいいのか。

Java Persistence with Hibernate

結局名前はHibernate in Actionじゃなくなったのね。PDF版は$30なり。買っても読む暇なさそうなので、とりあえずパス。JCIPまだ、全然読んでないよ...

続Spring2 + Struts2

動いた。applicationContext.xmlの書き方が悪かったようだ。aop:scoped-proxyというのを使うらしい。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
  <bean id="userAction" class="user.EntryAction"
        destroy-method="terminate" scope="request">
    <aop:scoped-proxy/>
    <property name="userDao">
      <ref local="userDao"/>
    </property>
  </bean>

  <bean id="userDao" class="dao.DummyUserDao"
        init-method="init" destroy-method="terminate" scope="request">
    <aop:scoped-proxy/>
  </bean>
</beans>

みたいにすると、ちゃんとリクエストごとに、init-methodとdestroy-methodを呼んでくれる。これは楽だなぁ。JDBCのConnectionとかHibernateのSessionとかはリクエストスコープBeanにして、スレッドローカルに放り込んでおけば、リクエスト処理の終わりで自動的にクローズしてくれるわけだ。アプリケーションはリソース管理を全くしなくてokだ。ここまでやってくれるとDaoを安心してViewに渡せる。

Spring2

リクエスト、セッションスコープbeanが良さげなので、Struts2にSpring2を組み込んでみる。フィルタ登録して、

  <filter> 
    <filter-name>requestContextFilter</filter-name> 
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
  </filter> 

  <filter-mapping> 
    <filter-name>requestContextFilter</filter-name> 
    <url-pattern>/*</url-pattern>
  </filter-mapping>

applicationContext.xmlに追加。

  <bean id="userDao" class="dao.DummyUserDao"
        init-method="init" destroy-method="terminate" scope="request">
  </bean>

なんかエラーになるなぁ。なんでスレッドバウンドリクエストが見つからないんだろうか。

     [java] 致命的: Context initialization failed
     [java] org.springframework.beans.factory.BeanCreationException: Error creat
ing bean with name 'userAction' defined in ServletContext resource [/WEB-INF/app
licationContext.xml]: Cannot resolve reference to bean 'userDao' while setting b
ean property 'userDao'; nested exception is org.springframework.beans.factory.Be
anCreationException: Error creating bean with name 'userDao': Scope 'request' is
 not active; nested exception is java.lang.IllegalStateException: No thread-boun
d request: use RequestContextFilter
     [java] Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'userDao': Scope 'request' is not active; nested e
xception is java.lang.IllegalStateException: No thread-bound request: use Reques
tContextFilter

これがokなら、もうStruts2組み込みのDIはいらないので、Springに統一できそうなんだけど。

猫ページ

猫ページ更新完了。

Operaの言語設定

Accept-Languaeを変えようとして、Operaのツール=>設定=>言語をEnglishに変えたら、ツールバーとかまで英語になってしまった。ま、それはいいんだけど、その後日本語に戻しても、ツールバーは英語のまま。ん~、バグかな。

Struts 2.0.1 beta

あれ? ベータが出てる。しかし2.0.1って開発版リリースと同じリリース番号だよなぁ。中身に違いはあるんだろうか。

Struts2、ブラウザの言語設定が効かないと思ったら。

ん〜、Accept-Langua見ていないんだろうか。

勘違い。英語環境の時は、_enを見に行くのか。そういえばJSFの時にも悩んだような記憶がよみがえってきた。すっかり忘れていたよ。

ResourceBundle.getBundle("Prop", new Locale("en"));

この場合、Prop_jaとPropしかないとProp_jaが読まれる。なんでProp_jaかと言うと、Locale.getDefault()が"ja"だから。というかサーバ動作環境が日本語環境だからだ。もちろんサーバ動作環境が日本語以外ならばPropが読まれるわけだ。

Struts2のradioタグの問題。

WebWorkの方で既に報告されていた。Struts2には入るんだろうか。

シンクライアント向けLinux

NTTコムウェアがシンクライアント向けLinuxを発売

「ハード・ディスク(HDD)などにはインストールが不要で,CD-ROMまたはUSBメモリーから起動してデスクトップOSとして利用する。また,HDDにインストールすれば,PCをシンクライアント専用機として使用することも可能。」

???...謎。

すっかり冬支度

すっかり冬モードですな。

レタッチでミニチュア

catphoto.netから。レタッチでミニチュア。レタッチでも、ここまでイケるんだ。。

Struts2のradioタグ

プロパティの型がStringでないと、チェックされない(ここには書いてないけど、もちろんコンバータも必要)。例えば、

性別を表すタイプセーフenumを作っておいて、
public enum Gender {
    MAIL, FEMAIL;

    public static final Map DEFAULT_VIEW;
    static {
        Map map = new LinkedHashMap();
        map.put(MAIL, "男性");
        map.put(FEMAIL, "女性");
        DEFAULT_VIEW = Collections.unmodifiableMap(map);
    }
}
これをプロパティにするエンティティを作っておいて、
public class User {
    volatile Gender gender;
    public Gender getGender() {return gender;}
    public void setGender(Gender gender) {this.gender = gender;}
}
  <s:form action="userEntry.action">
    <s:radio label="性別" name="user.gender" list="@user.Gender@DEFAULT_VIEW"/>

みたいにしても、genderの値にかかわらず、チェックされない。調べてみたらradiomap.ftlの中で文字列で判定していた。

<#if tag.contains(parameters.nameValue, itemKeyStr)>

これだと、プロパティの型が文字列でないと、だめだね。

<#if tag.contains(parameters.nameValue, itemKey)>

としたら、正しく動作した。バグ報告する場所が見当たらないので、とりあえずMLに投げてみた。

本門寺 菊展

今年も本門寺の菊展を見に行ってきた。やっぱり今年は暖いのかな。去年は、もっと寒かったような気がする。





やっぱり、この丸いのが見ごたえがあるね。












小菊もきれい。






チューブとソフトフィルタで怪しい写真を撮って遊ぶ。








OGNLとEL

OGNLでは、#{}という表記で、その場にMapが生成できる。

    <s:select label="年齢" name="ageRange"
              list="#{0:'10歳未満', 1:'10代', 2:'20代', 3:'30代', 4:'40代', 5:'50代', 6:'60歳以上'}"/>

でも、これはJSP 2.1からのDefferred式(何て訳すんだ? 遅延評価式?)と、もろにぶつかる。Jettyだと、こんなエラーが出る。

/createAccount.jsp(11,4) PWC6038: "#{0:'10???', 1:'10?', 2:'20?', 3:'30?', 4:'40?', 5:'50?', 6:'60???'}" contains invalid expression(s): javax.el.ELException: Error Parsing: #{0:'10???', 1:'10?', 2:'20?', 3:'30?', 4:'40?', 5:'50?', 6:'60???'}

#の前に\を入れてエスケープしてみると、

     [java] tag 'select', field 'list', name 'ageRange': The requested list key
'\#{0:'10歳未満', 1:'10代', 2:'20代', 3:'30代', 4:'40代', 5:'50代', 6:'60歳以上'
}' could not be resolved as a collection/array/map/enumeration/iterator type. 

\も含めてOGNLエンジンに渡されてしまう。OGNLはJSP 2.1より前から作成されたものだし、JSP 2.1の開発チームはOGNLなんて知ったことじゃなかろうし。困ったもんだ。

Vistaライセンス。

とりあえず一件落着か。しかしまぁ結論はともかく、お互いに、いい教訓になったということか。

しょぱん

なんでChopinじゃないのかと思ったら、チョコレートのchoと器のpanをつなげて、作曲家のChopinと語呂合わせをしたということらしい。

JSR308

これはなかなか良さそう。変更不可配列は悲願かも。配列インターフェースって結構安易に使われるけど、そのくせ防御的コピーしてなくてトラブルの元になったりするし(全員が一流プログラマだと前提できる特殊プロジェクトなら、それもアリだろうけど、普通はメンバが入れ替わっていくから、実際には、あり得ない)。

メソッドに副作用が無いと宣言できるものも、便利かも。確かGCCでも関数をconst宣言すると、同じ関数を同一引数で複数回呼び出すコードを最適化してくれたよね。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8