WSSR0015 HOT deploy対象クラス({0})が非対象クラスから参照されて通常のクラスローダにロードされています。ってどこから?

grep!grep! ソースコードの全体で(ホットデプロイパッケージ名 com.example.web)で検索して、com.example.web以外から使われている場所を見つけ出す。javaだけじゃなくてxml,jsp,properties,diconも見逃すな!

それでも見つからない場合、tomcatならソースをダウンロードしてtomcatにアタッチして、org.apache.catalina.loader.WebappClassLoader の loadClass(String name, boolean resolve) にブレイクポイントを仕掛けて条件式


name.startsWith("com.example.web")&&!name.endsWith("BeanInfo")
をつける(BeanInfo のサフィックスjsp/beanutilからよく調べられるので検出ノイズになるから)
ここで止まったら親をたどって原因っぽい場所を見つけよう。

ちなみに今回はまった原因は org.seasar.framework.util.SerializeUtil.serialize() にホットデプロイ対象クラスを含むオブジェクトを渡したからでした……

GMailの差出人表示をわかりやすくするDisplayName gmail を Google Chromeに対応

Gmailの画面で、差出人などを、差出人が決めた名前じゃなくて、自分が連絡先に登録した名前で表示するDisplayName gmailGoogle Chromeに対応しました。
http://userscripts.org/scripts/show/83927

説明はコチラ
http://d.hatena.ne.jp/nazoking/20100819/1282206917

連絡先(アドレス帳)で、人に「ヒルズのハゲ」とか「馬面」とかわかりやすい自分あだ名をつけておくと、そのように表示されます(メールを作成したときにはその名前で相手に届くので注意しましょう)。

日本人のくせにローマ字で名前書いてくる欧米野郎とか、会社名しか知らないのに名前でメール出してくる奴とかのせいで視認性が悪くなってしまうメール画面もすっきり見やすくなります。

これかなり便利だと思うんだけどあんまりユーザー数増えないなぁ……

SmartDeploy時のセッションのシリアライズでIllegalArgumentException ではまってたのが解決

なんかいつからか、 java.util.Locale とかまでシリアライズできませんって怒られてた。
マニュアルとか見ても tomcat/conf/context.xml を有効にしろとしか書かれて無くってそれはできてるっていうのに!

これが使えないとフォームをセッションに保存するのを簡単に使えない……ということで切羽詰まって調査することに。

エラーが出る辺りのtomcatソースコード

        if ((manager != null) && manager.getDistributable() &&
          !(value instanceof Serializable))
            throw new IllegalArgumentException
                (sm.getString("standardSession.setAttribute.iae", name));

pathnameとか関係ないし・・たぶんここのSerializableとHotReloadのSerializableがクラスローダーが違う的なSAStrutsではよくある話。distributableってなんだ・・と思って調べたら
http://tomcat.apache.org/tomcat-6.0-doc/config/manager.html

distributable

Set to true to ask the session manager to enforce the restrictions described in the Servlet Specification on distributable applications (primarily, this would mean that all session attributes must implement java.io.Serializable). Set to false (the default) to not enforce these restrictions.

NOTE - The value for this property is inherited automatically based on the presence or absence of the element in the web application deployment descriptor (/WEB-INF/web.xml).

oh.. にしても無理だし・・。で、結局原因は web.xml

 <distributable />

が入ってたからでした。本番環境用にセッションレプリケーションの設定をしてていて、それをそのままローカルの開発環境で使ってたんですね……

本番と開発環境でweb.xmlを切り替えるってどうやるのが一般的なんだろう。mavenとかでファイル全体を入れ替えしてしまうと差分の管理が必要になってくるし、大抵数行程度なので出来れば一つのファイル上でif文で分岐とか環境変数を読み込むような設定したい

Redmineのチケットの担当者を関係者のみに絞り込むプラグイン

Redmineのチケットの担当者選択ボックスを関係者のみに絞り込むプラグインを作りました。
https://github.com/nazoking/redmine_assign_narrowdown

Redmineチケットは主に「報告者←→実作業者」の間でやりとりされますが、担当者欄には常に全プロジェクトメンバーが表示されます。20人くらいになると選ぶ時間だけでもったいない。

このプラグインを導入すると、チケットの返信時に、担当者選択欄の横に「関係者のみ」というチェックボックスが現れます。それをチェックすると、そのページに名前の出ている人のみが表示されるようになります。たいていの場合、担当者と起票者です。他にウオッチャー、過去のコメントを付けた人などが紛れ込む場合があります。

普通のプラグインと同じように

ruby script/plugin install git://github.com/nazoking/redmine_assign_narrowdown.git

などで導入できます。ご利用ください。

シェルスクリプトでURLとXPATHを指定すると値を表示

centospythonが2.4でtailの+2とかが使えないなんて……

#!/bin/bash
URL=$1
XPATH=$2

if [ "$XPATH" == "" ]; then
  echo "XPATH 解析。引数 [URL] [XPATH]"
  exit -1
fi

XML=$(mktemp) || exit -1

curl -s $DOCUMENT > $XML
echo "cat ${XPATH}"| xmllint --shell $XML |awk '{if(n>1){print t} t=$1;n++}'
rm $XML

xpath.sh http://example.com/hudson/job/hogebuild/lastSuccessfulBuild/api/xml "//revision/revision/text()"
とかする

複数の値があると ----- みたいなので区切られるけど文中にも入ってるかも知れないね