<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Java</title><link>http://blogs.wankuma.com/kacchan6/category/1122.aspx</link><description>Java</description><managingEditor>かつのり</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>かつのり</dc:creator><title>AgitarのJUnitコード自動生成</title><link>http://blogs.wankuma.com/kacchan6/archive/2008/02/11/122624.aspx</link><pubDate>Mon, 11 Feb 2008 03:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2008/02/11/122624.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/122624.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2008/02/11/122624.aspx#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/122624.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/122624.aspx</trackback:ping><description>&lt;P&gt;Agitarというツールがあって、これはJUnitのコードを自動生成してくれたりするツールなんですが、これまたエラい高いツールだった記憶があります。しかし、いつの間にやらウェブサービス化しているみたいで、無料で扱えるみたいです。&lt;/P&gt;
&lt;P&gt;簡単に言うと、Agitarのサーバ上にアップしたクラスに対して、自動的にテストケースを作成してくれるみたいです。&lt;/P&gt;
&lt;P&gt;コードの中身を見て、より高いカバレッジでテストが必ず合格するテストケースを自動生成するので、元コードがバグっていたら、そのバグを正とするテストケースが生成されます。この辺は要注意です。&lt;/P&gt;
&lt;P&gt;詳しくはこちら。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn24/eclipseplgn24_1.html"&gt;http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn24/eclipseplgn24_1.html&lt;/A&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/122624.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>久々にデッドロック＼(＾o＾)／</title><link>http://blogs.wankuma.com/kacchan6/archive/2008/01/31/120249.aspx</link><pubDate>Thu, 31 Jan 2008 21:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2008/01/31/120249.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/120249.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2008/01/31/120249.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/120249.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/120249.aspx</trackback:ping><description>&lt;P&gt;久々にデッドロックというものをやってしまいました。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;トランザクション開始&lt;/LI&gt;
&lt;LI&gt;あるレコード更新&lt;/LI&gt;
&lt;LI&gt;外部のRESTのWEBサービス呼び出し⇒＼(＾o＾)／&lt;/LI&gt;
&lt;LI&gt;トランザクション終了&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;という処理で、WEBサービス側は、&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;呼ばれる&lt;/LI&gt;
&lt;LI&gt;こっち側のWEBサービスで対象レコード参照⇒＼(＾o＾)／&lt;/LI&gt;
&lt;LI&gt;処理完了&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;という感じで、なんつーか絵に描いたようなデッドロックを経験しました。トランザクション内での外部リソースの呼び出しは要注意ですね。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/120249.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>OpenJDKに言語機能を追加するプロジェクト</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/12/20/113820.aspx</link><pubDate>Thu, 20 Dec 2007 02:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/12/20/113820.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/113820.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/12/20/113820.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/113820.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/113820.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://www.infoq.com/jp/news/2007/12/kijaro"&gt;http://www.infoq.com/jp/news/2007/12/kijaro&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;なかなか面白い話です。JDKに言語の機能をオープンな場で追加しましょうというプロジェクトなんですが、既に何点かのドラフトが出ています。（実際に取り込まれる可能性については微妙です）&lt;/P&gt;
&lt;P&gt;&lt;A href="http://kijaro.dev.java.net/"&gt;http://kijaro.dev.java.net/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;こちらで議論されているのですが、&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;プロパティ構文&lt;/LI&gt;
&lt;LI&gt;staticメソッドの抽象化&lt;/LI&gt;
&lt;LI&gt;enumの抽象化&lt;/LI&gt;
&lt;LI&gt;メソッド、フィールドオブジェクトの参照構文&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;です。プロパティ構文というのは、.NETの世界にあるアレです。&lt;/P&gt;
&lt;P&gt;staticメソッドの抽象化は、今まで俗に言うインスタンスメソッドではなくクラスメソッドとしてインプリメンツできるようにしようという機能です。今まではstaticメソッドの抽象化ができなかったので、汎用的なファクトリクラスあたりを作りのが難しかったのですが、これがあるとファクトリクラスの設計が変わるのではないでしょうか。&lt;/P&gt;
&lt;P&gt;enumの抽象化についてはあまりよく知りません。最後のメソッド、フィールドオブジェクトの参照構文については、Javaの世界では手続きが面倒ながらもリフレクションという機能でメソッドオブジェクトを取得できていましたが、もっと簡単なJavadoc等で使われる構文を取り込んで、よくある関数ポインタのような使い方ができるようにしようというものです。クロージャとの相性が非常によさそうです。&lt;/P&gt;
&lt;P&gt;こういう議論の場があって、みんなで言語仕様について語れるのはいいですね。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/113820.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>もうJDK7用のクロージャの利用コードが出てます。</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/12/19/113611.aspx</link><pubDate>Wed, 19 Dec 2007 00:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/12/19/113611.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/113611.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/12/19/113611.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/113611.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/113611.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://javac.info/"&gt;http://javac.info/&lt;/A&gt;というサイトがあるのですが、JDK7から実装される予定のクロージャの仕様検討を行っているサイトです。&lt;/P&gt;
&lt;P&gt;JDK7からのクロージャについてはEBNFレベルではよく見ていたのですが、その構文を使った実装コードも出てきたようです。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://javac.info/jsr166z.ztar"&gt;http://javac.info/jsr166z.ztar&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;これは、JDK7から追加されるFork-Joinフレームワークにクロージャを取り入れた実装です。一部のコードを抜粋すると、&lt;/P&gt;
&lt;P&gt;public static final { long, long =&amp;gt; long } longAdder = { long x, long y =&amp;gt; x + y };&lt;/P&gt;
&lt;P&gt;public static final class &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NaturalMinReducer&amp;lt;T extends Comparable&amp;lt;? super T&amp;gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;implements { T, T =&amp;gt; T } {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NaturalMinReducer(Class&amp;lt;T&amp;gt; type) {}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public T invoke(T a, T b) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (a != null &amp;amp;&amp;amp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (b == null || a.compareTo(b) &amp;lt;= 0))? a : b;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;public static final class IntMinReducer implements { int, int =&amp;gt; int } {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; final { int, int =&amp;gt; int } comparator;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IntMinReducer({ int, int =&amp;gt; int } comparator) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.comparator = comparator;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int invoke(int a, int b) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (comparator.invoke(a, b) &amp;lt;= 0)? a : b;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;という感じです。う～ん、面白いですね。ラムダ式はかなり魅力的です。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/113611.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>BlockingQueue</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/12/16/113138.aspx</link><pubDate>Sun, 16 Dec 2007 02:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/12/16/113138.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/113138.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/12/16/113138.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/113138.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/113138.aspx</trackback:ping><description>&lt;P&gt;BlockingQueueについて書かれています。。。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://d.hatena.ne.jp/m-hiyama/20071214/1197598785"&gt;http://d.hatena.ne.jp/m-hiyama/20071214/1197598785&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;たまにはPipedInputStreamとPipedOutputStreamを思い出してあげてください・・・。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;丁度非同期で追加処理を行った結果がループできるイテレータが欲しかったので、BlockingQueueで実装してみました。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://herringroe.googlecode.com/svn/trunk/herringroe-sandbox/src/main/java/jp/herringroe/commons/util/AsyncIterable.java"&gt;http://herringroe.googlecode.com/svn/trunk/herringroe-sandbox/src/main/java/jp/herringroe/commons/util/AsyncIterable.java&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ポイントとしては非同期追加処理の終了通知を割り込みで行っている部分です。BlockingQueueは終わりという考え方がないので、いつまでも待ち続けるんですね。そのために大元のスレッドが取得の為にブロッキングしている状態に対して割り込んでやる必要があるのです。&lt;/P&gt;
&lt;P&gt;もちろん割り込まなければ実現できない問題ではありません。終了を示すオブジェクトを返してもよいです。サンプルコードを書くとこんな感じで使えます。&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA style="WIDTH: 763px; HEIGHT: 215px" rows=10 cols=83&gt;Task&amp;lt;String&amp;gt; task = new Task&amp;lt;String&amp;gt;() {
	public void process(Queue&amp;lt;String&amp;gt; queue) {
		queue.offer("aaa");
		queue.offer(null);
		queue.offer("aaa");
		queue.offer("aaa");
	}
};

for (String str : AsyncIterable.iterable(task)) {
	System.out.println(str);
}
&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;上記コードのTaskオブジェクトのprocessメソッドはAcyncIterableの中で別スレッドで動きます。結構便利ではないでしょうか。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/113138.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>Tomcatの仕様が変わってる・・・</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/11/29/110834.aspx</link><pubDate>Thu, 29 Nov 2007 02:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/11/29/110834.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/110834.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/11/29/110834.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/110834.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/110834.aspx</trackback:ping><description>&lt;P&gt;今までTomcatの5.5.23で開発していたのですが、Tomcatの5.5.25にバージョンアップしたら動かない・・・。お客さんにリビジョン違いで動作しないのは、アプリのバグです。と言い切ってしまったので調査しました。&lt;/P&gt;
&lt;P&gt;今までずっと放置されていた、&amp;lt;jsp:include&amp;gt;でファイルが存在しない場合に何もしないバグ？に対処したらしいです。リリースノートはキチンと読まないとダメですね。今までファイルが存在しない場合に何も行われない事に期待したコードだったので、これは致命的でした。&lt;/P&gt;
&lt;P&gt;Tomcatは常にコードもセットで落とすようにしているので該当箇所(org.apache.jasper.servlet.JspServlet)を見ると、やはりエラーの処理が追加されていました。%CATALINA_HOME%common/classesに5.5.23のクラスを入れると問題なく動くのですが、そもそもJSPの仕様として正しいのかを調査すると、ファイルが存在しない場合の挙動が明記されていないっぽいのです。・・・コンテナ依存かよ・・・。&lt;/P&gt;
&lt;P&gt;結局は、ひとまず5.5.23のクラスを抜き出してパッチとして5.5.25に入れる事に。そして暇を見て空っぽのインクルード対象のファイルを作成することで落ち着きそうです。&lt;/P&gt;
&lt;P&gt;いやぁ・・・たまにこういう罠があるのですね。重要なのは、&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;オープンソースならAPサーバ、フレームワーク等のコードくらいは読む&lt;/LI&gt;
&lt;LI&gt;リリースノートを読む&lt;/LI&gt;
&lt;LI&gt;公式の仕様書を読む&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;「何かよくわかんないけど、うまく動かないっす・・・やっぱオープンソースはダメっすね。」とか安易に言っちゃいけません。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/110834.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>Javaとデータベースの相性</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/11/22/109701.aspx</link><pubDate>Thu, 22 Nov 2007 00:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/11/22/109701.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/109701.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/11/22/109701.aspx#Feedback</comments><slash:comments>29</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/109701.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/109701.aspx</trackback:ping><description>&lt;P&gt;凪瀬さんのエントリに触発されました。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.wankuma.com/nagise/archive/2007/11/20/109498.aspx"&gt;http://blogs.wankuma.com/nagise/archive/2007/11/20/109498.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Javaをやっていると、データベース操作がスッキリしません。何故なのでしょうか。&lt;/P&gt;
&lt;P&gt;まずJavaは基本的にSQLの記述に向いていません。原因は文字列。ヒアドキュメントや、マルチラインストリングがサポートされていないので、気持ちの悪い文字列連結の繰り返しになります。&lt;/P&gt;
&lt;P&gt;ヒアドキュメントが使えると、&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA style="WIDTH: 245px; HEIGHT: 169px" rows=8 cols=26&gt;String sql = &amp;lt;&amp;lt;&amp;lt;SQL
    select
        *
    from
        xxxx
    where
        xxxx = ? and
        yyyy = ?
SQL;
&lt;/TEXTAREA&gt; &lt;/P&gt;
&lt;P&gt;というような感じで書けます。以下は一般的な方法です。&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA style="WIDTH: 375px; HEIGHT: 184px" rows=7 cols=39&gt;StringBuilder buf = new StringBuilder();
buf.append("select ");
buf.append("    * ");
buf.append("from ");
buf.append("    xxxx ");
buf.append("where ");
buf.append("    xxxx = ? and ");
buf.append("    yyyy = ?");

String sql = buf.toString();&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;私はSQLファイルを置いておいて、クラスからロードする手法か、StringWriterをラップしたPrintWriteのインスタンスを作ってSQLを生成します。SQL文の追加のたびに、意図的に空白を追加する必要はありません。&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA style="WIDTH: 375px; HEIGHT: 199px" rows=6 cols=39&gt;StringWriter sw = new StringWriter();
PrintWriter buf = new PrintWriter(sw);
buf.println("select");
buf.println("    *");
buf.println("from");
buf.println("    xxxx");
buf.println("where");
buf.println("    xxxx = ? and");
buf.println("    yyyy = ?");

String sql = sw.toString();&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;どちらにせよ気持ちの悪いコードです。この辺が解決できると、コード内にSQLを書くモチベーションも上がるのではないでしょうか。&lt;/P&gt;
&lt;P&gt;次のエントリでは解決法の前に、オブジェクトとレコードのマッピングについて考察してみます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/109701.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>文字判定メモ</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/10/27/104528.aspx</link><pubDate>Sat, 27 Oct 2007 14:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/10/27/104528.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/104528.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/10/27/104528.aspx#Feedback</comments><slash:comments>31</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/104528.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/104528.aspx</trackback:ping><description>&lt;P&gt;個人用メモ。&lt;/P&gt;
&lt;P&gt;携帯の絵文字が入力されたときの判定方法。3キャリアの絵文字は全てUnicodeのPrivate Use Areaとなるため、Private Use Areaであるかを判断するだけでOK。&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA style="WIDTH: 712px; HEIGHT: 128px" rows=6 cols=77&gt;String input = ....;
for(char c : input.toCharArray()){
    if(Character.UnicodeBlock.of(c) ==
            Caracter.UnicodeBlock.PRIVATE_USE_AREA){
        System.out.println("絵文字～");
    }
}&lt;/TEXTAREA&gt;&lt;/P&gt;
&lt;P&gt;厳密にはキャリアごとに絵文字の領域が違う。auとSoftbankでは一部同じ領域を利用している。Private Use Areaであれば絵文字が含まれると判定するならキャリア判別は不要。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;サロゲートペアが含まれているかの判定方法。&lt;/P&gt;
&lt;P&gt;文字列のコードポイントカウントとレングスが同一なら含まれていないと判定してもよさそう。（要検証）&lt;/P&gt;
&lt;P&gt;&lt;TEXTAREA style="WIDTH: 712px; HEIGHT: 88px" rows=4 cols=77&gt;String input = ....;
if(input.codePointCount() != input.length()){
    System.out.println("さろ☆げぇと");
}&lt;/TEXTAREA&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/104528.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>“安全”のためにTomcatを理解し、構築し、動作させる　その２</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101968.aspx</link><pubDate>Sun, 14 Oct 2007 13:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101968.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/101968.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101968.aspx#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/101968.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/101968.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101938.aspx"&gt;http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101938.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;取り合えず外向けのアプリを作るなら、これだけは必要って話をしようかなと。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;カスタムエラー画面を作成&lt;/LI&gt;
&lt;LI&gt;標準のレルムを外す&lt;/LI&gt;
&lt;LI&gt;マネージャアプリの類を外す&lt;/LI&gt;
&lt;LI&gt;サンプルアプリの類を外す&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;カスタムエラー画面を作成するのはバージョン情報を漏らさないようにするためです。特定バージョン向けの脆弱性が出た場合にも、バージョンが外部から分からなければ、速攻で攻撃対象にはなりにくいので、穴を塞ぐ時間稼ぎにはなります。&lt;/P&gt;
&lt;P&gt;Tomcatを知っている場合に初期パスワードがバレバレなので、標準のレルムを外しておいた方が無難です。当然ユーザやパスワードを変えてしまえば問題ないですが、殆どアプリを作るうえでユーザ管理なんてレルムに任せる事は少ないと思います。&lt;/P&gt;
&lt;P&gt;マネージャアプリの類はかなり危険です。パスワード間違いによるロック機能なんてないので、ブルートフォースで侵入された場合、Tomcatがrootで動いていたらサーバを捨てる事になるでしょう。rootじゃなければ、アプリを勝手に追加されたりする程度ですが、それでもかなり危険です。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/101968.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>かつのり</dc:creator><title>“安全”のためにTomcatを理解し、構築し、動作させる</title><link>http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101938.aspx</link><pubDate>Sun, 14 Oct 2007 01:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101938.aspx</guid><wfw:comment>http://blogs.wankuma.com/kacchan6/comments/101938.aspx</wfw:comment><comments>http://blogs.wankuma.com/kacchan6/archive/2007/10/14/101938.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kacchan6/comments/commentRss/101938.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kacchan6/services/trackbacks/101938.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_01/safetomcat_01_1.html"&gt;http://www.atmarkit.co.jp/fjava/rensai4/safetomcat_01/safetomcat_01_1.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;う～ん、安全の為ならまず先に「マネージャアプリ」の類とか「サンプルアプリ」の類を殺さないかい？&lt;/P&gt;
&lt;P&gt;解説ではTomcat6.0.14で書いているけど、6.0.13まではjsp-examplesに脆弱性もあるし、そのバージョンを記事を見ながらインストールする人もいると思うんだけど・・・&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kacchan6/aggbug/101938.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>