<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>黒い猫の開発日記</title>
  <link>http://catsmew.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://catsmew.blog.shinobi.jp/RSS/" />
  <description>開発用ブログ</description>
  <lastBuildDate>Tue, 27 May 2008 05:53:29 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>Urumaでプログレスバー</title>
    <description>
    <![CDATA[時間のかかる処理を実行しているときに応答なしになっちゃうのが嫌だったのでプログレスバーを表示しよう。<br />
<br />
ってことでUrumaで進捗状況を表示するためのプログレスバーを早速トライ。<br />
<br />
public class MainAction {<br />
&nbsp;&nbsp;&nbsp; public ProgressBar progress;<br />
<br />
&nbsp;&nbsp; @EventListener(id = &quot;button&quot;)<br />
&nbsp;&nbsp;&nbsp; public void clickButton() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i = 0; i &lt; 100; i++ ){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //時間のかかる処理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.progress.setSelection(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
これでいけるだろうって思って実行したらボタンをクリックしたときの処理が短ければ（5秒～10秒？）問題なくできるんだけど、時間がかかると応答なしになってプログレスバーが動かなくなってしまいます。<br />
<br />
そこでいろいろ調べた結果やっぱりスレッドを使わないといけないらしい。<br />
<br />
スレッドなんてほとんどやってなかった（Javaを勉強し始めたころにちょこっとやっただけ）ので書き方がよくわからん＾＾；<br />
<br />
ちょうどいいのないかなーって調べたらSWTで似たようなことやってるのを発見＞＜ｂ<br />
<br />
で、真似てみた。<br />
<br />
public class MainAction {<br />
&nbsp;&nbsp;&nbsp; public ProgressBar progress;<br />
&nbsp;&nbsp;&nbsp; public&nbsp;Shell shell;<br />
<br />
&nbsp;&nbsp; @EventListener(id = &quot;button&quot;)<br />
&nbsp;&nbsp;&nbsp; public void clickButton() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i = 0; i &lt; 100; i++ ){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //時間のかかる処理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.progress.setSelection(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void OriginalThread imprements Runtime{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int index = 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( index = 0; index &lt; 100; index++ ) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//時間のかかる処理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell.getDisplay.asyncExec(new Runtime() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progress.setSelection(index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
コレで実行したらちゃんと動いたｗ<br />
<br />
まぁshell.getDisp・・・のrun()に最初時間のかかる処理書いて最初みたいに応答なしになったけどね＾＾；<br />
<br />
shell.getDisplay.asyncExec(new Runtime() {<br />
&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progress.setSelection(index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;});<br />
<br />
のprogress.setSelection(index);には時間のかかる処理は書いてはいけません。（書いてもいいけど意味ないしね）<br />]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/uruma%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%AC%E3%82%B9%E3%83%90%E3%83%BC</link>
    <pubDate>Tue, 27 May 2008 05:53:29 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/18</guid>
  </item>
    <item>
    <title>UnicodeDecodeError</title>
    <description>
    <![CDATA[Linux環境でPlone3をインストールして自作プロダクトをインストールしたらタイトルに日本語入力でエラーが発生。<br />
<br />
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 72: ordinal not in range(128)<br />
<br />
Windows環境だとエラーで無いのにorz<br />
<br />
結構いろいろ調べてみたらsitecustomize.pyを記述すればＯＫみたいなことが書いてあったので<a href="http://www.ascii.co.jp/books/books/detail/4-7561-4609-0.shtml">標準Plone</a>にも書いてある箇所（Ploneのバージョンが違うのでそれらしいところ）<br />
<br />
Plone3がインストールしてあるディレクトリ/zinstance/lib/pythonにsitecustomize.pyを記述してみたけれどコンパイル（Pythonはインタプリタだからコンパイルっておかしいか；）すらされん（＝＝）<br />
<br />
仕方ないのでpythonディレクトリがあるところに書いてみて結果<br />
<br />
Plone3がインストールしてあるディレクトリ/lib/pythonにsitecustomize.pyファイルを作成し、以下を記述<br />
<br />
sitecustomize.py<br />
<br />
import sys<br />
sys.setdefaultencoding(&quot;utf-8&quot;)<br />
<br />
でZopeを再起動してコンパイルされていることを確認して日本語入力したらうまくいった＞＜<br />]]>
    </description>
    <category>Plone3</category>
    <link>http://catsmew.blog.shinobi.jp/plone3/unicodedecodeerror</link>
    <pubDate>Thu, 01 May 2008 03:34:31 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/17</guid>
  </item>
    <item>
    <title>Plone3の画面を表示する。</title>
    <description>
    <![CDATA[とりあえずPloneの画面を表示してみる。<br />
<br />
デフォルトでPloneって名前のPlone Siteがあるので左かテーブルにあるPloneをクリック。<br />
<br />
その後上にあるviewタブをクリックするとデフォルトのトップページが表示されます。<br />
<br />
<a href="http://localhost:8080/Plone">http://localhost:8080/Plone</a>でアクセスすると左部分がない（実際に表示される）状態で表示することができます。<br />
<br />
<br />
<br />
新たにPlone Siteを作成してみる。<br />
<br />
ルート（/）でもデフォルトのPloneサイト（/Plone）でもフォルダ内でもどこでもいいので右上のプルダウンからPlone Siteを指定します。<br />
<br />
idとtitleなんかを指定してAdd Plone Siteボタンを押下すればid名 (title名)のPlone Siteができてるはずです。<br />
<br />
そしたら<a href="http://localhost:8080/id">http://localhost:8080/id</a>名でアクセスすれば表示されます（＝&omega;＝）<br />
<br />
<br />
<br />
ヘッダーの画像を変更<br />
<br />
まずは/Plone/portal_skin/plone_imageにあるlogo.gifをクリックするとヘッダー画像が表示されるのでここでcostamazeボタンを押下。<br />
<br />
すると上のパスが/Plone/portal_skin/costamazeになっていると思うので、画像を変更してボタンを押下。<br />
<br />
また<a href="http://localhost:8080/Plone">http://localhost:8080/Plone</a>にアクセスすると変更した画像にヘッダーが変わります。]]>
    </description>
    <category>Plone3</category>
    <link>http://catsmew.blog.shinobi.jp/plone3/plone3%E3%81%AE%E7%94%BB%E9%9D%A2%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%80%82</link>
    <pubDate>Wed, 23 Apr 2008 11:58:49 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/16</guid>
  </item>
    <item>
    <title>Plone3</title>
    <description>
    <![CDATA[<p>Plone3を使っての仕事をするってことで・・・。<br />
<br />
でも情報少なすぎ＞＜<br />
<br />
とりあえずインストール<br />
<br />
<a href="http://plone.org/products/plone">Plone3</a>からDLしてインストール。<br />
<br />
Windowsはインストーラーでボタンをポチポチ押していけばOK。<br />
<br />
Linuxはシェルを起動すればいいらしいです。<br />
<br />
手軽なのでインストールはここまで。<br />
<br />
<br />
<br />
Plone（Zope）の起動はPlone ControllerってのでStart Ploneを押下すれば起動します。<br />
<br />
Apachなどが入ってるとポート番号が被ってしまう場合があるのでPlone ControllerのPortsまたはPloneをインストールしたフォルダ\Data\etcにあるplone.confってのでポートを変更してください。<br />
<br />
<br />
これで起動できるはずなので<a href="http://localhost:8080/manage">http://localhost:8080/manage</a>にアクセスするとZopeの管理画面が表示されます。</p>]]>
    </description>
    <category>Plone3</category>
    <link>http://catsmew.blog.shinobi.jp/plone3/plone3</link>
    <pubDate>Wed, 23 Apr 2008 08:19:29 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/15</guid>
  </item>
    <item>
    <title>Urumaコミッタになりました。</title>
    <description>
    <![CDATA[Urumaのコミッタになりました。<br />
<br />
宿題を得て早速悪戦苦闘。<br />
<br />
宿題は実装できたけどもうちょっと書き方変えられるんじゃないってところで悩んでます。<br />
<br />
Javaの使い方を知ってるかどうかで悩んでいるんだけどね；<br />
<br />
自分で作ったものが使われるのっていいよねｗ]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/uruma%E3%82%B3%E3%83%9F%E3%83%83%E3%82%BF%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82</link>
    <pubDate>Wed, 02 Apr 2008 14:39:02 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/14</guid>
  </item>
    <item>
    <title>S2DaoでINSERT</title>
    <description>
    <![CDATA[<p>INSERT文をSQLFILEと自動SQL作成を使用して実行してみる。<br />
<br />
まずはDaoから<br />
<br />
TableDao.java<br />
<br />
package s2dao.test.dao;</p>
<p>import java.util.List;</p>
<p>import s2dao.test.dto.Tran;<br />
import s2dao.test.dto.TranDto;</p>
<p>public interface TableDao {</p>
<p>&nbsp;public static final Class BEAN = TranDto.class;</p>
<p>&nbsp;public static final String getAllColumn_SQL_FILE = &quot;s2dao/test/sql/TableDao_getAllColumn.sql&quot;;</p>
<p>&nbsp;public List&lt;TranDto&gt; getAllColumn();</p>
<p>&nbsp;public List&lt;TranDto&gt; getAllColumnAuto();</p>
<p>&nbsp;public String getAllColumnAutoId_ARGS = &quot;id&quot;;</p>
<p>&nbsp;public List&lt;TranDto&gt; getAllColumnAutoId(int id);</p>
<p>&nbsp;public int insert(TranDto tran);&nbsp;<br />
<br />
public static final String insertTran_SQL_FILE = &quot;s2dao/test/sql/TableDao_insertTran.sql&quot;;</p>
<p>&nbsp;public int insertTran(TranDto tran);<br />
}<br />
<br />
<br />
んでINSERT用のSQLファイル<br />
<br />
TableDao_insertTran.sql<br />
<br />
INSERT INTO TRAN VALUES ( /*id*/7788,/*tname*/'aaa',/*mstno*/20 )<br />
<br />
/**/で囲まれた部分に引数のプロパティ名と同じものが入ります。<br />
<br />
<strong>/*プロパティ名*/リテラル</strong>の書式<br />
<br />
<strong>/*の後ろに半角スペースを入れるとコメントになっちゃうので入れないように！！</strong><br />
<br />
リテラルはよくわからない（＝&omega;＝）<br />
<br />
まぁ適当な数値や文字列を入れれば問題なさそう。（入れなくてもうまくいったしｗ）<br />
<br />
んで最後のSqlStater.java<br />
<br />
package s2dao.test.stat;</p>
<p>import java.util.List;</p>
<p>import org.seasar.framework.container.S2Container;<br />
import org.seasar.framework.container.factory.S2ContainerFactory;</p>
<p>import s2dao.test.dao.TableDao;<br />
import s2dao.test.dto.Tran;<br />
import s2dao.test.dto.TranDto;</p>
<p>public class SqlStater {</p>
<p>&nbsp;private static final String PATH = &quot;mysql.dicon&quot;;</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;S2Container container = S2ContainerFactory.create(PATH);<br />
&nbsp;&nbsp;container.init();</p>
<p>&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;TableDao dao = (TableDao)container.getComponent(TableDao.class);</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======ALL RECODE========&quot;);<br />
&nbsp;&nbsp;&nbsp;List&lt;TranDto&gt; tableDtoList = dao.getAllColumn();</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======Auto========&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;tableDtoList = dao.getAllColumnAuto();</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======Auto ID========&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;tableDtoList = dao.getAllColumnAutoId(1);</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======Insert SQLFILE========&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;TranDto trandto = new TranDto();<br />
&nbsp;&nbsp;&nbsp;trandto.setId(7);<br />
&nbsp;&nbsp;&nbsp;trandto.setTname(&quot;TRANNAME7&quot;);<br />
&nbsp;&nbsp;&nbsp;trandto.setMstno(20);</p>
<p>&nbsp;&nbsp;&nbsp;int count1 = dao.insertTran(trandto);<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;INSERT SUCCESS COUNT : &quot; + count1 );</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======Insert AUTO========&quot;);<br />
&nbsp;&nbsp;&nbsp;trandto = new TranDto();<br />
&nbsp;&nbsp;&nbsp;trandto.setId(8);<br />
&nbsp;&nbsp;&nbsp;trandto.setTname(&quot;TRANNAME8&quot;);<br />
&nbsp;&nbsp;&nbsp;trandto.setMstno(21);</p>
<p>&nbsp;&nbsp;&nbsp;int count2 = dao.insert(trandto);<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;INSERT SUCCESS COUNT : &quot; + count2 );</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======ALL RECODE========&quot;);<br />
&nbsp;&nbsp;&nbsp;tableDtoList = dao.getAllColumnAuto();</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;container.destroy();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
<br />
これで実行すると・・・<br />
<br />
======ALL RECODE========<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
2, TRANNAME2, 20, { 20. MSTNAME1 }<br />
3, TRANNAME3, 21, { 21. MSTNAME2 }<br />
4, TRANNAME4, 21, { 21. MSTNAME2 }<br />
======Auto========<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
2, TRANNAME2, 20, { 20. MSTNAME1 }<br />
3, TRANNAME3, 21, { 21. MSTNAME2 }<br />
4, TRANNAME4, 21, { 21. MSTNAME2 }<br />
======Auto ID========<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
======Insert SQLFILE========<br />
INSERT SUCCESS COUNT : 1<br />
======Insert AUTO========<br />
INSERT SUCCESS COUNT : 1<br />
======ALL RECODE========<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
2, TRANNAME2, 20, { 20. MSTNAME1 }<br />
3, TRANNAME3, 21, { 21. MSTNAME2 }<br />
4, TRANNAME4, 21, { 21. MSTNAME2 }<br />
7, TRANNAME7, 20, { 20. MSTNAME1 }<br />
8, TRANNAME8, 21, { 21. MSTNAME2 }<br />
<br />
こんな感じに出ます。</p>]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/s2dao%E3%81%A7insert</link>
    <pubDate>Tue, 18 Mar 2008 13:14:11 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/13</guid>
  </item>
    <item>
    <title>S2Daoの自動SQL生成を使ってみる。</title>
    <description>
    <![CDATA[<p>簡単なSQLなからCRUDができるそうなのでとりあえずSELECT文を・・・。<br />
<br />
TableDao.java<br />
<br />
&nbsp;public List&lt;TranDto&gt; getAllColumnAuto();</p>
<p>&nbsp;public String getAllColumnAutoId_ARGS = &quot;id&quot;;</p>
<p>&nbsp;public List&lt;TranDto&gt; getAllColumnAutoId(int id);<br />
<br />
<br />
んで、SｑｌStater.javaに下を追加すると<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;======Auto========&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;tableDtoList = dao.getAllColumnAuto();</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println(&quot;======Auto ID========&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;tableDtoList = dao.getAllColumnAutoId(1);</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
コレで実行すると・・・<br />
<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
2, TRANNAME2, 20, { 20. MSTNAME1 }<br />
3, TRANNAME3, 21, { 21. MSTNAME2 }<br />
4, TRANNAME4, 21, { 21. MSTNAME2 }<br />
======Auto========<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
2, TRANNAME2, 20, { 20. MSTNAME1 }<br />
3, TRANNAME3, 21, { 21. MSTNAME2 }<br />
4, TRANNAME4, 21, { 21. MSTNAME2 }<br />
======Auto ID========<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
<br />
結果が出ます。<br />
<br />
<br />
現在はDtoを引数で自動SQLをやろうとしてるんだけどうまくいかなく悩み中・・・（＝_＝；）</p>]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/s2dao%E3%81%AE%E8%87%AA%E5%8B%95sql%E7%94%9F%E6%88%90%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82</link>
    <pubDate>Sun, 16 Mar 2008 14:35:21 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/12</guid>
  </item>
    <item>
    <title>UrumaでS2Daoを使用してみる。</title>
    <description>
    <![CDATA[<p>UrumaのサイトでDBアクセス用にS2Daoってのが使えるって書いてあったので普通にPreperedStatment使ってもつまらないので早速使ってみる。<br />
<br />
使用するDBはPostgreSQL8.2<br />
<br />
テーブルは<br />
<br />
CREATE TABLE TRAN ( id INTEGER, tname VARCHAR(20), mstno INTEGER );<br />
CREATE TABLE MST (mstno INTEGER, mname VARCHAR(20) );<br />
<br />
でTRANのid、MSTのmstnoをPKに設定。<br />
<br />
内容はこんな感じ？<br />
<br />
TRAN<br />
id |&nbsp;&nbsp; tname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | mstno<br />
&nbsp;1 | TRANNAME1 |&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;2 | TRANNAME2 |&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;3 | TRANNAME3 |&nbsp;&nbsp;&nbsp; 21<br />
&nbsp;4 | TRANNAME4 |&nbsp;&nbsp;&nbsp; 21<br />
<br />
MST<br />
&nbsp;mstno |&nbsp; mname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 | MSTNAME1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;21 | MSTNAME2<br />
<br />
とりあえずPostgreSQLのjarファイルをlibに配置しビルド・パスに通す。<br />
<br />
Seasarのサイトのから<a href="http://s2dao.seasar.org/ja/">S2Dao</a>をダウンロード（S2Dao1.0.47）<br />
<br />
ダウンロードしたファイルを解凍し、S2Daoのlibフォルダの中のs2-dao-1.0.47.jarと、とりあえずs2-dao-1.0.47-sources.jarをビルド・パスに通す。<br />
<br />
それと<a href="http://www.seasar.org/">Seasarのサイト</a>からS2Containerを落とし、libからgeronimo-jtr_1.1_spec-1.0.jarを取得する。<br />
<br />
これがないとClassNotFoundException javax/transaction/TransactionSynchronizationRegistryが発生してしまいました。<br />
<br />
先ほど落としたS2Daoフォルダ内にもgeronimo-j2ee_1.4_spec-1.0.jarっていう似たものがあるけどうまくいかない。<br />
<br />
j2eeって書いてあるからSeasar2.3以前だったらよかったのかな？<br />
<br />
次はdiconファイル。<br />
<br />
S2Daoのresourcesフォルダからjdbc.diconをとってくる。（Seasar2.3ではj2ee.dicon）<br />
<br />
jdbc.diconのhsqlの部分の&lt;component&gt;タグをコメントアウトしpostgreSQLの&lt;component&gt;タグをコメントを解除しDB名とユーザ名、パスワードを指定する。<br />
<br />
これでjdbc.diconの設定は完了。<br />
<br />
<br />
次はDTO<br />
<br />
TranDto.java<br />
<br />
package s2dao.test.dto;</p>
<p>public class TranDto {</p>
<p>&nbsp;public static final String TABLE = &quot;TRAN&quot;;</p>
<p>&nbsp;public static final int mstdto_RELNO = 0;<br />
<br />
&nbsp;private int id;</p>
<p>&nbsp;private String tname;</p>
<p>&nbsp;private int mstno;</p>
<p>&nbsp;private MstDto mstdto;</p>
<p>&nbsp;public TranDto() {<br />
&nbsp;}</p>
<p>&nbsp;public int getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(int id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getTname() {<br />
&nbsp;&nbsp;return tname;<br />
&nbsp;}</p>
<p>&nbsp;public void setTname(String tname) {<br />
&nbsp;&nbsp;this.tname = tname;<br />
&nbsp;}</p>
<p>&nbsp;public int getMstno() {<br />
&nbsp;&nbsp;return mstno;<br />
&nbsp;}</p>
<p>&nbsp;public void setMstno(int mstno) {<br />
&nbsp;&nbsp;this.mstno = mstno;<br />
&nbsp;}</p>
<p>&nbsp;public MstDto getMstdto() {<br />
&nbsp;&nbsp;return mstdto;<br />
&nbsp;}</p>
<p>&nbsp;public void setMstdto(MstDto mstdto) {<br />
&nbsp;&nbsp;this.mstdto = mstdto;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public boolean equals(Object obj) {<br />
&nbsp;&nbsp;if( ! ( obj instanceof TranDto ) ) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;TranDto other = (TranDto)obj;<br />
&nbsp;&nbsp;return this.getId() == other.getId();<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public int hashCode() {<br />
&nbsp;&nbsp;return this.getId();<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public String toString() {<br />
&nbsp;&nbsp;StringBuffer sb = new StringBuffer();<br />
&nbsp;&nbsp;sb.append(id).append(&quot;, &quot;);<br />
&nbsp;&nbsp;sb.append(tname).append(&quot;, &quot;);<br />
&nbsp;&nbsp;sb.append(mstno).append(&quot;, { &quot;);<br />
&nbsp;&nbsp;sb.append(mstdto).append(&quot; }&quot;);<br />
&nbsp;&nbsp;return sb.toString();<br />
&nbsp;}<br />
}<br />
<br />
<br />
クラス名とテーブル名が等しい場合は<br />
<br />
public static final String TABLE = &quot;TRAN&quot;;<br />
<br />
が必要ないらしい。<br />
<br />
public static final int mstdto_RELNO = 0;<br />
<br />
は２つ以上のテーブルを使用する場合に必要になる。<br />
<br />
今はTRANとMSTのみなので値は０だけ。<br />
<br />
もうひとつ必要な場合は０と１を指定する。<br />
<br />
テーブルのカラム名とDTOのカラム名が等しいとき以外は<br />
<br />
public static final String mstdto_RELKEYS = &quot;mstno:mstno&quot;;<br />
<br />
を記述する。<br />
<br />
&quot;多側のカラム名1：1側のカラム名1,カラム名2：1側のカラム名2,・・・&quot;<br />
<br />
で複数記述も可<br />
<br />
他にもあるけどあとはS2Daoの<a href="http://s2dao.seasar.org/ja/s2dao.html#Example">Example</a>をみてください。<br />
<br />
<br />
同じようにMstDto.java<br />
<br />
package s2dao.test.dto;</p>
<p>public class MstDto {</p>
<p>&nbsp;public static final String TABLE = &quot;MST&quot;;</p>
<p>&nbsp;private Integer mstno;</p>
<p>&nbsp;private String mname;</p>
<p>&nbsp;public MstDto(){<br />
&nbsp;}</p>
<p>&nbsp;public Integer getMstno() {<br />
&nbsp;&nbsp;return mstno;<br />
&nbsp;}</p>
<p>&nbsp;public void setMstno(Integer mstno) {<br />
&nbsp;&nbsp;this.mstno = mstno;<br />
&nbsp;}</p>
<p>&nbsp;public String getMname() {<br />
&nbsp;&nbsp;return mname;<br />
&nbsp;}</p>
<p>&nbsp;public void setMname(String mname) {<br />
&nbsp;&nbsp;this.mname = mname;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public boolean equals(Object obj) {<br />
&nbsp;&nbsp;if( ! ( obj instanceof MstDto ) ) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;MstDto other = (MstDto)obj;<br />
&nbsp;&nbsp;return this.getMstno() ==&nbsp; other.getMstno();<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public int hashCode() {<br />
&nbsp;&nbsp;return (int)mstno;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public String toString() {<br />
&nbsp;&nbsp;StringBuffer sb = new StringBuffer();<br />
&nbsp;&nbsp;sb.append(mstno).append(&quot;. &quot;);<br />
&nbsp;&nbsp;sb.append(mname);<br />
&nbsp;&nbsp;return sb.toString();<br />
&nbsp;}<br />
}<br />
<br />
<br />
次にDaoを・・・。<br />
<br />
これはインターフェースになります。<br />
<br />
package s2dao.test.dao;</p>
<p>import java.util.List;</p>
<p>import s2dao.test.dto.TranDto;</p>
<p>public interface TableDao {</p>
<p>&nbsp;public static final Class BEAN = TranDto.class;</p>
<p>&nbsp;public static final String getAllColumn_SQL_FILE = &quot;s2dao/test/sql/TableDao_getAllColumn.sql&quot;;</p>
<p>&nbsp;public List&lt;TranDto&gt; getAllColumn();<br />
}<br />
<br />
<br />
メソッド名_SQL_FILEでDaoと別の位置に配置したSQLファイルとは別に配置できる。<br />
<br />
S2DaoのExampleにはpublic List getAllColumn();で値が取得できていたけどうまくいかない。<br />
<br />
散々悩んだ挙句List&lt;TranDto&gt;にしたらうまくいった。<br />
<br />
Listだけでうまくいくのかなぁ？<br />
<br />
<br />
さて次はSQLファイルの作成。<br />
<br />
これはresourceに配置します。<br />
<br />
命名規則はDao名_メソッド名.sqlになってます。<br />
<br />
TableDao_getAllColumn.sql<br />
<br />
SELECT TRAN.*, MST.mname AS mname_0 FROM TRAN, MST WHERE TRAN.mstno = MST.mstno<br />
<br />
<br />
MST.mname AS mname_0の_0はTranDto.javaのRELNOの値を指定します。<br />
<br />
<br />
次はDaoを登録するためのdiconファイルの設定をします。<br />
<br />
mysql.dicon<br />
<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;!DOCTYPE components PUBLIC &quot;-//SEASAR//DTD S2Container//EN&quot;<br />
&quot;<a href="http://www.seasar.org/dtd/components.dtd">http://www.seasar.org/dtd/components.dtd</a>&quot;&gt;</p>
<p>&lt;components&gt;<br />
&nbsp;&lt;include path=&quot;dao.dicon&quot;/&gt;<br />
&nbsp;&lt;component class=&quot;s2dao.test.dao.TableDao&quot;&gt;<br />
&nbsp;&nbsp;&lt;aspect&gt;dao.interceptor&lt;/aspect&gt;<br />
&nbsp;&lt;/component&gt;<br />
&lt;/components&gt;<br />
<br />
<br />
最後に起動用のJava<br />
<br />
SqlStater.java<br />
<br />
package s2dao.test.stat;</p>
<p>import java.util.List;</p>
<p>import org.seasar.framework.container.S2Container;<br />
import org.seasar.framework.container.factory.S2ContainerFactory;</p>
<p>import s2dao.test.dao.TableDao;<br />
import s2dao.test.dto.TranDto;</p>
<p>public class SqlStater {</p>
<p>&nbsp;private static final String PATH = &quot;mysql.dicon&quot;;</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;S2Container container = S2ContainerFactory.create(PATH);<br />
&nbsp;&nbsp;container.init();</p>
<p>&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;TableDao dao = (TableDao)container.getComponent(TableDao.class);</p>
<p>&nbsp;&nbsp;&nbsp;List&lt;TranDto&gt; tableDtoList = dao.getAllColumn();</p>
<p>&nbsp;&nbsp;&nbsp;for( int i = 0; i &lt; tableDtoList.size(); ++i ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tableDtoList.get(i));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;container.destroy();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
<br />
<br />
これで実行すれば<br />
<br />
1, TRANNAME1, 20, { 20. MSTNAME1 }<br />
2, TRANNAME2, 20, { 20. MSTNAME1 }<br />
3, TRANNAME3, 21, { 21. MSTNAME2 }<br />
4, TRANNAME4, 21, { 21. MSTNAME2 }<br />
<br />
な結果が返ってくるはず！！</p>]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/uruma%E3%81%A7s2dao%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82</link>
    <pubDate>Sat, 15 Mar 2008 10:43:03 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/11</guid>
  </item>
    <item>
    <title>ウィンドウの操作</title>
    <description>
    <![CDATA[<p>Urumaでのウィンドウの削除、表示、非表示なんか<br />
<br />
Urumaでは画面のShellオブジェクトが自動的にshellって名前でインジェクションされるらしい。<br />
<br />
つまり各画面のアクションに<br />
<br />
public Shell shell;<br />
<br />
でShellオブジェクトができるっと。<br />
<br />
まずは画面の削除<br />
<br />
shell.close();<br />
<br />
次に画面の非表示<br />
<br />
shell.setVIsible(false);<br />
<br />
表示はtrueにするだけ。<br />
<br />
shell.setVisible(treu);<br />
<br />
<br />
コレを使えばサブウィンドウが表示されている間はメインウィンドウを表示したくないときなんかに使えます。<br />
<br />
MenuAction.java<br />
<br />
package gui.test;</p>
<p>import org.eclipse.swt.widgets.Shell;<br />
import org.seasar.framework.container.annotation.tiger.Component;<br />
import org.seasar.uruma.annotation.EventListener;<br />
import org.seasar.uruma.core.UrumaWindowManager;</p>
<p>@Component(name=&quot;menuAction&quot;)<br />
public class MenuAction {<br />
&nbsp;public Shell shell;<br />
&nbsp;public UrumaWindowManager windowManager;<br />
&nbsp;</p>
<p>&nbsp;@EventListener(id=&quot;button&quot;)<br />
&nbsp;public void button(){<br />
&nbsp;&nbsp;shell.setVisible(false);<br />
&nbsp;&nbsp;windowManager.openWindow(&quot;gui/test/subDisp.xml&quot;, true);<br />
&nbsp;&nbsp;shell.setVisible(true);<br />
&nbsp;}<br />
}<br />
<br />
<br />
subDisp.xml<br />
<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;template xmlns=&quot;<a href="http://uruma.sandbox.seasar.org">http://uruma.sandbox.seasar.org</a>&quot;&gt;<br />
&nbsp;&lt;window title=&quot;メインメニュー&quot; background=&quot;white&quot; width=&quot;800&quot; height=&quot;600&quot;&gt;<br />
&nbsp;&nbsp;&lt;gridLayout numColumns=&quot;1&quot; &gt;<br />
&nbsp;&nbsp;&nbsp;&lt;gridData horizontalAlignment=&quot;FILL&quot; widthHint=&quot;150&quot;/&gt;<br />
&nbsp;&nbsp;&lt;/gridLayout&gt;</p>
<p>&nbsp;&nbsp;&lt;text id=&quot;title&quot;/&gt;<br />
&nbsp;&nbsp;&lt;button id=&quot;button&quot; text=&quot;ボタン&quot;/&gt;<br />
&nbsp;&nbsp;&lt;button id=&quot;close&quot; text=&quot;閉じる&quot;/&gt;<br />
&nbsp;&lt;/window&gt;<br />
&lt;/template&gt;<br />
<br />
<br />
SubDispAction.java<br />
<br />
package gui.test;</p>
<p>import org.eclipse.jface.dialogs.MessageDialog;<br />
import org.eclipse.swt.graphics.Color;<br />
import org.eclipse.swt.widgets.Shell;<br />
import org.eclipse.swt.widgets.Text;<br />
import org.seasar.framework.container.annotation.tiger.Component;<br />
import org.seasar.uruma.annotation.EventListener;<br />
import org.seasar.uruma.annotation.Form;</p>
<p>@Component(name=&quot;subDispAction&quot;)<br />
@Form(SubDispForm.class)<br />
public class SubDispAction {<br />
&nbsp;public Shell shell;<br />
&nbsp;public SubDispForm subDispForm;</p>
<p>&nbsp;public Text title;</p>
<p>&nbsp;@EventListener(id=&quot;button&quot;)<br />
&nbsp;public void dispTitleValue() {<br />
&nbsp;&nbsp;title.setBackground(new Color(shell.getDisplay(), 255, 255, 80));<br />
&nbsp;&nbsp;title.setForeground(new Color(shell.getDisplay(), 255, 0, 0));<br />
&nbsp;&nbsp;MessageDialog.openInformation(shell, &quot;TitleValue&quot;, subDispForm.getTitle());<br />
&nbsp;}</p>
<p>&nbsp;@EventListener(id=&quot;close&quot;)<br />
&nbsp;public void subDispClose() {<br />
&nbsp;&nbsp;shell.close();<br />
&nbsp;}<br />
}<br />
<br />
<br />
これでサブウィンドウが表示されているときはメインメニューは非表示になって閉じるボタンが押下されるか&times;が押下されたらサブウィンドウが閉じて、メインメニューが表示されるようになります。</p>]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E6%93%8D%E4%BD%9C</link>
    <pubDate>Wed, 12 Mar 2008 14:26:12 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/10</guid>
  </item>
    <item>
    <title>テキストフィールドに背景色を付けてみる</title>
    <description>
    <![CDATA[<p>ボタンを押したら背景色が変化するようにしてみる。<br />
<br />
アクションにコンポーネントを記述する。<br />
<br />
Urumaではウィジット・インジェクションって言ってるやつ<br />
<br />
SubDispAction.java<br />
package gui.test;</p>
<p>import org.eclipse.jface.dialogs.MessageDialog;<br />
import org.eclipse.swt.graphics.Color;<br />
import org.eclipse.swt.widgets.Shell;<br />
import org.eclipse.swt.widgets.Text;<br />
import org.seasar.framework.container.annotation.tiger.Component;<br />
import org.seasar.uruma.annotation.EventListener;<br />
import org.seasar.uruma.annotation.Form;</p>
<p>@Component(name=&quot;subDispAction&quot;)<br />
@Form(SubDispForm.class)<br />
public class SubDispAction {<br />
&nbsp;public Shell shell;<br />
&nbsp;public SubDispForm subDispForm;</p>
<p>&nbsp;public Text title;</p>
<p>&nbsp;@EventListener(id=&quot;button&quot;)<br />
&nbsp;public void dispTitleValue() {<br />
&nbsp;&nbsp;title.setBackground(new Color(shell.getDisplay(), 255, 255, 80));<br />
&nbsp;&nbsp;MessageDialog.openInformation(shell, &quot;TitleValue&quot;, subDispForm.getTitle());<br />
&nbsp;}<br />
}<br />
<br />
<br />
public Text title;がコンポーネントの記述（正確には違うんだろうが・・・。）<br />
<br />
title.setBackground(Color color)で背景色を設定できる。<br />
<br />
title.setForeground(Color color)で文字の色が設定できる。<br />
<br />
<br />
<br />
<a href="http://catsmew.blog.shinobi.jp/Entry/8/">この前の記事</a>のフォームを使用しないでテキストフィールドを取得、セットする方法。<br />
<br />
public Text title;<br />
<br />
&nbsp;@EventListener(id=&quot;button&quot;)<br />
&nbsp;public void dispTitleValue() {<br />
&nbsp;&nbsp;MessageDialog.openInformation(shell, &quot;TitleValue&quot;, title.getText());<br />
&nbsp;&nbsp;title.setText(&quot;てすとだよ（＝&omega;＝）&quot;);<br />
&nbsp;}<br />
<br />
これでボタンを押下したら入力した内容がダイアログに表示されて、OKを押下すると「てすとだよ（＝&omega;＝）」がテキストフィールドにセットされる。<br />
<br />
実際フォームを使うのと使わないのどっちがいいんだろう・・・？<br />
<br />
まぁフォームは使いまわしできるからそういうときはフォームを使用したほうがいいのかな？？</p>]]>
    </description>
    <category>Uruma</category>
    <link>http://catsmew.blog.shinobi.jp/uruma/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E8%83%8C%E6%99%AF%E8%89%B2%E3%82%92%E4%BB%98%E3%81%91%E3%81%A6%E3%81%BF%E3%82%8B</link>
    <pubDate>Wed, 12 Mar 2008 14:16:40 GMT</pubDate>
    <guid isPermaLink="false">catsmew.blog.shinobi.jp://entry/9</guid>
  </item>

    </channel>
</rss>