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 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&user.gender=MAIL&user.name=Ruimo+Uno&user.ageRange=AGE40_49&user.userid=ruimo" method="POST">
んー惜しい。&が二回エスケープされてますな。ソース見てみるとurlタグは、リクエストパラメータを区切るのに既に&を使うようだ。で、formタグでそれをエスケープするもんだから&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;
って、もうこんな時間か。
本日のハマり
さて、これはコンパイルエラーでしょうか?
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で確認しておかないと危ないな。
卵と心筋梗塞、実は無関係だった
しかしマーガリンの件といい、いい加減だよなぁ。今回はともかく、マーガリンの時なんて、体にいいなんて言われて食べ過ぎて心臓やられた人も多いだろうに。この手の情報って実は科学的に、きちんと検証していないものが多いんじゃないか?
izuオフ2
昨日はizuオフ2に行ってきた。初対面だったんで、待ち合わせ場所できょろきょろしていたのだけど。すごい背の高い人がいて、多分あの人がnekopさんだろうなー、とは思いつつも、なんか年齢層が若くて声をかけられず、結局電話してしまった。
ひがさんのお話も聞けたし、izuさんからKodo話も聞けて満足。テーブルが分かれていたので、テーブル間を移動すれば良かったな。しかし參鶏湯って、あんなにおいしいのか。今迄食べたやつって、どうも高麗人参の土くささが鼻について好きになれなかったのだけど、昨日のはとてもおいしかった。骨も脊髄のところなんか柔らかくなっていて、そのまま食べられるし。zwfkさん幹事お疲れさまでした。
結局Pebble-1.9のソースはみつからず。
で、Jadもデコンパイルに失敗するので、侍ズムさんとこにあった、Javascriptによる対策を入れてみる。でもaction.propertiesの変更が効かなかったので、post先は変更できず。これだとあまり効果無いかな。あとはaspectjでパッチあてるか、2.0に乗り換えるか。
うは。
久しぶりに、ちと忙しす。こんな時に限ってコメントスパム襲来。リファラチェックでも入れてみようかと思ったら、しまったPebble 1.9のソースとってなかった。2.0に上げるか、Jadでごまかすか、どうしよう。
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に変えたら、ツールバーとかまで英語になってしまった。ま、それはいいんだけど、その後日本語に戻しても、ツールバーは英語のまま。ん~、バグかな。
Struts2、ブラウザの言語設定が効かないと思ったら。
ん〜、Accept-Langua見ていないんだろうか。
勘違い。英語環境の時は、_enを見に行くのか。そういえばJSFの時にも悩んだような記憶がよみがえってきた。すっかり忘れていたよ。
ResourceBundle.getBundle("Prop", new Locale("en"));
この場合、Prop_jaとPropしかないとProp_jaが読まれる。なんでProp_jaかと言うと、Locale.getDefault()が"ja"だから。というかサーバ動作環境が日本語環境だからだ。もちろんサーバ動作環境が日本語以外ならばPropが読まれるわけだ。
シンクライアント向けLinux
「ハード・ディスク(HDD)などにはインストールが不要で,CD-ROMまたはUSBメモリーから起動してデスクトップOSとして利用する。また,HDDにインストールすれば,PCをシンクライアント専用機として使用することも可能。」
???...謎。
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に投げてみた。
本門寺 菊展
今年も本門寺の菊展を見に行ってきた。やっぱり今年は暖いのかな。去年は、もっと寒かったような気がする。


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






小菊もきれい。



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




29.8%のWindowsXPユーザーがVistaではなくLinuxへの移行を考えている
ネタ元。
「といってもただの一般ユーザーではなく、技術に詳しいユーザーに限った結果です。さすがに一般のユーザーがLinuxに大挙してお引っ越しするにはまだ時期尚早なので……。」
どうなのかなぁ。むしろ逆な気もするんだよね。自分の場合、World Of Warcraftとか、Smartvisionとか、SilkypixとかWinに縛られざるを得ないソフトがゴロゴロしているんで、完全移行は無理だし、何よりxkeymacsというキラーアプリ(笑)があるから、むしろ操作性はWindowsの方に満足していたり(皮肉な話だけど)。
でも実家の両親のPCだと、Webとメールが使えて、プリンタとデジカメ用のメモリカードが読めればokなんで、実はLinuxで、特に不便ではないんじゃないかという気もする。Walmart PCみたいなプリロードLinuxが出たら、意外とライトユーザは移行できちゃうんじゃないだろうか。
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なんて知ったことじゃなかろうし。困ったもんだ。







