<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>Solitaire &#187; Java</title>
	<atom:link href="http://blog.redhawk.jp/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.redhawk.jp</link>
	<description>Sato Tatsuma&#039;s weblog about programming and systems.</description>
	<lastBuildDate>Thu, 29 Jul 2010 17:27:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/tag/java/feed" />
		<item>
		<title>Java: java.lang.String.split() or java.util.StoringTokenizer</title>
		<link>http://blog.redhawk.jp/archives/2765?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=java-java-lang-string-split-or-storingtokenizer</link>
		<comments>http://blog.redhawk.jp/archives/2765#comments</comments>
		<pubDate>Mon, 12 Jul 2010 08:44:12 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=2765</guid>
		<description><![CDATA[Androidのアプリを作っていて、テキストフォーマットのデータを読み込むのに、java.lang.String.split() を使っていたらやたら遅かった。 で、java.util.StringTokenizerに切り替えたら早かった。 ん～ C言語なら、strtokとか、ポインタを使っての実装になっているから早いのは分かるんだけれど、Javaの文字列分割でそんなに違いが出るとは思わなかった。 って事で、知り合いに相談してみたら、正規表現のせいじゃない？という話だった。 確かに・・・ String.split() は正規表現が使えるんだよね。 後、考えられるのはメモリの使い方かな。 StringTokenizer はnextToken() を呼び出したときに、メモリを確保して、文字列分割して返してもいいけれど、String.split() は配列を返すからそれが出来ない。 javaの道だと、StringTokenizerは推奨されていない。と書かれていたけれど、SunのJavaDocでは特にそういう記述は見られなかったから、StringTokenizerを使おうかな。 文字列関係では、apache.commons.StringUtil とか、結構使ったりするねー http://commons.apache.org/ しかし、高速化を図るならやっぱり、C++がいいいね。自分が余りJavaのライブラリを知らないだけなのかなぁ C++で組んであるプログラムを、今Javaに置き換えているんだけれど、Javaでどうやって書けば・・・ってのがたまーにある。 ifstreamが使いやすいってのもあるんだけれどね。 とりあえず、Javaで殆ど組んでしまって、高速化したいところはJNIで組むかな。 フォーマット解析なんか、JNIで組めるところだし。 ってか、今はテキストフォーマットを分かりやすいから使っているけれど、最終的にはバイナリファイルから読み込むから、あんま変わらなくなるのか～]]></description>
			<content:encoded><![CDATA[<p>Androidのアプリを作っていて、テキストフォーマットのデータを読み込むのに、java.lang.String.split() を使っていたらやたら遅かった。<br />
で、java.util.StringTokenizerに切り替えたら早かった。</p>
<p>ん～ C言語なら、strtokとか、ポインタを使っての実装になっているから早いのは分かるんだけれど、Javaの文字列分割でそんなに違いが出るとは思わなかった。<br />
って事で、知り合いに相談してみたら、正規表現のせいじゃない？という話だった。<br />
確かに・・・<br />
String.split() は正規表現が使えるんだよね。</p>
<p>後、考えられるのはメモリの使い方かな。<br />
StringTokenizer はnextToken() を呼び出したときに、メモリを確保して、文字列分割して返してもいいけれど、String.split() は配列を返すからそれが出来ない。</p>
<p>javaの道だと、StringTokenizerは推奨されていない。と書かれていたけれど、SunのJavaDocでは特にそういう記述は見られなかったから、StringTokenizerを使おうかな。</p>
<p>文字列関係では、apache.commons.StringUtil とか、結構使ったりするねー<br />
<a href="http://commons.apache.org/">http://commons.apache.org/</a></p>
<p>しかし、高速化を図るならやっぱり、C++がいいいね。自分が余りJavaのライブラリを知らないだけなのかなぁ<br />
C++で組んであるプログラムを、今Javaに置き換えているんだけれど、Javaでどうやって書けば・・・ってのがたまーにある。<br />
ifstreamが使いやすいってのもあるんだけれどね。</p>
<p>とりあえず、Javaで殆ど組んでしまって、高速化したいところはJNIで組むかな。<br />
フォーマット解析なんか、JNIで組めるところだし。</p>
<p>ってか、今はテキストフォーマットを分かりやすいから使っているけれど、最終的にはバイナリファイルから読み込むから、あんま変わらなくなるのか～</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/2765/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/2765" />
	</item>
		<item>
		<title>nginx: java: nginx + tomcat</title>
		<link>http://blog.redhawk.jp/archives/1464?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nginx-nginx-tomcat</link>
		<comments>http://blog.redhawk.jp/archives/1464#comments</comments>
		<pubDate>Tue, 08 Sep 2009 05:26:19 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1464</guid>
		<description><![CDATA[nginx（えんじんえっくす）使ってみた。 この辺りに設定例が転がっているね。 Using Nginx As Reverse-Proxy Server On High-Loaded Sites 設定例： # 動作確認していないけれどこんな感じ。 # 時間が出来たら同じ設定での動作確認しておきます。 worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; events { worker_connections 32768; use epoll; } http { include proxy.conf; include mime.types; # JavaServlet upstream tomcat{ server 192.168.1.21:8080 wight=5; server 192.168.1.22:8080 wight=5; } server { listen redhawk.jp:80 default; location /javaservlet { proxy_pass [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nginx.net/">nginx</a>（えんじんえっくす）使ってみた。</p>
<p>この辺りに設定例が転がっているね。<br />
<a href="http://kovyrin.net/2006/05/18/nginx-as-reverse-proxy/">Using Nginx As Reverse-Proxy Server On High-Loaded Sites</a></p>
<p>設定例：<br />
# 動作確認していないけれどこんな感じ。<br />
# 時間が出来たら同じ設定での動作確認しておきます。</p>
<pre>
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

events {
    worker_connections  32768;
    use epoll;
}

http {
    include proxy.conf;
    include mime.types;

    # JavaServlet
    upstream tomcat{
        server 192.168.1.21:8080 wight=5;
        server 192.168.1.22:8080 wight=5;
    }

    server {
        listen    redhawk.jp:80 default;

        location /javaservlet {
            proxy_pass http://tomcat/javaservlet;
        }
    }
}
</pre>
<p>実際使ってみたんだけれど、proxy serverとしての機能部分しか使わないので<br />
apache使うよりも負荷は軽い。</p>
<p>使い方は、tomcatを起動して<br />
その後に、locationなり、サブドメインなりで判定して、tomcatにリクエストを投げてあげるだけ。</p>
<p>プロセスに HUP を投げると、設定ファイルを再読み込みするので、再起動の必要もない。<br />
# HUPはバグがあるから多用しない方がいい。と職場の人が言っておりましたが。</p>
<p>upstream 設定を使うと、weight を設定して、ロードバランサーの機能を持たせる事も出来るので<br />
Django や、 Passenger との連携も出来るらしいので、Java, Python, Ruby を使う時には便利だと思う。</p>
<p>PHP は、まあ、どうでもいいです。<br />
fastCGIで使ってみたけれど、処理負荷が高すぎて、アクセスが本当に多いサイトだと持たない。<br />
nginxというより、PHPの問題だし。<br />
それに、fastCGI使うくらいなら、apache module で動かした方が設定も楽だしで PHP メインなら、nginx は不要かと。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1464/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1464" />
	</item>
		<item>
		<title>JPAとかSeasarとか</title>
		<link>http://blog.redhawk.jp/archives/1442?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=jpa%25e3%2581%25a8%25e3%2581%258bseasar%25e3%2581%25a8%25e3%2581%258b</link>
		<comments>http://blog.redhawk.jp/archives/1442#comments</comments>
		<pubDate>Thu, 03 Sep 2009 03:48:54 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1442</guid>
		<description><![CDATA[JPAの問題点 というブログ記事を発見。 確かに、JPAの問題点はたくさんあるよね。 でも、Spring も Hibernate もドキュメントが揃っているので、楽です。 Seasar は昔使っていたんだけれど、ドキュメントが無さ過ぎて、調べてもでてこないというのが辛かった。 MLで聞けばいいんだろうけれど、自分はそれよりも、多少扱いづらい部分があっても ドキュメントが最初からある方を選ぶかな。 そこは人それぞれだからなんとも言えないけれどね。 まあ、これから段々使いやすくなっていくでしょう。 JavaはWebシステム構築としてこれからも使うだろうし。 パフォーマンス必要ないときは、Pythonを使うけれどね（・・]]></description>
			<content:encoded><![CDATA[<p><a href="http://d.hatena.ne.jp/higayasuo/20070106/1168076355">JPAの問題点</a><br />
というブログ記事を発見。</p>
<p>確かに、JPAの問題点はたくさんあるよね。</p>
<p>でも、Spring も Hibernate もドキュメントが揃っているので、楽です。<br />
Seasar は昔使っていたんだけれど、ドキュメントが無さ過ぎて、調べてもでてこないというのが辛かった。</p>
<p>MLで聞けばいいんだろうけれど、自分はそれよりも、多少扱いづらい部分があっても<br />
ドキュメントが最初からある方を選ぶかな。</p>
<p>そこは人それぞれだからなんとも言えないけれどね。</p>
<p>まあ、これから段々使いやすくなっていくでしょう。<br />
JavaはWebシステム構築としてこれからも使うだろうし。</p>
<p>パフォーマンス必要ないときは、Pythonを使うけれどね（・・</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1442/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1442" />
	</item>
		<item>
		<title>Java: Struts2: SessionToken 二重送信防止機能</title>
		<link>http://blog.redhawk.jp/archives/1435?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=java-struts2-sessiontoken-%25e4%25ba%258c%25e9%2587%258d%25e9%2580%2581%25e4%25bf%25a1%25e9%2598%25b2%25e6%25ad%25a2%25e6%25a9%259f%25e8%2583%25bd</link>
		<comments>http://blog.redhawk.jp/archives/1435#comments</comments>
		<pubDate>Tue, 01 Sep 2009 08:29:25 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsp]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1435</guid>
		<description><![CDATA[Struts2 には二重送信防止機能も付いている。 トークンを発行してセッションに保存した後、一度だけそのトークンでのActionの実行を許可する。という内容。 tokenとtokenSessionの二つがあって、tokenSessionの方は、二重送信後にも一度目の送信結果画面を表示してくれる。 今のところ、tokenSessionしか使っていないので、そっちの設定例を。 struts.xml &#60;?xml version="1.0" encoding="UTF-8" ?&#62; &#60;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&#62; &#60;struts&#62; &#60;constant name="struts.objectFactory" value="spring" /&#62; &#60;constant name="struts.devMode" value="false" /&#62; &#60;package name="mypackage" extends="struts-default"&#62; &#60;interceptors&#62; &#60;interceptor-stack name="myStack"&#62; &#60;interceptor-ref name="tokenSession"&#62; &#60;param name="includeMethods"&#62;add&#60;/param&#62; &#60;/interceptor-ref&#62; &#60;interceptor-ref name="defaultStack" /&#62; &#60;/interceptor-stack&#62; &#60;/interceptors&#62; &#60;default-interceptor-ref name="myStack" /&#62; &#60;action name="act" class="Action"&#62; &#60;result name="invalid.token" type="redirectAction"&#62;/hoge&#60;/result&#62; &#60;/action&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Struts2 には二重送信防止機能も付いている。<br />
トークンを発行してセッションに保存した後、一度だけそのトークンでのActionの実行を許可する。という内容。</p>
<p>tokenとtokenSessionの二つがあって、tokenSessionの方は、二重送信後にも一度目の送信結果画面を表示してくれる。<br />
今のところ、tokenSessionしか使っていないので、そっちの設定例を。</p>
<p>struts.xml</p>
<pre class="brush:xml">
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;
&lt;struts&gt;
  &lt;constant name="struts.objectFactory" value="spring" /&gt;
  &lt;constant name="struts.devMode" value="false" /&gt;

  &lt;package name="mypackage" extends="struts-default"&gt;
    &lt;interceptors&gt;
      &lt;interceptor-stack name="myStack"&gt;
        &lt;interceptor-ref name="tokenSession"&gt;
          &lt;param name="includeMethods"&gt;add&lt;/param&gt;
        &lt;/interceptor-ref&gt;
        &lt;interceptor-ref name="defaultStack" /&gt;
      &lt;/interceptor-stack&gt;
    &lt;/interceptors&gt;
    &lt;default-interceptor-ref name="myStack" /&gt;
    &lt;action name="act" class="Action"&gt;
      &lt;result name="invalid.token" type="redirectAction"&gt;/hoge&lt;/result&gt;
    &lt;/action&gt;
  &lt;/package&gt;
&lt;/struts&gt;
</pre>
<p>JSP側</p>
<pre class="brush:xhtml">
&lt;s:form action="user_add"&gt;
　&lt;s:token/&gt;
　　　：
&lt;/s:form&gt;
</pre>
<p>Action単位でも設定できるので、詳しくはこちらを。<br />
<a href="http://d.hatena.ne.jp/nikkei225f/20080101/1199081575">TokenInterceptorの使い方</a><br />
<a href="http://d.hatena.ne.jp/nikkei225f/20080102/1199105836">Token Session Store Interceptorの使い方</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1435/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1435" />
	</item>
		<item>
		<title>Java: JPA: specified twice エラー</title>
		<link>http://blog.redhawk.jp/archives/1423?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=java-jpa-specified-twice-%25e3%2582%25a8%25e3%2583%25a9%25e3%2583%25bc</link>
		<comments>http://blog.redhawk.jp/archives/1423#comments</comments>
		<pubDate>Mon, 31 Aug 2009 07:58:34 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[HIBERNATE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1423</guid>
		<description><![CDATA[JPAで @OneToOne @JoinColumn を使って、JOINを張ったら、そのモデルを使って INSERT文を走らせる時に、specified twice っていうエラーが出るようになった。 SQLを見てみると、確かに同じColumnを二回指定している。 http://72.5.124.55/javaee/5/docs/api/javax/persistence/JoinColumn.html ここを見ると、 @JoinColumn(insertable = false) というのがあるので、それを指定したら解決。 updatable public abstract boolean updatable (Optional) Whether the column is included in SQL UPDATE statements generated by the persistence provider. Default: true ってあるように、Modelの中身を更新すると、勝手に UPDATE文が走るので、それが嫌な人は false にしておこう。 このオプションは @Column にもあるので、別にJOIN限定の処理ではない。 JPAはアノテーションをモデルにいくつくっつけるかの設定次第だなぁ Djangoも結局、キーワード引数でいくつオプション付けるか。 っていう部分は当然あるし。 まあ、そうなるよなーって思う。 そう思うから、Annotation で Model いじればなんとかなるんじゃね？って思って調べるきっかけになるし。 JPAでこれだけ色々やれるってなると、本気のHIBERNATEを使ってみたくなるなぁ どんだけ凄いんだろう。]]></description>
			<content:encoded><![CDATA[<p>JPAで<br />
@OneToOne<br />
@JoinColumn<br />
を使って、JOINを張ったら、そのモデルを使って INSERT文を走らせる時に、specified twice っていうエラーが出るようになった。<br />
SQLを見てみると、確かに同じColumnを二回指定している。</p>
<p><a href="http://72.5.124.55/javaee/5/docs/api/javax/persistence/JoinColumn.html">http://72.5.124.55/javaee/5/docs/api/javax/persistence/JoinColumn.html</a></p>
<p>ここを見ると、<br />
@JoinColumn(insertable = false)<br />
というのがあるので、それを指定したら解決。</p>
<p>updatable</p>
<p>public abstract boolean updatable<br />
(Optional) Whether the column is included in SQL UPDATE statements generated by the persistence provider.<br />
Default:<br />
true</p>
<p>ってあるように、Modelの中身を更新すると、勝手に UPDATE文が走るので、それが嫌な人は false にしておこう。</p>
<p>このオプションは<br />
@Column<br />
にもあるので、別にJOIN限定の処理ではない。</p>
<p>JPAはアノテーションをモデルにいくつくっつけるかの設定次第だなぁ</p>
<p>Djangoも結局、キーワード引数でいくつオプション付けるか。<br />
っていう部分は当然あるし。<br />
まあ、そうなるよなーって思う。<br />
そう思うから、Annotation で Model いじればなんとかなるんじゃね？って思って調べるきっかけになるし。</p>
<p>JPAでこれだけ色々やれるってなると、本気のHIBERNATEを使ってみたくなるなぁ<br />
どんだけ凄いんだろう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1423/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1423" />
	</item>
		<item>
		<title>Java: JPA: JPA でリレーション</title>
		<link>http://blog.redhawk.jp/archives/1407?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=java-jpa-jpa-%25e3%2581%25a7%25e3%2583%25aa%25e3%2583%25ac%25e3%2583%25bc%25e3%2582%25b7%25e3%2583%25a7%25e3%2583%25b3</link>
		<comments>http://blog.redhawk.jp/archives/1407#comments</comments>
		<pubDate>Fri, 28 Aug 2009 11:08:13 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1407</guid>
		<description><![CDATA[最近のJavaは、LLに対応してか、LLで簡単に出来る事を、Javaも簡単に出来る様になってきている。 Javaの方が早いので、自分の仕事の場合、Javaを使う機会が多い。 という訳で、JPAでリレーションってどうやるんだろ。と調べてみたら、JPA + Oracle の記事があった。しかも、結構古いしｗ JPAの試用 ん～ Djangoとかとやる事は一緒だなぁ Model 部分で関連付け登録をしてあげて、後はお任せ！ ってやつですな。 はまるポイントが一箇所あって JPAの規約では、外部キーは、REG_ID の様に、大文字_IDと変換されます。 CREATE TABLE category ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) UNIQUE, PRIMARY KEY(id) ) ENGINE=MyISAM ; CREATE TABLE book ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, book_category_id INT UNSIGNED NOT NULL, name VARCHAR(255), PRIMARY KEY(id) ) ENGINE=MyISAM ; [...]]]></description>
			<content:encoded><![CDATA[<p>最近のJavaは、LLに対応してか、LLで簡単に出来る事を、Javaも簡単に出来る様になってきている。<br />
Javaの方が早いので、自分の仕事の場合、Javaを使う機会が多い。<br />
という訳で、JPAでリレーションってどうやるんだろ。と調べてみたら、JPA + Oracle の記事があった。しかも、結構古いしｗ</p>
<p><a href="http://www.oracle.com/technology/global/jp/pub/articles/gupta-jpa.html">JPAの試用</a></p>
<p>ん～ Djangoとかとやる事は一緒だなぁ<br />
Model 部分で関連付け登録をしてあげて、後はお任せ！<br />
ってやつですな。</p>
<p>はまるポイントが一箇所あって<br />
JPAの規約では、外部キーは、REG_ID の様に、大文字_IDと変換されます。</p>
<pre class="brush:sql">
CREATE TABLE category
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) UNIQUE,
  PRIMARY KEY(id)
)
ENGINE=MyISAM
;

CREATE TABLE book
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  book_category_id INT UNSIGNED NOT NULL,
  name VARCHAR(255),
  PRIMARY KEY(id)
)
ENGINE=MyISAM
;
</pre>
<p>というテーブルがあった場合</p>
<pre class="brush:java">
@Entity
@Table(name = "book_category")
public class BookCategory {

	@Id
	@GeneratedValue
	@OneToOne(mappedBy = "book_category")
	private Integer id;

	private String name;

}

@Entity
@Table(name = "book")
public class Book{

	@Id
	@GeneratedValue
	private Integer id;

	@Column(name = "book_category_id")
	private Integer bookCategoryId;

	@OneToOne
	@JoinColumn(name = "BOOK_CATEGORY_ID")
	private BookCategory bookCategory;
}
</pre>
<p>こんな感じになる。<br />
# Getter, Setterとか、テーブル定義とかは省略。</p>
<p>ログを追ってみると、どうにもSQLを二回発行しているっぽい。<br />
InnoDBで作ると違う結果かもしれないし、MyISAMの場合、二回SELECTしてもそれほど遅くないのでいいかな。<br />
それが気になるなら、O/R Mapper使うなーって思うし。</p>
<p>JPAのQueryの書き方とかちょっとキモイけれど、慣れればそんなものかなーって思わなくもないかも。<br />
まだ余り使い込んでいないので、無駄に変な取得の仕方をしている部分があるだろうけれど・・・</p>
<p>とりあえず、必ずListでしか取れないってのはおかしいと思うんだよね。<br />
何か方法があるはず・・・</p>
<p>count取る時は、Longできちんと取れているし・・・<br />
まあ、まだまだ慣れていないからなー</p>
<p>Struts2 + Spring + JPA で作業しているけれど、結構使いやすいとは思う。<br />
struts.xml が凄い量になってきているけれど。<br />
まあ、そんなものかなぁ・・・と思わないでもない。<br />
パフォーマンスも気にならないので、暫くこれで様子を見てみよう。<br />
LL使うのに比べたら、ちょっと変な処理入っていても早いからなぁ～</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1407/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1407" />
	</item>
		<item>
		<title>Struts2: Java: interceptor でハマったよ</title>
		<link>http://blog.redhawk.jp/archives/1383?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=struts2-java-interceptor-%25e3%2582%2592%25e4%25bd%259c%25e3%2582%258b</link>
		<comments>http://blog.redhawk.jp/archives/1383#comments</comments>
		<pubDate>Thu, 27 Aug 2009 09:04:17 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1383</guid>
		<description><![CDATA[Struts2 でアプリを作っていて、Interceptor を使おうとしたら、めちゃはまった・・・ public class AuthenticationInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation invocation) throws Exception { Map&#60;String, Object&#62; session = ActionContext.getContext().getSession(); Boolean auth = (Boolean)session.get(AuthenticationAction.AUTH_KEY); if (null == auth &#124;&#124; !auth.booleanValue()) { return "auth-error"; } else { // 次のインターセプター処理 return invocation.invoke(); } } } というのが正解のソースコード。 じゃあ、何がダメなやつはどこがおかしかったのかと言うと この [...]]]></description>
			<content:encoded><![CDATA[<p>Struts2 でアプリを作っていて、Interceptor を使おうとしたら、めちゃはまった・・・</p>
<pre class="brush:java">
public class AuthenticationInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map&lt;String, Object&gt; session = ActionContext.getContext().getSession();
		Boolean auth = (Boolean)session.get(AuthenticationAction.AUTH_KEY);
		if (null == auth || !auth.booleanValue()) {
			return "auth-error";
		} else {
			// 次のインターセプター処理
			return invocation.invoke();
		}
	}

}
</pre>
<p>というのが正解のソースコード。</p>
<p>じゃあ、何がダメなやつはどこがおかしかったのかと言うと<br />
この Interceptor 独自の戻り値を struts.xml で定義した、global-results の値にマッチングさせたい時<br />
次のインターセプター処理を呼び出してはいけない！！<br />
って事ですな・・・</p>
<p>インターセプターが戻り値を持っている時点でもっと早く気がつけよ。って気がしないでもないです。はい。</p>
<p>ちなみに、 struts.xml はこんな感じ。</p>
<pre class="brush:xml">
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <constant name="struts.devMode" value="false" />
<package name="admin" extends="struts-default">
    <interceptors>
      <interceptor name="authentication" class="AuthenticationInterceptor" />
      <interceptor-stack name="authenticationStack">
        <interceptor-ref name="authentication" />
        <interceptor-ref name="defaultStack" />
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="authenticationStack" />
    <default-action-ref name="index" />
    <global-results>
      <result name="auth-error" type="redirectAction">auth/login</result>
    </global-results>
    <action name="index" class="AdminAction" method="index">
      <result>/WEB-INF/pages/admin/index.jsp</result>
      <result name="auth-error" type="redirectAction">auth/login</result>
    </action>
  </package>
<package name="auth" extends="struts-default">
    <action name="login" class="AuthenticationAction" method="login">
      <result type="redirectAction">admin/index</result>
      <result name="error">/WEB-INF/pages/auth/login.jsp</result>
    </action>
  </package>
</struts>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1383/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1383" />
	</item>
		<item>
		<title>JavaでShift_JISの漢字コードチェック（第一水準、第二水準）</title>
		<link>http://blog.redhawk.jp/archives/526?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=java%25e3%2581%25a7shift_jis%25e3%2581%25ae%25e6%25bc%25a2%25e5%25ad%2597%25e3%2582%25b3%25e3%2583%25bc%25e3%2583%2589%25e3%2583%2581%25e3%2582%25a7%25e3%2583%2583%25e3%2582%25af%25ef%25bc%2588%25e7%25ac%25ac%25e4%25b8%2580%25e6%25b0%25b4%25e6%25ba%2596%25e3%2580%2581%25e7%25ac%25ac%25e4%25ba%258c%25e6%25b0%25b4</link>
		<comments>http://blog.redhawk.jp/archives/526#comments</comments>
		<pubDate>Wed, 08 Oct 2008 16:12:11 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Shift_JIS]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=526</guid>
		<description><![CDATA[Javaで、Shift_JISの漢字コードをチェックしてくれ。とかいう話があって、えー　面倒くせぇ・・・ とか思いつつも、自分なりのライブラリがあったほうが将来的に便利だな。と思ったので作成。 JUnitでTestCase作ってはいるんだけれど、これ、全部の文字テストするのは時間がかかるので、ちまちまとアップデートしていきます。 今のところ、チェック数が少ないのでバグがあるかもしれないです。 環境は、Java6.0だけれど、バージョン依存しそうなのは特に使ってないかなぁ コードはこちら。 CharacterUtil CharacterUtilTest あー　今度Python使って、漢字一覧表を &#8216;漢&#8217;, &#8216;字&#8217;, フォーマットに変換して、テストケース作るかなぁ 手動で書くなんてありえない！！ｗ それと、Javaだと確か、EndianはBig-Endianに揃えてくれるんだよね？ って事で調べた。 http://java.sun.com/javase/ja/6/docs/ja/api/java/nio/ByteBuffer.html ほんで、更に調べたら、Java1.4から実装されたライブラリでnativeなendianを調べるAPIがあるらしい。 http://java.sun.com/javase/ja/6/docs/ja/api/java/nio/ByteOrder.html ま、とりあえず、今回自分が作ったライブラリの場合、Big-Endian前提だけれど、問題ないということで。 あ～　今日は、DirectXで遊ぼうと思ったのになぁ・・・何でJavaやってんだろｗ == 追記 == JavaでShift_JISの漢字コードチェック（第一水準、第二水準） その後 で、コード修正。]]></description>
			<content:encoded><![CDATA[<p>Javaで、Shift_JISの漢字コードをチェックしてくれ。とかいう話があって、えー　面倒くせぇ・・・<br />
とか思いつつも、自分なりのライブラリがあったほうが将来的に便利だな。と思ったので作成。<br />
JUnitでTestCase作ってはいるんだけれど、これ、全部の文字テストするのは時間がかかるので、ちまちまとアップデートしていきます。<br />
今のところ、チェック数が少ないのでバグがあるかもしれないです。<br />
環境は、Java6.0だけれど、バージョン依存しそうなのは特に使ってないかなぁ<br />
コードはこちら。</p>
<p><a href='http://blog.redhawk.jp/wp-content/uploads/2008/10/CharacterUtil.java'>CharacterUtil</a><br />
<a href='http://blog.redhawk.jp/wp-content/uploads/2008/10/CharacterUtilTest.java'>CharacterUtilTest</a></p>
<p>あー　今度Python使って、漢字一覧表を &#8216;漢&#8217;, &#8216;字&#8217;, フォーマットに変換して、テストケース作るかなぁ<br />
手動で書くなんてありえない！！ｗ<br />
それと、Javaだと確か、EndianはBig-Endianに揃えてくれるんだよね？<br />
って事で調べた。<br />
<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/nio/ByteBuffer.html">http://java.sun.com/javase/ja/6/docs/ja/api/java/nio/ByteBuffer.html</a><br />
ほんで、更に調べたら、Java1.4から実装されたライブラリでnativeなendianを調べるAPIがあるらしい。<br />
<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/nio/ByteOrder.html">http://java.sun.com/javase/ja/6/docs/ja/api/java/nio/ByteOrder.html</a><br />
ま、とりあえず、今回自分が作ったライブラリの場合、Big-Endian前提だけれど、問題ないということで。<br />
あ～　今日は、DirectXで遊ぼうと思ったのになぁ・・・何でJavaやってんだろｗ<br />
== 追記 ==<br />
<a href="http://blog.redhawk.jp/archives/533">JavaでShift_JISの漢字コードチェック（第一水準、第二水準） その後</a><br />
で、コード修正。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/526/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/526" />
	</item>
		<item>
		<title>配列のリテラルはどう書く？</title>
		<link>http://blog.redhawk.jp/archives/488?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e9%2585%258d%25e5%2588%2597%25e3%2581%25ae%25e3%2583%25aa%25e3%2583%2586%25e3%2583%25a9%25e3%2583%25ab%25e3%2581%25af%25e3%2581%25a9%25e3%2581%2586%25e6%259b%25b8%25e3%2581%258f%25ef%25bc%259f</link>
		<comments>http://blog.redhawk.jp/archives/488#comments</comments>
		<pubDate>Wed, 10 Sep 2008 09:15:05 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C言語]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=488</guid>
		<description><![CDATA[久しぶりにプログラミングネタ。 まあ、大した内容でもないんだけれどさ。 配列のリテラル(literal)を書くときって、なるべく最後の要素の後ろにも ,（カンマ）を付ける様な癖が付いていたりする。 なぜかというと、配列の要素は後で増やす事がありえるし、その時に ,（カンマ）を入れ忘れてしまう事が多いからだ。 そんなのは、コンパイルすれば直ぐにエラーが出て気がつく事だけれど、動的な言語だったりすると、その部分が処理されるまで分からない潜在的なバグに繋がる。 コンパイル言語にしても、コード量が増えてくると一回のコンパイルに凄い時間がかかるし、当たり前にコード記述でそういうエラーやバグの元は排除するべきだと思う。 って、一々くどい前置きがあるのは、自分の配列の書き方にこの間けちを付けられたからだｗ そういえば、if文の書き方もおかしいとか言われた事があるな。ま、それは違うエントリーにするか。あれ、前に書いたか・・・？ C言語でも書ける。gcc4.3でコンパイルエラーは出なかった。 int a[] = {1, 2, 3, 4, }; Javaでも書ける。JavaSE6.0でコンパイルエラーは出なかった。 int[] a = {1, 2, 3, 4, }; 大抵の言語はこの記述を許可しているんだよね。 ただ、JavaScriptでJQueryのAJaxAPIでこの書き方をしたら、IEで構文エラーが出たことがあるね。 一番最後に要素を追加する時の、ミスを無くすための小さな対策でした。 というか、この書き方をしていて突っ込まれたの初めてだな。 今まで一度も見たこと無かったのかな・・・？]]></description>
			<content:encoded><![CDATA[<p>久しぶりにプログラミングネタ。<br />
まあ、大した内容でもないんだけれどさ。<br />
配列のリテラル(literal)を書くときって、なるべく最後の要素の後ろにも ,（カンマ）を付ける様な癖が付いていたりする。<br />
なぜかというと、配列の要素は後で増やす事がありえるし、その時に ,（カンマ）を入れ忘れてしまう事が多いからだ。<br />
そんなのは、コンパイルすれば直ぐにエラーが出て気がつく事だけれど、動的な言語だったりすると、その部分が処理されるまで分からない潜在的なバグに繋がる。<br />
コンパイル言語にしても、コード量が増えてくると一回のコンパイルに凄い時間がかかるし、当たり前にコード記述でそういうエラーやバグの元は排除するべきだと思う。<br />
って、一々くどい前置きがあるのは、自分の配列の書き方にこの間けちを付けられたからだｗ<br />
そういえば、if文の書き方もおかしいとか言われた事があるな。ま、それは違うエントリーにするか。あれ、前に書いたか・・・？<br />
C言語でも書ける。gcc4.3でコンパイルエラーは出なかった。</p>
<div class="highlight">
<pre><span style="color: #008000">int</span> a<span style="color: #666666">[]</span> <span style="color: #666666">=</span> {<span style="color: #666666">1</span>, <span style="color: #666666">2</span>, <span style="color: #666666">3</span>, <span style="color: #666666">4</span>, };
</pre>
</div>
<p>Javaでも書ける。JavaSE6.0でコンパイルエラーは出なかった。</p>
<div class="highlight">
<pre><span style="color: #B00040">int</span><span style="color: #666666">[]</span> a <span style="color: #666666">=</span> <span style="color: #666666">{1,</span> <span style="color: #666666">2,</span> <span style="color: #666666">3,</span> <span style="color: #666666">4,</span> <span style="color: #666666">};</span>
</pre>
</div>
<p>大抵の言語はこの記述を許可しているんだよね。<br />
ただ、JavaScriptでJQueryのAJaxAPIでこの書き方をしたら、IEで構文エラーが出たことがあるね。<br />
一番最後に要素を追加する時の、ミスを無くすための小さな対策でした。<br />
というか、この書き方をしていて突っ込まれたの初めてだな。<br />
今まで一度も見たこと無かったのかな・・・？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/488/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/488" />
	</item>
		<item>
		<title>SAStruts + Velocity</title>
		<link>http://blog.redhawk.jp/archives/362?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sastruts-velocity</link>
		<comments>http://blog.redhawk.jp/archives/362#comments</comments>
		<pubDate>Tue, 10 Jun 2008 15:50:00 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[SAStruts]]></category>
		<category><![CDATA[Seasar]]></category>
		<category><![CDATA[Struts]]></category>
		<category><![CDATA[Super Agile Struts]]></category>
		<category><![CDATA[Velocity]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=362</guid>
		<description><![CDATA[Seasar2 Project の SAStruts(Super Agile Struts)を使ってみようかな。と思ったんだけれど 自分は、JSPが嫌いなので、Velocityを使えないかな？とちょっと調べてみました。 脱線するけれど、なぜにJSPが嫌いかというと、他のテンプレーターと構文がまったく違うからです。 JSPを覚えても、他のテンプレーターに応用が利かないし、TemplateToolkit, Djangoやってました。という人にテンプレートを見てもらっても、まったくその経験を活かせないからです。 さて、そんな訳で、ちょっと調べてみたところ参考にするべきサイトが二つほどありました。 VelocityTools &#8211; VelocityStruts SAStruts + Velocity (1) wikiはこちら。 wiki: SAStruts サンプルソースはこちら。 http://redhawk.jp/viewvc/sandbox/java/seasar/trunk/SAStrutsDemo/ 他にも色々SAStrutsとVelocityを使う事で便利な事ができたりするので、時間が空いたらレビューとサンプルソースを載せていきたいと思います。 オープンソースのフレームワークを使っているので、こうやって世の中にフィードバックしていけるといいんですけれどね。 同じ使い形をする人はたくさん出てくるだろうし、そういった時に不具合が出たら、情報の共有は武器になりますよ。]]></description>
			<content:encoded><![CDATA[<p>Seasar2 Project の SAStruts(Super Agile Struts)を使ってみようかな。と思ったんだけれど<br />
自分は、JSPが嫌いなので、Velocityを使えないかな？とちょっと調べてみました。<br />
脱線するけれど、なぜにJSPが嫌いかというと、他のテンプレーターと構文がまったく違うからです。<br />
JSPを覚えても、他のテンプレーターに応用が利かないし、TemplateToolkit, Djangoやってました。という人にテンプレートを見てもらっても、まったくその経験を活かせないからです。<br />
さて、そんな訳で、ちょっと調べてみたところ参考にするべきサイトが二つほどありました。<br />
<a href="http://velocity.apache.org/tools/devel/struts.html">VelocityTools &#8211; VelocityStruts</a><br />
<a href="http://d.hatena.ne.jp/i-takehiro/20080422/1208861516">SAStruts + Velocity (1)</a><br />
wikiはこちら。<br />
<a href="http://redhawk.jp/dokuwiki/doku.php?id=java:seasar:sastruts">wiki: SAStruts</a><br />
サンプルソースはこちら。<br />
<a href="http://redhawk.jp/viewvc/sandbox/java/seasar/trunk/SAStrutsDemo/">http://redhawk.jp/viewvc/sandbox/java/seasar/trunk/SAStrutsDemo/</a><br />
他にも色々SAStrutsとVelocityを使う事で便利な事ができたりするので、時間が空いたらレビューとサンプルソースを載せていきたいと思います。<br />
オープンソースのフレームワークを使っているので、こうやって世の中にフィードバックしていけるといいんですけれどね。<br />
同じ使い形をする人はたくさん出てくるだろうし、そういった時に不具合が出たら、情報の共有は武器になりますよ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/362/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/362" />
	</item>
	</channel>
</rss>
