水曜日 3 21, 2007

文字連結

すでにご存知の方が多いでしょうし、何をいまさらって感じだとおもいますが、
Javaでの文字列(String)の連結の性能について、
以前、ちょこっとテストをやったので結果をのっけたいとおもいます。

1. +演算子を使うケース
2. String.concat()をつかうケース 
3. StringBuffer.append()を使うケース

 の3パターンを計測してみました。
計測方法は、4byteの文字列 "fuga" を30000回連結しまくるだけのプログラムで
実行時間を比べるだけのシンプルなものです。
FullGCは起きないようheapの調整は実施しましたが、
+演算子、String.concat()では、YoungGCは避けられませんでした。
蛇足ですが、jreのバージョンは、以下のとおりです。

。。。。。
$ java -version java version "1.6.0" v1.5.8f. Copyright 2001 Pavel Kouznetsov. Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Client VM (build 1.6.0-b105, mixed mode, sharing)
上記、verion表記は clientですが、-client, -serverの両方で計測は実施しました。 結果は以下のとおりです。
ケースWrap Time:Client VMWrap Time: Server VM
1 +演算子 21641 ms 14078 ms
2 String.concat() 5890 ms 4200 ms
3 StringBuffer.append() 16 ms 31 ms
当たり前の結果ですみません。 テストプログラムやテストデータ生成以外で そうそう無茶な回数の連結を行う必要はないかもしれないですが、 もしご入用の際には StringBuffer ですね。やっぱり。。。。 。。。。。。 。。。。。。 これで終っては申し訳ないので、、、、 jad って ByteCode から逆Compile してみます。  +演算子で記述したメソッドが以下に変換されました。   s = (new StringBuilder()).append(s).append("fuga").toString();  new してます。30000回もループしたらきついですね。やっぱり。  このへんでゆるしてください。

金曜日 3 16, 2007

google webmaster tool

遅ればせながら
google webmaster tool を使ってみました。

僕の管理してるサイトは、今のところそれほど高い頻度でクロールされているわけではなく、
今のところ更新頻度が比較的高いサイトなんですが、
3日~7日に1回くらいクロールしてもらうくらいで、
最新のクロールの日付も現在のところ 2007/03/08 です。
sitemap.xmlの登録もやったんですが、なかなか見にきてはくれません。

まだopenして1ヶ月程度なので まだこなれていないのか、
webmaster toolから見ても、<「現在、データを表示できません。」が多くて、
満喫するには至っておりませんが、それでもいくつか面白い点があったので書いてみます。

「クエリに関する情報」では、どういうキーワードで自分のサイトに来てくれてるかが見れますが、
これは今のところ想定内のキーワードしか見えないのと、ログ解析 Webalizer からもこれは見れるので、
それほど特徴的な感じはしませんでした。

「ページ分析」では、共通する単語っていうコーナーのサイトのコンテンツには、
特にサイトを作るときに意図していなかったキーワードが上位にきていたり、
外部からのサイトへのリンク は、どういう言葉で外から自分のサイトにリンクが張られてるかが見えて、
ちょっとおもしろいです。
ログ解析のReferrersではリンク元のURLはわかるんですが、どういうアンカーで張られてるかは見えないので、
どんな風な文言でリンクされてるかが見れるのは興味深いです。

引き続き使っていくので、面白いことがあったら、また書きたいとおもいます。

水曜日 3 14, 2007

java.lang.ClassNotFoundException: org.apache.naming.factory.MailSessionFactor

最近、ちょこっと困ったことです。
tomcat 5.5.20 にて、struts 上のフォームから、
javamail を送信するプログラムを書いていたんですが、
tomcatの Resourceから javax.mail.Sessionを取得するときにExceptionが発生してしまいました。

javax.naming.NamingException: Could not create resource factory instance
 [Root exception is java.lang.ClassNotFoundException: org.apache.naming.factory.MailSessionFactory]
 at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:132)
 at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
 ....
 at javax.naming.InitialContext.lookup(InitialContext.java:392)
 ...

ほいでもって、MailSessionFactory が無いっていうので、
バグかなあ と 5.5.23 (最新)に入れ替えましたが、、、、ダメでした。
まさかとおもうけど、無いっていってるから無いのかと、、、、

jar tvf $CATALINA_HOME/common/lib/naming-factory.jar  |grep -i fact 
     0 Mon Mar 05 08:25:08 JST 2007 org/apache/naming/factory/
  6001 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/BeanFactory.class
  1122 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/Constants.class
  2938 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/EjbFactory.class
  1804 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/OpenEjbFactory.class
  2458 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/ResourceEnvFactory.class
  3213 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/ResourceFactory.class
  1650 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/ResourceLinkFactory.class
  2458 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/factory/TransactionFactory.class
  1520 Mon Mar 05 08:25:06 JST 2007 org/apache/naming/java/javaURLContextFactory.class

やっぱ無い。
じゃあ、足せばいいのかと、、、
googleにて、検索したら、、、そのまんまのがご本山にありました。。。。。。
 http://issues.apache.org/bugzilla/show_bug.cgi?id=40668 

もうバグ登録されてるし、ネタにもなんないけど、まあせっかくなので、
 Patch for missing libraries from Tomcat 5.5.20 distibution 
から zip ファイルダウンロードして、
naming-factory.jar を作業ディレクトリにて jar xvf で展開、
おんなじとこに zipを展開
 jar cMvf $CATALINA_HOME/common/lib/naming-factory.jar .
で試してみたら、ちゃんとできました。

あー、オチがない。ごめんなさい。

水曜日 12 29, 2004

AppFuse

一回書いてからしばらく放置してしまいました。。。。 あっという間に年の瀬で、個人的に恒例の戎神社へ初詣のことなぞ考えてみたりしてました。 主題を決めて書くほどのこともなかったので、最近Javaな感じのことに時間を割いてるので、 それから書いてみようかと。 ここのとこ、AppFuse 1.6.1 と格闘してみたりしてましたが、 そうこうしている間にAppFuse 1.7 がreleaseされていました。(T-T)  http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse DBにOracle/jdk 1.5.0 でフレームワーク自体は元気に稼動中。 このまま冬休みに突入して瞬く間に忘れてしまいそうだから、時間ができたらTipsとかを書いてみるのもいいかも。 appgenで生成したりしたので、SQLはほとんど書かずに一通りのデータアクセスができて、 画面まで生成してくれちゃったりして、なんだか書いてるとJava書いてるような風味がないです。 いきあたりばったりで、DAO書いちゃったり、ActionServletにテキトーにmethod追加してるので、 今ひとつうまみを感じられてませんが、、、、、、、びう の部分はかなり簡単でいいかも。 DAOのまわりは、Oracleのチューニングなぞを仕事ですることが多いので、 ついついてっとりばやい方向、「PreparedStatement に直接 SQLで書く」をしたくなって、 hibernateのうまみも引き出せてないみたいです、、、、微妙なジレンマがちょっと。 でも、せっかくやってるので、もう少しがんばってみようかと。。

金曜日 12 10, 2004

starting point ..NullPointerException:

/* 
 * now debugging my notion....
 */
try{
    Person ryoya = humanbeings.oneOf(WORLD_POPULATION);
    SunBlogger sb_ryoya = (SunBlogger)ryoya;
    sb_ryoya.init();
    Blog blog = sb_ryoya.writeBlog(12/10/2004);
    blog.read();
}catch(NullPointerException ne){
   System.err.println("I'm sorry for my blog is null.");
}catch(NonSenseException nse){
System.err.println("I'm sorry for nonsense. " + nse ); }catch(Exception e){ e.printStackTrace(); }