<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1669625400637572127</id><updated>2011-11-14T03:31:53.604+09:00</updated><category term='GAE'/><category term='Mirage'/><category term='Scala'/><category term='JavaScript'/><category term='Amateras'/><category term='Seasar'/><category term='Java'/><category term='Click'/><category term='Eclipse'/><title type='text'>Human System</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>54</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1113228357471347621</id><published>2011-11-03T18:11:00.001+09:00</published><updated>2011-11-04T10:36:12.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>Simple HTTP Client for Scala</title><content type='html'>&lt;p&gt;
I'm writing a &lt;a href="https://bitbucket.org/takezoe/scala-utils/src/01436694bc12/src/main/scala/jp/sf/amateras/scala/util/http/SimpleHttpClient.scala"&gt;Simple HTTP Client for Scala&lt;/a&gt;. This is a simple example of GET request:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
using (new SimpleHttpClient()){ client =&gt;
  val content: Option[String] = client.get(
    url = "http://localhost:8080/"
  )
  content match {
    case Some(s) =&gt; println(s)
    case None =&gt; println("Request Failed.")
  }
}
&lt;/pre&gt;
&lt;p&gt;
You can give request parameters to get() method. And it's possible to send POST request to use post() method instead of get() method. The second example shows how to give request parameters with the POST request:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
using (new SimpleHttpClient()){ client =&gt;
  val content: Option[String] = client.post(
    url = "http://localhost:8080/",
    params = Map("q" -&gt; "Scala"),
    encode = "UTF-8"
  )
  ...
}
&lt;/pre&gt;
&lt;p&gt;
In default SimpleHttpClient returns the response body as Option[String]. You can handle the response to give the your own response handler. The response handler has to be a function has a signature (HttpResponse  =&gt; T).
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
using (new SimpleHttpClient()){ client =&gt;
  val content: Array[Byte] = client.post(
    url = "http://localhost:8080/",
    handler = { r: HttpResponse =&gt;
      r.getStatusLine.getStatusCode match {
        case HttpStatus.SC_OK =&gt; 
          EntityUtils.toByteArray(r.getEntity())
        case _ =&gt; 
          throw new RuntimeException("Request Failed.")
      }
    }
  )
  ...
}
&lt;/pre&gt;
&lt;p&gt;
SimpleHttpClient also supports http proxy. You can give proxy settings to the constructor.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
using(new SimpleHttpClient(
    "proxy.example.com:8080")){ client =&gt;
  ...
}
&lt;/pre&gt;
&lt;p&gt;
I'm making useful utilities like this HTTP Client for development of general Scala based applications at &lt;a href="https://bitbucket.org/takezoe/scala-utils/overview"&gt;scala-utils&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1113228357471347621?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1113228357471347621/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1113228357471347621' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1113228357471347621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1113228357471347621'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/11/simple-http-client-for-scala.html' title='Simple HTTP Client for Scala'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-8402050836868710328</id><published>2011-10-31T11:09:00.001+09:00</published><updated>2011-10-31T11:10:15.758+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>xsbt-scalate-precompile-plugin 1.6</title><content type='html'>&lt;p&gt;
&lt;a href="https://github.com/zentrope/xsbt-scalate-precompile-plugin"&gt;xsbt-scalate-precompile-plugin&lt;/a&gt; is a sbt plug-in which makes precompilation &lt;a href="http://scalate.fusesource.org/"&gt;Scalate&lt;/a&gt; templates in the sbt build process (Scalate is a template engine for Scala). 
&lt;/p&gt;
&lt;p&gt;
However xsbt-scalate-precompile-plugin 1.5 had one serious problem which does not process templates in the nested directory. For example, it could't handle the layout template (which have to be placed into WEB-INF/scalate/layouts) correctly.
&lt;/p&gt;
&lt;p&gt;
I made a &lt;a href="https://gist.github.com/1316239"&gt;patch&lt;/a&gt; to fix this problem and &lt;a href="https://github.com/zentrope/xsbt-scalate-precompile-plugin/issues/4"&gt;send it&lt;/a&gt;. It's &lt;a href="https://github.com/zentrope/xsbt-scalate-precompile-plugin/commit/49baba8147906f34154c50bec4d7a204e0b440c9"&gt;taken&lt;/a&gt; in xsbt-scalate-precompile-plugin 1.6.
&lt;/p&gt;
&lt;p&gt;
The fixed version of xsbt-scalate-precompile-plugin 1.6 is already available! Now it can process templates in the nested directory correctly.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-8402050836868710328?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/8402050836868710328/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=8402050836868710328' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8402050836868710328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8402050836868710328'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/10/xsbt-scalate-precompile-plugin-16.html' title='xsbt-scalate-precompile-plugin 1.6'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1103427580598941777</id><published>2011-09-23T02:41:00.000+09:00</published><updated>2011-09-23T12:33:29.709+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Introduction of CookieSessionFilter</title><content type='html'>&lt;p&gt;
&lt;strong&gt;CookieSessionFilter&lt;/strong&gt; is a servlet filter which stores session data into the client cookie for Java based web applications. 
&lt;/p&gt;
&lt;p&gt;
In using CookieSessionFilter, session replication becomes unnecessary for multiplexing of application servers. You'll be able to make and manage multiplexing environment more easily.
&lt;/p&gt;
&lt;p&gt;
It provides HttpSession interface. So any modification in your application is not necessary. Probably, you'll be able to use it with not so large cost.
&lt;/p&gt;
&lt;p&gt;
See details about CookieSessionFilter at:&lt;br&gt;
&lt;a href="http://amateras.sourceforge.jp/site/cookie-session-filter/usage.html"&gt;http://amateras.sourceforge.jp/site/cookie-session-filter/usage.html&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1103427580598941777?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1103427580598941777/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1103427580598941777' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1103427580598941777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1103427580598941777'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/09/introduction-of-cookiesessionfilter.html' title='Introduction of CookieSessionFilter'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7265846863349949589</id><published>2011-08-20T16:04:00.006+09:00</published><updated>2011-08-21T01:10:39.258+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>eclipse-scala-tools 0.0.2 is now available!</title><content type='html'>&lt;p&gt;
eclipse-scala-tools provides some small Eclipse plug-ins for Scala. It supplements ScalaIDE for Eclipse. The current version of eclipse-scala-tools provides features that support SBT.
&lt;p&gt;
&lt;p&gt;
See details about eclipse-scala-tools at the following URL:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://bitbucket.org/takezoe/eclipse-scala-tools/wiki/Home"&gt;https://bitbucket.org/takezoe/eclipse-scala-tools/wiki/Home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
New features in eclipse-scala-tools 0.0.2: 
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;SBT 0.10 Support&lt;/li&gt;
  &lt;li&gt;Proxy Settings&lt;/li&gt;
  &lt;li&gt;SBT Console (SBT &gt; Open SBT Shell)&lt;/li&gt;
  &lt;li&gt;Built-In SBT Runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-GMdPC3ICYpo/Tk9edpMCwUI/AAAAAAAAADg/D3BeBEH6ZrU/s1600/sbt_context_menu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 131px;" src="http://2.bp.blogspot.com/-GMdPC3ICYpo/Tk9edpMCwUI/AAAAAAAAADg/D3BeBEH6ZrU/s320/sbt_context_menu.png" border="0" alt="Context menu of the SBT project" id="BLOGGER_PHOTO_ID_5642832721484104002" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-WnnpmC97-oQ/Tk9elX61OXI/AAAAAAAAADo/W_zU1fG2BNE/s1600/project_property.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 248px;" src="http://4.bp.blogspot.com/-WnnpmC97-oQ/Tk9elX61OXI/AAAAAAAAADo/W_zU1fG2BNE/s320/project_property.png" border="0" alt="Project property page of the SBT project" id="BLOGGER_PHOTO_ID_5642832854287464818" /&gt;&lt;/a&gt;
&lt;p&gt;
I hope it helps your Scala development!
&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7265846863349949589?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7265846863349949589/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7265846863349949589' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7265846863349949589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7265846863349949589'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/08/eclipse-scala-tools-002-is-now.html' title='eclipse-scala-tools 0.0.2 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-GMdPC3ICYpo/Tk9edpMCwUI/AAAAAAAAADg/D3BeBEH6ZrU/s72-c/sbt_context_menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-5767851041000235908</id><published>2011-08-13T16:12:00.001+09:00</published><updated>2011-08-13T16:12:52.390+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amateras'/><title type='text'>AmaterasUML 1.3.3 is now available!</title><content type='html'>Project Amateras released AmaterasERD 1.3.3 at 13 August 2011.
&lt;p&gt;
  New features in this release:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Improvement of constructor in the class diagram&lt;/li&gt;
  &lt;li&gt;Improvement of Java generics support&lt;/li&gt;
  &lt;li&gt;Quick Filter ("Show only Public" and "Show All")&lt;/li&gt;
  &lt;li&gt;Refresh the class diagram from Java source&lt;/li&gt;
  &lt;li&gt;Copy the diagram as image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  See details about AmaterasUML at:&lt;br&gt;
  &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML"&gt;http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  See details about new features in AmaterasUML 1.3.3 at:&lt;br&gt;
  &lt;a href="http://sourceforge.jp/projects/amateras/wiki/AmaterasUML_1_3_3"&gt;http://sourceforge.jp/projects/amateras/wiki/AmaterasUML_1_3_3&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  Download AmaterasUML 1.3.3 from:&lt;br&gt;
  &lt;a href="http://sourceforge.jp/projects/amateras/downloads/52922/AmaterasUML_1.3.3.zip/"&gt;http://sourceforge.jp/projects/amateras/downloads/52922/AmaterasUML_1.3.3.zip/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  Enjoy your development!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-5767851041000235908?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/5767851041000235908/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=5767851041000235908' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5767851041000235908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5767851041000235908'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/08/amaterasuml-133-is-now-available.html' title='AmaterasUML 1.3.3 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1647446621573020365</id><published>2011-08-12T15:41:00.008+09:00</published><updated>2011-08-12T22:01:27.649+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Eclipse Plug-in for SBT</title><content type='html'>Today, I released eclipse-scala-tools 0.0.1. 
&lt;p&gt;
&lt;a href="https://bitbucket.org/takezoe/eclipse-scala-tools/wiki/Home"&gt;eclipse-scala-tools&lt;/a&gt; is some small Eclipse plug-ins for Scala. It supplements &lt;a href="http://www.scala-ide.org/"&gt;ScalaIDE for Eclipse&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In the initial release of eclipse-scala-tools provides SBT 0.7.x support on Eclipse.
&lt;/p&gt;
&lt;p&gt;
You can create a SBT project using wizard.
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-8uHZ_u1h9XU/TkTN0bf2dbI/AAAAAAAAAC0/a65Q1pmNgio/s1600/20110812151526.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 196px;" src="http://2.bp.blogspot.com/-8uHZ_u1h9XU/TkTN0bf2dbI/AAAAAAAAAC0/a65Q1pmNgio/s320/20110812151526.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5639858933992945074" /&gt;&lt;/a&gt;
&lt;p&gt;
Run SBT command from the context menu of the project. You can also migrate existing SBT projects by 'Migrate SBT Project to Eclipse'.
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-0V-ErhmluIE/TkTN_ehC25I/AAAAAAAAAC8/w9uvmmY5fcY/s1600/20110812150021.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 140px;" src="http://2.bp.blogspot.com/-0V-ErhmluIE/TkTN_ehC25I/AAAAAAAAAC8/w9uvmmY5fcY/s320/20110812150021.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5639859123781819282" /&gt;&lt;/a&gt;
&lt;p&gt;
By this plug-in, we would be able to use SBT with Eclipse without special method such as &lt;a href="https://github.com/musk/SbtEclipsify"&gt;Eclipsify&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I'm planning to add some more features to eclipse-scala-tools such as unit testing support.
&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1647446621573020365?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1647446621573020365/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1647446621573020365' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1647446621573020365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1647446621573020365'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/08/eclipse-plug-in-for-sbt.html' title='Eclipse Plug-in for SBT'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-8uHZ_u1h9XU/TkTN0bf2dbI/AAAAAAAAAC0/a65Q1pmNgio/s72-c/20110812151526.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-5584067868136914381</id><published>2011-08-07T01:21:00.002+09:00</published><updated>2011-08-07T01:22:20.648+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mirage 1.1.3 is now available!</title><content type='html'>&lt;p&gt;
Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
New features in Mirage 1.1.3:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/updater/SchemaUpdater.html"&gt;SchemaUpdater&lt;/a&gt; and &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/updater/SchemaUpdateListener.html"&gt;SchemaUpdateListener&lt;/a&gt; to update database schema automatically.&lt;/li&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/session/Session.html#setRollbackOnly%28%29"&gt;Session#setRollbackOnly()&lt;/a&gt; and &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/session/Session.html#isRollbackOnly%28%29"&gt;Session#isRollbackOnly()&lt;/a&gt; to rollback transaction without exception.&lt;/li&gt;
  &lt;li&gt;SQL parsing result caching for performance improvement. You can control cache mode via &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/SqlManagerImpl.html#setCacheMode%28boolean%29"&gt;SqlManagerImpl#setCacheMode()&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Oracle hint support in 2-way SQL&lt;/li&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/ResultEntityCreator.html"&gt;ResultEntityCreator&lt;/a&gt; interface to extends SqlManager.&lt;/li&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/bean/PropertyExtractor.html"&gt;PropertyExtractor&lt;/a&gt; interface to extends BeanDesc.&lt;/li&gt;
  &lt;li&gt;Scala wrapper named &lt;a href="http://amateras.sourceforge.jp/site/mirage/mirage-scala.html"&gt;mirage-scala&lt;/a&gt; is available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This release contains the first release of mirage-scala. This is a wrapper of Mirage for Scala. 
&lt;/p&gt;
&lt;p&gt;
I have tested so many features and patterns in mirage-scala. However I couldn't believe how interface is best for mirage-scala. So I decided to release with minimum features in the first release. mirage-scala has not enough features now, however it will be expanded in the future.
&lt;/p&gt;
&lt;p&gt;
I hope Mirage helps your development. Enjoy! 
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-5584067868136914381?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/5584067868136914381/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=5584067868136914381' title='5 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5584067868136914381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5584067868136914381'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/08/mirage-113-is-now-available.html' title='Mirage 1.1.3 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1534611535498588569</id><published>2011-07-15T11:06:00.007+09:00</published><updated>2011-07-16T12:15:20.552+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>mirage-scala: Scala binding of Mirage</title><content type='html'>&lt;p&gt;
I started working for mirage-scala that is Scala binding of &lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;Mirage&lt;/a&gt;. mirage-scala works as wrapper of Mirage and provides the best interface to access to the database using Mirage for Scala.
&lt;/p&gt;
&lt;p&gt;
This is a simple example to query using mirage-scala:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
// A class that mapped to ResultList
class Book (
  val bookId: Int,
  val bookName: String,
  val author: String,
  val price: Int
)

// get Session and SqlManager
val session: Session = SessionFactory.getSession()
val sqlManager: SqlManager = session.getSqlManager()

// begin transaction
session.begin()

try {
  val books: List[Book] = sqlManager.getResultList(
    classOf[Book], Sql("""
      SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE
      FROM BOOK
      /*IF author!=null*/
        WHERE AUTHOR = /*author*/
      /*END*/
    """), Map("author"-&gt;"Naoki Takezoe"))
  
  books.foreach { book =&gt;
    println("bookId: " + book.bookId)
    println("bookName: " + book.bookName)
    println("author: " + book.author)
    println("price: " + book.price)
    println("--")
  }
  
  // commit transaction
  session.commit()
} catch {
  // rollback transaction
  ex: Exception =&gt; session.rollback()
}
&lt;/pre&gt;
&lt;p&gt;
A most important feature of Mirage is dynamic SQL template named 2waySQL. In Mirage, you have to create it as an external file on  the classpath. However in mirage-scala, you can write it inline using multi-line string literal. Of course, you can also use an external file as following:
&lt;pre class="prettyprint"&gt;
val result: List[Book] = sqlManager.getResultList(
  classOf[Book], 
  SqlFile("META-INF/selectBooks.sql"), 
  Map("author"-&gt;"Naoki Takezoe"))
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
mirage-scala is still under development. I'm evaluating APIs feaibility. So APIs might be changed considerably in the release version.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1534611535498588569?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1534611535498588569/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1534611535498588569' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1534611535498588569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1534611535498588569'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/07/mirage-scala-scala-binding-of-mirage.html' title='mirage-scala: Scala binding of Mirage'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-3511523276933937559</id><published>2011-05-01T11:37:00.003+09:00</published><updated>2011-05-01T11:45:57.125+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mirage 1.1.2 is now available!</title><content type='html'>Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
New features in Mirage 1.1.2: 
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/session/DBCPSessionImpl.html"&gt;DBCPSessionImpl&lt;/a&gt; to provide connection pooling as standalone usage.&lt;/li&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/integration/guice/TransactionInterceptor.html"&gt;TransactionInterceptor&lt;/a&gt; and &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/integration/guice/Transactional.html"&gt;@Transactional&lt;/a&gt; for &lt;a href="http://amateras.sourceforge.jp/site/mirage/integration.html#Google_Guice"&gt;Guice Intagration&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/test/MockSqlManager.html"&gt;MockSqlManager&lt;/a&gt; came to support stored procedure / function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This release does not contain so big new features. However it can be used in more large fields such as small web applications by connection-pooling in standalone usage.
&lt;/p&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-3511523276933937559?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/3511523276933937559/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=3511523276933937559' title='13 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3511523276933937559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3511523276933937559'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/05/mirage-112-is-now-available.html' title='Mirage 1.1.2 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7066459801522204474</id><published>2011-02-13T16:21:00.005+09:00</published><updated>2011-02-13T16:27:55.657+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amateras'/><title type='text'>AmaterasERD 1.0.8 is now available!</title><content type='html'>Project Amateras released AmaterasERD 1.0.8 at 12 February 2011.
&lt;p&gt;
  New features in this release:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Sybase support&lt;/li&gt;
  &lt;li&gt;In importing and exporting, table and column comments are mapped to logical name (Oracle and Sybase only)&lt;/li&gt;
  &lt;li&gt;Copy As Image from the context menu&lt;/li&gt;
  &lt;li&gt;Quick Outline ([CTRL]+[O])&lt;/li&gt;
  &lt;li&gt;Diagram font configuration&lt;/li&gt;
  &lt;li&gt;HTML generation tool from *.erd file which could be used in command-line&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  See details about AmaterasERD at:&lt;br&gt;
  &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasERD"&gt;http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasERD&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  See details about new features in AmaterasERD 1.0.8 at:&lt;br&gt;
  &lt;a href="http://sourceforge.jp/projects/amateras/wiki/AmaterasERD_1_0_8"&gt;http://sourceforge.jp/projects/amateras/wiki/AmaterasERD_1_0_8&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  You can download AmaterasERD 1.0.8 from:&lt;br&gt;
  &lt;a href="http://sourceforge.jp/projects/amateras/downloads/50912/net.java.amateras.db_1.0.8.jar/"&gt;http://sourceforge.jp/projects/amateras/downloads/50912/net.java.amateras.db_1.0.8.jar/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  Enjoy your development!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7066459801522204474?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7066459801522204474/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7066459801522204474' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7066459801522204474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7066459801522204474'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/02/amateraserd-108-is-now-available.html' title='AmaterasERD 1.0.8 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6325490802080745580</id><published>2011-01-15T20:55:00.004+09:00</published><updated>2011-01-15T21:03:58.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Unit Testting in Mirage</title><content type='html'>&lt;p&gt;
In the unit-testing for database access code, some testing frameworks such as &lt;a href="http://www.dbunit.org/"&gt;DbUnit&lt;/a&gt; are available. However, as you know, to maintain test data is very painful.
&lt;/p&gt;
&lt;p&gt;
Mirage proposes lightweight unit-testing without database for database access code. It's based on string matching of executed SQL and expected SQL. Executed SQLs don't reach to the database actually, they are intercepted and recorded to &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/test/MirageTestContext.html"&gt;MirageTestContext&lt;/a&gt; by using &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/test/MockSqlManager.html"&gt;MockSqlManager&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
You can verify executed SQLs and these parameters through MirageTestContext as below:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
@Test
public void testGetBookById(){
  // set MockSqlManager to the test target
  BookService bookService = new BookService();
  bookService.setSqlManager(new MockSqlManager());

  // configure results which would be 
  // returned by MockSqlManager.
  Book book = new Book();
  book.setBookName("Mirage in Action");

  MirageTestContext.addResult(book);

  // execute
  Book result = bookService.getBookById(new Long(100));

  // assert returned object
  assertEquals("Mirage in Action", book.getName);

  // verify the number of executed SQL
  MirageTestContext.verifySqlCount(1);

  // verify the executed SQL
  MirageTestContext.verifySqlByRegExp(0,
    "SELECT .* FROM BOOK " + 
    "WHERE ID = ? ORDER BY ID ASC", // verify SQL
    new Long(100)); // verify Parameters
}
&lt;/pre&gt;
&lt;p&gt;
As you see, you can also configure return values of MockSqlManager using MirageTestContext if it's necessary. You can write your test case more simple by static importing of MirageTestContext members.
&lt;/p&gt;
&lt;p&gt;
Please note, the purpose of this way is not to verify whether executed SQLs are correct. It helps to find influence which is not anticipated by modification of database access code. So it requires to current database access code and SQLs are correct.
&lt;/p&gt;
&lt;p&gt;
If your purpose of unit-testing for database access code is matches this concept, Mirage will decrease a cost of unit-testing and maintaining them very much.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6325490802080745580?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6325490802080745580/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6325490802080745580' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6325490802080745580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6325490802080745580'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/01/unit-testting-in-mirage.html' title='Unit Testting in Mirage'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-2813614980606844502</id><published>2011-01-15T17:14:00.007+09:00</published><updated>2011-01-15T17:18:58.948+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mirage 1.1.0 is now available!</title><content type='html'>Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
New features in Mirage 1.1.0: 
&lt;/p&gt;
&lt;h4&gt;Primary key generation support&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/annotation/PrimaryKey.html"&gt;@PrimaryKey&lt;/a&gt; annotation has new attributes generationType and generator. The generationType attribute supports GenerationType.APPLICATION, GenerationType.IDENTIY and GenerationType.SEQAUENCE.&lt;/li&gt;
  &lt;li&gt;The persistent attribute of @PrimaryKey annotation has been removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Improvement of unit testing support&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Verification methods of &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/test/MirageTestContext.html"&gt;MirageTestContext&lt;/a&gt; have been enhanced.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;New ConnectionProvider and Dialect&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/provider/JNDIDataSourceConnectionProvider.html"&gt;JNDIDataSourceConnectionProvider&lt;/a&gt; and &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/provider/JNDIXADataSourceConnectionProvider.html"&gt;JNDIXADataSourceConnectionProvider&lt;/a&gt; which obtain a dada source from JNDI.&lt;/li&gt;
  &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/dialect/MySQLDialect.html"&gt;MySQLDialect&lt;/a&gt; to MySQL support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-2813614980606844502?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/2813614980606844502/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=2813614980606844502' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/2813614980606844502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/2813614980606844502'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/01/mirage-110-is-now-available.html' title='Mirage 1.1.0 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1325785492089545789</id><published>2011-01-02T14:06:00.004+09:00</published><updated>2011-01-02T14:11:26.458+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mirage 1.0.6 is now available!</title><content type='html'>&lt;p&gt;
Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here is the list of changes in Mirage 1.0.6:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Unit Testing support
    &lt;ul&gt;
      &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/test/MockSqlManager.html"&gt;MockSqlManager&lt;/a&gt; which is used in unit testing instead of SqlManager. See details about Unit Testing support at the &lt;a href="http://amateras.sourceforge.jp/site/mirage/unittest.html"&gt;UnitTest&lt;/a&gt; section.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Ant Task
    &lt;ul&gt;
      &lt;li&gt;Added &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/tool/EntityGenTask.html"&gt;EntityGenTask&lt;/a&gt; for entity generation.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  In addition, Apache Click example is updated which contains examples of TestCase using MockSqlManager. You can get it from &lt;a href="http://sourceforge.jp/projects/amateras/releases/?package_id=10941"&gt;the download page&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1325785492089545789?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1325785492089545789/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1325785492089545789' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1325785492089545789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1325785492089545789'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2011/01/mirage-106-is-now-available.html' title='Mirage 1.0.6 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-794363060652776024</id><published>2010-12-19T00:20:00.008+09:00</published><updated>2010-12-19T00:43:32.978+09:00</updated><title type='text'>rdiff-backup browser</title><content type='html'>Project Amateras released &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=rdiff-backup+browser"&gt;rdiff-backup browser&lt;/a&gt; at Nov. 18, 2010.
&lt;p&gt;
rdiff-backup browser is a web application to browse backup histories of &lt;a href="http://www.nongnu.org/rdiff-backup/"&gt;rdiff-backup&lt;/a&gt;. It is written in Java and works on the Java application server such as Apache Tomcat.
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PMt2PXEt_oY/TQzSlgoZqTI/AAAAAAAAACI/5yb6LSBQnsQ/s1600/rdiff-backup-browser-2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 114px;" src="http://2.bp.blogspot.com/_PMt2PXEt_oY/TQzSlgoZqTI/AAAAAAAAACI/5yb6LSBQnsQ/s320/rdiff-backup-browser-2.png" alt="" id="BLOGGER_PHOTO_ID_5552043982497360178" border="0" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PMt2PXEt_oY/TQzS5Cw4CCI/AAAAAAAAACQ/t5n1D8pFR88/s1600/rdiff-backup-browser-3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="http://3.bp.blogspot.com/_PMt2PXEt_oY/TQzS5Cw4CCI/AAAAAAAAACQ/t5n1D8pFR88/s320/rdiff-backup-browser-3.png" alt="" id="BLOGGER_PHOTO_ID_5552044318077224994" border="0" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PMt2PXEt_oY/TQzTBwG4jCI/AAAAAAAAACY/jSAtbjMsNoc/s1600/rdiff-backup-browser-4.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="http://2.bp.blogspot.com/_PMt2PXEt_oY/TQzTBwG4jCI/AAAAAAAAACY/jSAtbjMsNoc/s320/rdiff-backup-browser-4.png" alt="" id="BLOGGER_PHOTO_ID_5552044467688082466" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-794363060652776024?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/794363060652776024/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=794363060652776024' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/794363060652776024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/794363060652776024'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/12/rdiff-backup-browser.html' title='rdiff-backup browser'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PMt2PXEt_oY/TQzSlgoZqTI/AAAAAAAAACI/5yb6LSBQnsQ/s72-c/rdiff-backup-browser-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6827031091949601930</id><published>2010-10-05T08:28:00.001+09:00</published><updated>2010-10-05T08:28:51.457+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mirage 1.0.5 is now available!</title><content type='html'>&lt;p&gt;
Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here is the list of changes in Mirage 1.0.5:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Add new methods to SqlManager for batch insert/update/delete entities:
    &lt;ul&gt;
      &lt;li&gt;SqlManager#insertBatch()&lt;/li&gt;
      &lt;li&gt;SqlManager#updateBatch()&lt;/li&gt;
      &lt;li&gt;SqlManager#deleteBatch()&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;BugFix: NullPointerException which is caused in conversion from NULL column value to java.util.Date.&lt;/li&gt;
  &lt;li&gt;Possible to specify @In, @Out, @InOut, @ResultSet for setter / getter method.&lt;/li&gt;
  &lt;li&gt;Add new annotations @Table, @Column. These annotation are used to specify table and column name.&lt;/li&gt;
  &lt;li&gt;Entity Generation Tool (Experimental). See the &lt;a href="http://amateras.sourceforge.jp/site/mirage/apidocs/jp/sf/amateras/mirage/tool/EntityGen.html"&gt;EntityGen Javadoc&lt;/a&gt; to know how to use it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  In addition, Apache Click example is updated to use Apache Click 2.2.0 and Mirage 1.0.5. You can get it from &lt;a href="http://sourceforge.jp/projects/amateras/releases/?package_id=10941"&gt;the download page&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6827031091949601930?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6827031091949601930/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6827031091949601930' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6827031091949601930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6827031091949601930'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/10/mirage-105-is-now-available.html' title='Mirage 1.0.5 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-430399036784233476</id><published>2010-10-01T01:06:00.003+09:00</published><updated>2010-10-01T01:10:30.066+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Standard EL Functions 1.1.1 is available!</title><content type='html'>We released &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=JSEL"&gt;Java Standard EL Functions (JSEL)&lt;/a&gt; ver 1.1.1.
&lt;p&gt;
JSEL provides standard JSP-EL functions for web application development such as escaping HTML tags, URL encoding and formatting Date or Number. You can use it with many web frameworks which use JSP as view technologies.
&lt;/p&gt;
&lt;p&gt;
Here is the list of new features in this release:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;New functions to print message to JSP by log level&lt;/li&gt;
  &lt;li&gt;New functions to test whether log level is enabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can print message if the log log level is enabled using functions such as &lt;strong&gt;log:printDebug()&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
${log:printDebug('DEBUG level is enabled.')}
&lt;/pre&gt;
&lt;p&gt;
And also you can test  whether log level is enabled using &lt;strong&gt;log:isDebugEnabled()&lt;/strong&gt;.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;c:if test="${log:isDebugEnabled()}"&amp;gt;
  DEBUG level is enabled.
&amp;lt;/c:if&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Please see the &lt;a href="http://amateras.sourceforge.jp/site/functions/tlddoc/index.html"&gt;TLDDoc&lt;/a&gt; to know details of available functions.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-430399036784233476?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/430399036784233476/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=430399036784233476' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/430399036784233476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/430399036784233476'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/10/java-standard-el-functions-111-is.html' title='Java Standard EL Functions 1.1.1 is available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6926729831000051249</id><published>2010-09-28T13:30:00.005+09:00</published><updated>2010-09-28T13:37:39.491+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mailing list for Mirage is now available!</title><content type='html'>Mailing list for Mirage is now available.
&lt;p&gt;
You can subscribe this list at the following page:&lt;br&gt;
&lt;a href="http://lists.sourceforge.jp/mailman/listinfo/amateras-mirage"&gt;http://lists.sourceforge.jp/mailman/listinfo/amateras-mirage&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
And Mirage 1.0.5 which contains some new features such as batch updating and entity generation tool and also new click-mirage-examples would be released soon!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6926729831000051249?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6926729831000051249/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6926729831000051249' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6926729831000051249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6926729831000051249'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/09/mailing-list-for-mirage.html' title='Mailing list for Mirage is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-8638720874970466816</id><published>2010-09-04T12:02:00.002+09:00</published><updated>2010-09-04T12:06:42.201+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><title type='text'>Mirage 1.0.4 Released!</title><content type='html'>Mirage 1.0.4 is now available!

&lt;p&gt;
Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here is the list of changes in Mirage 1.0.4:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;JavaSE 5 support (Mirage 1.0.3 and before work with only JavaSE 6)&lt;/li&gt;
  &lt;li&gt;BugFix: Map which contains null properties causes NullPointerException in SqlManager#executeUpdate()&lt;/li&gt;
  &lt;li&gt;BugFix: When the column value is NULL then Mirage sets the default value of primitive types to entity wrapper type properties.&lt;/li&gt;
  &lt;li&gt;Add new methods to SqlManager for direct sql execution:
    &lt;ul&gt;
      &lt;li&gt;SqlManager#getResultListBySql()&lt;/li&gt;
      &lt;li&gt;SqlManager#getSingleResultBySql()&lt;/li&gt;
      &lt;li&gt;SqlManager#iterateBySql()&lt;/li&gt;
      &lt;li&gt;SqlManager#executeUpdatySql()&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-8638720874970466816?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/8638720874970466816/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=8638720874970466816' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8638720874970466816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8638720874970466816'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/09/mirage-104-released.html' title='Mirage 1.0.4 Released!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-247602204948838241</id><published>2010-07-20T11:15:00.002+09:00</published><updated>2010-07-20T11:17:54.683+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>ClickIDE 2.2.0.0 is now available!</title><content type='html'>ClickIDE 2.2.0.0 is now available!
&lt;p&gt;
ClickIDE is an Eclipse plug-in for the developing Click web applications.
&lt;/p&gt;
&lt;p&gt;
This version supports Apache Click 2.2.0 and fixed some issues.
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Details about ClickIDE:&lt;/dt&gt;
&lt;dd&gt;&lt;a href="http://click.apache.org/docs/click-ide.html"&gt;http://click.apache.org/docs/click-ide.html&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;Download page:&lt;/dt&gt;
&lt;dd&gt;&lt;a href="http://click.apache.org/docs/click-ide-downloads.html"&gt;http://click.apache.org/docs/click-ide-downloads.html&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
Enjoy Click!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-247602204948838241?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/247602204948838241/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=247602204948838241' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/247602204948838241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/247602204948838241'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/07/clickide-2200-is-now-available.html' title='ClickIDE 2.2.0.0 is now available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-5733924168530764051</id><published>2010-07-05T23:38:00.005+09:00</published><updated>2010-07-05T23:51:51.406+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amateras'/><title type='text'>EclipseHTMLEditor 2.0.7 Released!</title><content type='html'>&lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi"&gt;Project Amateras&lt;/a&gt; released EclipseHTMLEditor 2.0.7 at 05 July 2010.
&lt;p&gt;
&lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=EclipseHTMLEditor"&gt;EclipseHTMLEditor&lt;/a&gt; is an Eclipse plug-in which provides HTML, XML, JSP, JavaScript, CSS and DTD editor.
&lt;/p&gt;
&lt;p&gt;
The main topic of this release is improvement of JavaScript editor. Enhanced JavaScript parser provides many new features for code completion, hyperlink and the outline view.
&lt;/p&gt;
&lt;p&gt;
Here is a list of new features in this release.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript editor improvenemnt
  &lt;ul&gt;
    &lt;li&gt;Code completion was greatly improved&lt;/li&gt;
    &lt;li&gt;jQuery code completion&lt;/li&gt;
    &lt;li&gt;Quick Outline (CTRL + O)&lt;/li&gt;
    &lt;li&gt;JsDoc support&lt;/li&gt;
    &lt;li&gt;Selected word highlighting&lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;XPath search dialog is available in the HTML editor&lt;/li&gt;
&lt;li&gt;Configurable HTML/JSP formatter&lt;/li&gt;
&lt;li&gt;Synchronization of the caret offset and outline view selection in HTML, XML, JSP and JavaScript editor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
See details &lt;a href="http://sourceforge.jp/projects/amateras/wiki/AmaterasIDE_2_0_7"&gt;here&lt;/a&gt; about new features.
&lt;/p&gt;
&lt;p&gt;
Enjoy your development!
&lt;/p&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-5733924168530764051?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/5733924168530764051/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=5733924168530764051' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5733924168530764051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5733924168530764051'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/07/eclipsehtmleditor-207-released.html' title='EclipseHTMLEditor 2.0.7 Released!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6845729501223482603</id><published>2010-06-15T05:37:00.002+09:00</published><updated>2010-06-15T05:38:18.149+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mirage 1.0.3 Released</title><content type='html'>Mirage 1.0.3 is now available!
&lt;p&gt;
Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here is the list of changes in this release:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Iteration search per a record using cursor.&lt;/li&gt;
  &lt;li&gt;Stored procedure / function support.&lt;/li&gt;
  &lt;li&gt;BugFix about SqlManager#insertEntity().&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  Please see also my past entries about new features in Mirage 1.0.3.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://takezoe.blogspot.com/2010/06/mirage-supports-stored.html"&gt;Mirage supports stored procedure/functions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://takezoe.blogspot.com/2010/05/iteration-search-in-mirage.html"&gt;Large results processing in Mirage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6845729501223482603?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6845729501223482603/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6845729501223482603' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6845729501223482603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6845729501223482603'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/06/mirage-103-released.html' title='Mirage 1.0.3 Released'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-5450122156184935734</id><published>2010-06-03T02:56:00.005+09:00</published><updated>2010-06-12T01:27:42.414+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mirage supports stored procedure/function</title><content type='html'>The next version of Mirage will support stored procedure/function. We added new methods to call them to SqlManager in the SVN trunk.
&lt;p&gt;
Here is an example to call stored function in Mirage:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;// Creates parameter object which give to stored function
GetCountParam param = new GetCountParam();
param.deptId = 1;
...
// Calls a stored function and get a result value.
Long count = sqlManager.call(Long.class, "get_emp_count", param);
&lt;/pre&gt;
&lt;p&gt;
Fields of the parameter class has annotation such as &lt;strong&gt;@In&lt;/strong&gt;, &lt;strong&gt;@Out&lt;/strong&gt;, &lt;strong&gt;@InOut&lt;/strong&gt; and &lt;strong&gt;@ResultSet&lt;/strong&gt;. These annotations mean parameter type.
&lt;/p&gt;
&lt;p&gt;
If the function returns ResultSet, use &lt;strong&gt;SqlManager#callForList()&lt;/strong&gt; instead of &lt;strong&gt;SqlManager#call()&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Please wait for the next release of Mirage!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-5450122156184935734?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/5450122156184935734/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=5450122156184935734' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5450122156184935734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5450122156184935734'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/06/mirage-supports-stored.html' title='Mirage supports stored procedure/function'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-8001794157817802892</id><published>2010-05-09T01:55:00.005+09:00</published><updated>2010-05-09T01:59:28.009+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Large results processing in Mirage</title><content type='html'>The next release of Mirage is 1.0.3. It contains some new features. Today, I write about iteration search which is one of them.
&lt;p&gt;
SqlManager#getResultList() creates all entity instances and returns a list which contains them. If SQL returns a large result, it causes OutOfMemory.
&lt;/p&gt;
&lt;p&gt;
In these case, you should use &lt;strong&gt;SqlManager#iterate()&lt;/strong&gt; instead of SqlManager#getResultList().
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
Integer result = sqlManager.iterate(
  Book.class,
  new IterationCallback&amp;lt;Book, Integer&amp;gt;() {

    private int result;

    @Override public Integer iterate(Book entity) {
      result = result + entity.price;
      return result;
    }

  },
  SQL_PREFIX + "SqlManagerImplTest_selectBooks.sql");
&lt;/pre&gt;
&lt;p&gt;
SqlManager#iterate() accepts &lt;strong&gt;IterationCallback&lt;/strong&gt; and invoke it per record. The return value of SqlManager#iterate() is a last returned value from IterationCallback.
&lt;/p&gt;
&lt;p&gt;
Iteration search would be available in Mirage 1.0.3.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-8001794157817802892?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/8001794157817802892/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=8001794157817802892' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8001794157817802892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8001794157817802892'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/05/iteration-search-in-mirage.html' title='Large results processing in Mirage'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7676639567030128391</id><published>2010-05-08T19:36:00.005+09:00</published><updated>2010-05-08T21:35:08.720+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mirage 1.0.2 Released!</title><content type='html'>Mirage 1.0.2 is now available!
&lt;p&gt;
Mirage is a simple SQL centric database access library. See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
1.0.2 is a maintenance release. Here is the list of changes in this release:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dependency to Spring Framework and Guice became optional.&lt;/li&gt;
&lt;li&gt;Dependency to the pached OGNL changed to OGNL 2.7.3.&lt;/li&gt;
&lt;li&gt;BugFix about BLOB support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
BLOB support in 1.0.1 does not work because it contains a serious bug. This bug was fixed in 1.0.2 and dependencies was reviewed and modified to minimum.
&lt;/p&gt;
&lt;p&gt;
And also Mirage with Apache Click example is released. You can get it from &lt;a href="http://sourceforge.jp/projects/amateras/releases/?package_id=10941"&gt;the download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
I wish that Mirage helps your development. Enjoy!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7676639567030128391?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7676639567030128391/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7676639567030128391' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7676639567030128391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7676639567030128391'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/05/mirage-102-released.html' title='Mirage 1.0.2 Released!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7944207673330643422</id><published>2010-05-02T23:29:00.007+09:00</published><updated>2010-05-02T23:41:46.402+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mirage and Apache Click Example</title><content type='html'>I started to make a sample application to use &lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;Mirage&lt;/a&gt; with &lt;a href="http://click.apache.org/"&gt;Apache Click&lt;/a&gt;.
&lt;p&gt;
This sample application has not been completed yet. However you can checkout source code from the following URL using Subversion.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://svn.sourceforge.jp/svnroot/amateras/mirage/trunk/mirage-click-example/"&gt;http://svn.sourceforge.jp/svnroot/amateras/mirage/trunk/mirage-click-example/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can build a war file using Maven. Please execute following commands in command prompt.
&lt;pre class="prettyprint"&gt;
$ svn co http://svn.sourceforge.jp/svnroot/amateras/mirage/trunk/mirage-click-example/
$ cd mirage-click-example
$ mvn package
&lt;/pre&gt;
&lt;p&gt;
Then you can find &lt;strong&gt;mirage-click-example.war&lt;/strong&gt; in the /target directory.
&lt;/p&gt;
&lt;p&gt;
Put it into the application server such as Tomcat and access http://localhost:8080/mirage-click-example/ using your browser.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7944207673330643422?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7944207673330643422/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7944207673330643422' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7944207673330643422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7944207673330643422'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/05/mirage-and-apache-click-example.html' title='Mirage and Apache Click Example'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-3749297990903130023</id><published>2010-05-02T02:43:00.005+09:00</published><updated>2010-05-02T23:36:02.265+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mirage 1.0.1 Released!</title><content type='html'>Mirage is a simple SQL centric database access library. Today, I've just released Mirage 1.0.1. It's already available. 
&lt;p&gt;
See the following URL to know about Mirage:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;http://amateras.sourceforge.jp/site/mirage/welcome.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here is the list of new features in this release:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use java.util.logging instead of slf4j / logback to remove them from dependency.&lt;/li&gt;
&lt;li&gt;Simple example and documentation for Google Guice integration.&lt;/li&gt;
&lt;li&gt;It's possible to specify a transient property by transient modifier instead of @Transient annotation.&lt;/li&gt;
&lt;li&gt;Add new method SqlManager#findEntity(Class clazz, Object... id)&lt;/li&gt;
&lt;li&gt;Add new method SqlManager#getCount(String sqlPath[, Object param])&lt;/li&gt;
&lt;li&gt;ValueType interface to add custome value type support&lt;/li&gt;
&lt;li&gt;BLOB support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Mirage is still not enough to use in complex systems. So we would improve it as much as possible soon.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-3749297990903130023?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/3749297990903130023/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=3749297990903130023' title='6 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3749297990903130023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3749297990903130023'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/05/mirage-101-released.html' title='Mirage 1.0.1 Released!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7534398627850950358</id><published>2010-04-20T17:20:00.008+09:00</published><updated>2010-05-02T23:36:22.617+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mirage'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mirage: Simple SQL Centric DB Access Library</title><content type='html'>Today, I released &lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;Mirage&lt;/a&gt; ver 1.0.0.
&lt;p&gt;
Mirage is a simple SQL centric database access library. It has a following two features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2WaySQL&lt;br&gt;
The main feature of Mirage is 2WaySQL. This makes plain old SQL template, and it is executable using any SQL client tools because parameters and conditions are written as SQL comment.&lt;/li&gt;
&lt;li&gt;SQL less Update&lt;br&gt;
Generally, update processing are simpler than search processing. However, especially, large INSERT SQL brings us the considerable pain. In the Mirage, you can insert / update / delete records using entity class (without SQL).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The main feature of Mirage is &lt;strong&gt;2WaySQL&lt;/strong&gt;. This makes plain old SQL template. See the following example:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
SELECT * FROM BOOK
/*BEGIN*/
  WHERE
  /*IF author != null */
        AUTHOR = /*author*/'Naoki Takezoe'
  /*END*/
  /*IF minPrice != null */
    AND PRICE &gt;= /*minPrice*/20
  /*END*/
  /*IF maxPrice != null */
    AND PRICE &lt;= /*maxPrice*/100
  /*END*/
/*END*/
ORDER BY BOOK_ID ASC
&lt;/pre&gt;
&lt;p&gt;
Mirage processes this SQL template and executes it using PreparedStatement at runtime. And this SQL template is exacutable even it is on SQL client tools such as SQL*Plus(Oracle) or psql(PostgreSQL). So it makes easy to test SQL.
&lt;/p&gt;
&lt;p&gt;
See details about Mirage at &lt;a href="http://amateras.sourceforge.jp/site/mirage/welcome.html"&gt;our web site&lt;/a&gt;. I would also talk about Mirage in this blog.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7534398627850950358?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7534398627850950358/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7534398627850950358' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7534398627850950358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7534398627850950358'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/04/mirage-simple-sql-centric-db-access.html' title='Mirage: Simple SQL Centric DB Access Library'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-684715439568145670</id><published>2010-04-18T21:18:00.006+09:00</published><updated>2010-04-18T22:16:19.675+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Standard EL Functions 1.1.0 is available!</title><content type='html'>We released &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=JSEL"&gt;Java Standard EL Functions (JSEL)&lt;/a&gt; ver 1.1.0.
&lt;p&gt;
JSEL provides standard JSP-EL functions for web application development such as escaping HTML tags, URL encoding and formatting Date or Number. You can use it with many web frameworks which use JSP as view technologies.
&lt;/p&gt;
&lt;p&gt;
Here is the example to JSEL usage:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;%@ taglib uri="http://amateras.sf.jp/functions" prefix="f" %&amp;gt;
...
&amp;lt;%-- Escape HTML tags --%&amp;gt;
${f:h(value)}
&amp;lt;%-- URL encode --%&amp;gt;
${f:u(value)}
&lt;/pre&gt;
&lt;p&gt;
JSEL provides many usable EL functions. Please check &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=JSEL"&gt;our web site&lt;/a&gt; to know details about JSEL.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-684715439568145670?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/684715439568145670/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=684715439568145670' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/684715439568145670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/684715439568145670'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/04/java-standard-el-functions-110-is.html' title='Java Standard EL Functions 1.1.0 is available!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-5695709426459952036</id><published>2010-02-27T19:14:00.005+09:00</published><updated>2010-02-27T20:34:09.737+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>ClickIDE 2.1.0.0 Released</title><content type='html'>&lt;p&gt;
ClickIDE 2.1.0.0 is now available!
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://blogs.apache.org/click/entry/clickide_2_1_0_0"&gt;https://blogs.apache.org/click/entry/clickide_2_1_0_0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://click-framework.blogspot.com/2010/02/clickide-2100-released-support-apache.html"&gt;http://click-framework.blogspot.com/2010/02/clickide-2100-released-support-apache.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This version is the first release of ClickIDE from Apache Software Foundation and it supports Eclipse 3.5 and Apache Click 2.1.0.
&lt;/p&gt;
&lt;p&gt;
You can download it from the following link:&lt;br&gt;
&lt;a href="http://www.apache.org/dyn/closer.cgi/click/clickide/2.1.0.0/clickide-2.1.0.0.zip"&gt;http://www.apache.org/dyn/closer.cgi/click/clickide/2.1.0.0/clickide-2.1.0.0.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Enjoy Click!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-5695709426459952036?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/5695709426459952036/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=5695709426459952036' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5695709426459952036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5695709426459952036'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2010/02/clickide-2100-released.html' title='ClickIDE 2.1.0.0 Released'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1665920553301516709</id><published>2009-09-21T22:13:00.004+09:00</published><updated>2009-09-21T22:23:32.373+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Doloto: JavaScript optimization tool</title><content type='html'>&lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee423534.aspx"&gt;Doloto&lt;/a&gt; is an AJAX application optimization tool provided at Microsoft DevLabs.
&lt;p&gt;
It works as an local proxy server, and it profiles JavaScript in Ajax applications. After profiling, Doloto groups JavaScripy functions as clusters based on profiled data. And rewrite original JavaScript code to load functions on demand using XMLHttpRequest.
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PMt2PXEt_oY/Srd9vkeQf9I/AAAAAAAAAB0/uK8SdbZOH6Y/s1600-h/1_Doloto%E3%81%AE%E8%A8%AD%E5%AE%9A.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 285px; height: 320px;" src="http://4.bp.blogspot.com/_PMt2PXEt_oY/Srd9vkeQf9I/AAAAAAAAAB0/uK8SdbZOH6Y/s320/1_Doloto%E3%81%AE%E8%A8%AD%E5%AE%9A.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5383910135742627794" /&gt;&lt;/a&gt;
&lt;p&gt;
Doloto is very simple and easy to use. It makes lazy loading of JavaScript with no changes of your applications.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1665920553301516709?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1665920553301516709/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1665920553301516709' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1665920553301516709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1665920553301516709'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2009/09/doloto.html' title='Doloto: JavaScript optimization tool'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_PMt2PXEt_oY/Srd9vkeQf9I/AAAAAAAAAB0/uK8SdbZOH6Y/s72-c/1_Doloto%E3%81%AE%E8%A8%AD%E5%AE%9A.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6461908346612975987</id><published>2009-09-05T09:50:00.006+09:00</published><updated>2009-09-05T10:09:46.446+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Vilike: Open Source vi Plug-in for Eclipse</title><content type='html'>&lt;a href="http://www.viplugin.com/"&gt;viPlugin for Eclipse&lt;/a&gt; is a major plug-in that provides vi like key binding for Eclipse. However it's not open source. We have to buy license to use it (15 Euro).
&lt;p&gt;
Today, I found an open source vi plug-in named &lt;a href="http://sourceforge.jp/projects/mitonan/"&gt;Vilike&lt;/a&gt;. I tested this plug-in and felt it good.
&lt;/p&gt;
&lt;p&gt;
You can get it from &lt;a href="http://sourceforge.jp/projects/mitonan/releases/"&gt;the download page&lt;/a&gt;. 
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Download &lt;strong&gt;jp.gr.java_conf.mitonan.vilike_0.1.0.beta1.jar&lt;/strong&gt; and put it into &lt;tt&gt;ECLIPSE_HOME/dropins&lt;/tt&gt;.&lt;/li&gt;
  &lt;li&gt;Restart Eclipse and choose &lt;strong&gt;ViLike Key Binding Scheme&lt;/strong&gt; ad the key binding schema in the Eclipse preference dialog (&lt;tt&gt;[General] - [Keys]&lt;/tt&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PMt2PXEt_oY/SqG3OtYG61I/AAAAAAAAABs/u7ASpsruovA/s1600-h/01_Vilike%E3%81%AE%E8%A8%AD%E5%AE%9A.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://4.bp.blogspot.com/_PMt2PXEt_oY/SqG3OtYG61I/AAAAAAAAABs/u7ASpsruovA/s320/01_Vilike%E3%81%AE%E8%A8%AD%E5%AE%9A.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5377780893383846738" /&gt;&lt;/a&gt;
&lt;p&gt;
Try Vilike plug-in if you want to bring Eclispe key binding close to the vi editor!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6461908346612975987?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6461908346612975987/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6461908346612975987' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6461908346612975987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6461908346612975987'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2009/09/vilike-open-source-vi-plug-in-for.html' title='Vilike: Open Source vi Plug-in for Eclipse'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_PMt2PXEt_oY/SqG3OtYG61I/AAAAAAAAABs/u7ASpsruovA/s72-c/01_Vilike%E3%81%AE%E8%A8%AD%E5%AE%9A.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6100007343199112671</id><published>2009-08-24T02:21:00.005+09:00</published><updated>2009-08-24T02:40:38.015+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JSDT: JavaScript Debug Tool</title><content type='html'>&lt;a href="http://code.google.com/p/jsdt/"&gt;JSDT(JavaScript Debug Tools)&lt;/a&gt; is a JavaScript debugger that supports multi web browser without any add-ons.
&lt;p&gt;
Existing JavaScript debugger such as Firebug works for only specific web browsers or requires special add-ons. However JSDT has no requirement. It supports IE, Firefox, Chrome, Safari, Opera and many other browsers.
&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PMt2PXEt_oY/SpF-_AkuuWI/AAAAAAAAABk/ALWMZrnEnbk/s1600-h/%E5%9B%B303_Swing%E7%89%88%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://2.bp.blogspot.com/_PMt2PXEt_oY/SpF-_AkuuWI/AAAAAAAAABk/ALWMZrnEnbk/s320/%E5%9B%B303_Swing%E7%89%88%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5373215451380627810" /&gt;&lt;/a&gt;
&lt;p&gt;
It works as the HTTP proxy server and this proxy inserts JavaScript code for debug into original JavaScript code. Inserted code sends debug information to debugger using Ajax.
&lt;/p&gt;
&lt;p&gt;
JSDT provides a Swing based stand-alone debugger and an Eclipse plug-in. We can choose them by our development style.
&lt;/p&gt;
&lt;p&gt;
Now, JSDT has some problem to debug JavaScript which contains multi-byte characters. So the current version is not so practicable. However JSDT's debugging mechanism looks epoch-making. I'm looking forward to the future of JSDT!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6100007343199112671?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6100007343199112671/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6100007343199112671' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6100007343199112671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6100007343199112671'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2009/08/jsdt-javascript-debug-tool.html' title='JSDT: JavaScript Debug Tool'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PMt2PXEt_oY/SpF-_AkuuWI/AAAAAAAAABk/ALWMZrnEnbk/s72-c/%E5%9B%B303_Swing%E7%89%88%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6361568247131223709</id><published>2009-07-26T22:14:00.008+09:00</published><updated>2009-08-08T21:38:18.217+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Utility to use JDO easily on Google App Engine</title><content type='html'>We can use JDO to access BigTable on Google App Engine for Java. 
&lt;p&gt;
However JDO PersistenceManager and Query object are so complex. So I wrote an utility to use JDO easily.
For example, you can search entities as follows instead of JDO Query object.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
List&lt;Entry&gt; entries = JdoUtil.from(Entry.class)
  .filter("userId == ?")
  .ordering("updateDate desc")
  .range(0, 20)
  .getResultList(userId); &lt;/pre&gt;
&lt;p&gt;
No need to cast result objects and Query#declareParameters() also.
&lt;/p&gt;
&lt;p&gt;
I would like to provide this utility in the part of my &lt;strong&gt;NikoNiko Framework&lt;/strong&gt; (NikoNiko means Smile in Japanese). NikoNiko Framework supports both standard JavaEE web development and Google App Engine for Java. It's small and lightweight. It would be suitable for the small web application development.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6361568247131223709?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6361568247131223709/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6361568247131223709' title='6 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6361568247131223709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6361568247131223709'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2009/07/easy-jdo-utility.html' title='Utility to use JDO easily on Google App Engine'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-8934699304875180059</id><published>2009-04-03T10:08:00.003+09:00</published><updated>2009-04-03T10:24:45.811+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Empire-db: Type-safe query builder</title><content type='html'>I found a new database access framework named &lt;a href="http://incubator.apache.org/empire-db/"&gt;Empire-db&lt;/a&gt; in the Apache Incubator.
&lt;p&gt;
A most important feature of Empire-db which I think is a &lt;strong&gt;type-safe query builder&lt;/strong&gt;. See a following example from Empire-db's web site.
&lt;pre class="prettyprint"&gt;
// Create a command object
DBCommand cmd = db.createCommand();
// Select columns
cmd.select(EMP.EMPLOYEE_ID);
cmd.select(EMP.LASTNAME.append(", ").append(EMP.FIRSTNAME).as("NAME"));
cmd.select(DEP.NAME.as("DEPARTMENT"));
// Join tables
cmd.join  (DEP.DEPARTMENT_ID, EMP.DEPARTMENT_ID);
// Set constraints
cmd.where(EMP.LASTNAME.likeUpper("Foo%"));
cmd.where(EMP.RETIRED.is(false));
// Set order
cmd.orderBy(EMP.LASTNAME);
cmd.orderBy(EMP.FIRSTNAME); &lt;/pre&gt;
This feature is very useful at the software development projects which face many changes of database schema. Because compilation errors are caused by changes of database schema. We can fix these errors completely and surely soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-8934699304875180059?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/8934699304875180059/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=8934699304875180059' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8934699304875180059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8934699304875180059'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2009/04/empire-db-type-safe-query-builder.html' title='Empire-db: Type-safe query builder'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-8292582973055155374</id><published>2009-01-02T01:14:00.004+09:00</published><updated>2009-01-02T01:35:51.245+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>Toggle comment in the Velocity editor</title><content type='html'>I've just start development of the next version of ClickIDE.
&lt;p&gt;
I added &lt;strong&gt;Toggle Comment&lt;/strong&gt; action to the Velocity editor. You can toggle comment for selected lines by the context menu or &lt;strong&gt;CTRL + /&lt;/strong&gt;. 
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PMt2PXEt_oY/SVzuB0FQOUI/AAAAAAAAABc/Kwq1NhzJpzE/s1600-h/toggle-comment.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://2.bp.blogspot.com/_PMt2PXEt_oY/SVzuB0FQOUI/AAAAAAAAABc/Kwq1NhzJpzE/s320/toggle-comment.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286361777554078018" /&gt;&lt;/a&gt;
&lt;/p&gt;
By the way, Now I'm planning JSP and FreeMarker support in the next version of ClickIDE. I have no concrete idea yet, but I wish to provide FreeMarker editor which has features same as the Velocity editor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-8292582973055155374?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/8292582973055155374/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=8292582973055155374' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8292582973055155374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/8292582973055155374'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2009/01/toggle-comment-in-velocity-editor.html' title='Toggle comment in the Velocity editor'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PMt2PXEt_oY/SVzuB0FQOUI/AAAAAAAAABc/Kwq1NhzJpzE/s72-c/toggle-comment.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1041429458041349147</id><published>2008-11-12T13:29:00.001+09:00</published><updated>2008-11-12T13:33:44.053+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>ClickIDE 2.1.0 Released</title><content type='html'>ClickIDE 2.1.0 is now available!
&lt;p&gt;
ClickIDE is an Eclipse/WTP plug-in for web application development using Click. This release has not new features however it supports Click 1.5 and Eclipse 3.4/WTP 3.0.
&lt;p&gt;
Please &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=82095&amp;package_id=84113"&gt;download&lt;/a&gt; ClickIDE 2.1.0 and enjoy Click!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1041429458041349147?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1041429458041349147/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1041429458041349147' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1041429458041349147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1041429458041349147'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/11/clickide-210-released.html' title='ClickIDE 2.1.0 Released'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7817521941353261739</id><published>2008-10-08T16:18:00.007+09:00</published><updated>2008-10-12T08:58:31.946+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>Url Rewrite Filter: Make Clean URL in Click Framework</title><content type='html'>&lt;a href="http://tuckey.org/urlrewrite/"&gt;Url Rewrite Filter&lt;/a&gt; is a servlet filter which provides features similar to the mod_rewrite. We can make clean URL in Click Framework using Url Write Filter.
&lt;p&gt;
Url Rewrite Filter has a configuretion file &lt;strong&gt;WEB-INF/urlrewrite.xml&lt;/strong&gt;. This is a very simple example of clean URL with a Click application.
&lt;pre class="prettyprint"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;!DOCTYPE urlrewrite
  PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
  "http://tuckey.org/res/dtds/urlrewrite2.6.dtd"&amp;gt;

&amp;lt;urlrewrite&amp;gt;
  &amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;^/contents/([0-9]+).htm$&amp;lt;/from&amp;gt;
    &amp;lt;to type="forward"&amp;gt;/content.html?contentId=$1&amp;lt;/to&amp;gt;
  &amp;lt;/rule&amp;gt;
&amp;lt;/urlrewrite&amp;gt;
&lt;/pre&gt;
For example, Url Rewrite Filter will forward &lt;strong&gt;/contents/001.htm&lt;/strong&gt; to &lt;strong&gt;/content.htm?contentId=001&lt;/strong&gt;.
&lt;p&gt;
If &lt;strong&gt;content.htm&lt;/strong&gt; has possibility to receive any other query parameters, we can define following rules.
&lt;pre class="prettyprint"&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;!DOCTYPE urlrewrite
  PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
  "http://tuckey.org/res/dtds/urlrewrite2.6.dtd"&amp;gt;

&amp;lt;urlrewrite&amp;gt;
  &amp;lt;!-- No Query String --&amp;gt;
  &amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;^/contents/([0-9]+).htm$&amp;lt;/from&amp;gt;
    &amp;lt;to type="forward"&amp;gt;/content.html?contentId=$1&amp;lt;/to&amp;gt;
  &amp;lt;/rule&amp;gt;
  &amp;lt;!-- With Query String --&amp;gt;
  &amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;^/contents/([0-9]+).htm?(.+)$&amp;lt;/from&amp;gt;
    &amp;lt;to type="forward"&amp;gt;/content.html?contentId=$1&amp;amp;$2&amp;lt;/to&amp;gt;
  &amp;lt;/rule&amp;gt;
&amp;lt;/urlrewrite&amp;gt;
&lt;/pre&gt;
Of course, we can use Url Write Filter with other frameworks such as Struts. I think Url Write Filter is a simple solution to make clean URL in the Java web applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7817521941353261739?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7817521941353261739/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7817521941353261739' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7817521941353261739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7817521941353261739'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/10/url-rewrite-filter-make-clean-url-on.html' title='Url Rewrite Filter: Make Clean URL in Click Framework'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-2781598686127761222</id><published>2008-08-15T21:32:00.004+09:00</published><updated>2008-08-20T18:53:15.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>Ajax Controls for Click Framework</title><content type='html'>I'm thinking about Ajax integration for Click Framework recently.
&lt;p&gt;
For example, see the below page class. If you clicks &lt;strong&gt;AjaxRequestButton&lt;/strong&gt;, Click invokes &lt;code&gt;getAllBooks()&lt;/code&gt; using XMLHttpRequest. And &lt;code&gt;getAllBooks()&lt;/code&gt; renders a Java object as JSON. &lt;code&gt;AjaxRequestButton&lt;/code&gt; generates a HTML button that invokes &lt;code&gt;Ajax.Request&lt;/code&gt; of &lt;a href="http://www.prototypejs.org/"&gt;prototype.js&lt;/a&gt;.
&lt;pre class="prettyprint"&gt;
public class AjaxPage extends AjaxPage {
  public AjaxRequestButton button
    = new AjaxRequestButton("search", this, "getAllBooks");
  
  public AjaxPage(){
    button.addAjaxHandler(
      AjaxRequestButton.ON_COMPLETE, "displayResult");
  }
  
  public boolean getAllBooks(){
    List&amp;lt;Book&amp;gt; books = bookService.getAllBooks();
    renderJSON(books);
    return false;
  }
}
&lt;/pre&gt;
Next example. &lt;strong&gt;AjaxSubmit&lt;/strong&gt; control send Form using &lt;code&gt;Ajax.Request&lt;/code&gt;.
&lt;pre class="prettyprint"&gt;
public class AjaxPage extends AjaxPage {

  public Form form = new Form("form");
  private TextField keyword = new TextFiled("keyword");
  private AjaxSubmit search = new AjaxSubmit("search", this, "onSearch");
  
  public AjaxPage(){
    form.add(keyword);
    form.add(search);
  }
  
  public boolean onSearch(){
    List&amp;lt;Book&amp;gt; bookList = bookService.search(keyword.getValue());
    renderJSON(books);
    return false;
  }
}
&lt;/pre&gt;
Of course, these controls need more improvement. However I think this concept matches to Click Framework well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-2781598686127761222?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/2781598686127761222/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=2781598686127761222' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/2781598686127761222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/2781598686127761222'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/08/ajax-controls-for-click-framework.html' title='Ajax Controls for Click Framework'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-3787468866482207119</id><published>2008-08-14T16:27:00.005+09:00</published><updated>2008-08-14T17:55:45.362+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><category scheme='http://www.blogger.com/atom/ns#' term='Seasar'/><title type='text'>S2Click: Seasar2 integration for Click Framework</title><content type='html'>&lt;a href="http://s2click.sandbox.seasar.org/"&gt;S2Click&lt;/a&gt; is Seasar2 integration for Click Framework. &lt;a href="http://www.seasar.org/en/index.html"&gt;Seasar2&lt;/a&gt; is an opensource DI container made in Japan. S2Click adds powerful features to Click.
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;HOT deploy&lt;/strong&gt; - You don't have to restart application server when you modify your sourcecode.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Java5 annotation&lt;/strong&gt; - S2Click provides some annotations for ease of development&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ajax &amp; File download support&lt;/strong&gt; - The page base class S2ClickPage provides methods to render Ajax &amp; file downloading response.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;public field handling&lt;/strong&gt; - You can use public fields instead of setter &amp; getter in many places.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Extended controls&lt;/strong&gt; - S2ClickForm, ToolTip, ConfirmSubmit, AjaxLinks and AjaxButtons&lt;/li&gt;
&lt;/ul&gt;
Now, Seasar2 and S2Click focuses to Japanese developers (So documentation is provided with Japanese mainly).
&lt;p&gt;
However I will introduce S2Click detailed features in this blog. And also I will feedback these features to Click Framework from S2Click in the feature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-3787468866482207119?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/3787468866482207119/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=3787468866482207119' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3787468866482207119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3787468866482207119'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/08/s2click.html' title='S2Click: Seasar2 integration for Click Framework'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-1910721118033206005</id><published>2008-08-03T15:54:00.001+09:00</published><updated>2008-08-03T16:04:11.916+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>Click Framework goes to ASF!</title><content type='html'>There are very good news. Click Framework will join to the Apache Incubator! &lt;a href="http://wiki.apache.org/incubator/ClickProposal"&gt;The proposal&lt;/a&gt; has been accepted.
&lt;p&gt;
This is the first step of introducing Click Framework to many Java developers. I'll make effort to incubate Click Framework in the Apache Incubator.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-1910721118033206005?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/1910721118033206005/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=1910721118033206005' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1910721118033206005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/1910721118033206005'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/08/click-framework-goes-to-asf.html' title='Click Framework goes to ASF!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-372844484095052011</id><published>2008-07-03T13:30:00.000+09:00</published><updated>2008-07-03T13:38:14.563+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amateras'/><title type='text'>AIR GEAR 1.0.0 Released!</title><content type='html'>Yesterday, Project Amateras released &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasAIR"&gt;AIR GEAR 1.0.0&lt;/a&gt;!
&lt;p&gt;
AIR GEAR is an open source IDE for Adobe AIR development. It works as an Eclipse plug-in so you can use it with many other Eclipse plug-ins and powerful features of Eclipse.
&lt;/p&gt;
&lt;p&gt;
AIR GEAR has following features:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Supports both HTML and Flex based AIR application development&lt;/li&gt;
  &lt;li&gt;WISYWIG graphical editor for Flex&lt;/li&gt;
  &lt;li&gt;Automatic build and error reporting&lt;/li&gt;
  &lt;li&gt;AIR application launcher on the Eclipse&lt;/li&gt;
&lt;/ul&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PMt2PXEt_oY/SGxWqPq_X6I/AAAAAAAAABM/iAJfbAZs4nA/s1600-h/graphycal-editor.png"&gt;&lt;img style="cursor:hand;" src="http://2.bp.blogspot.com/_PMt2PXEt_oY/SGxWqPq_X6I/AAAAAAAAABM/iAJfbAZs4nA/s320/graphycal-editor.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218641351976902562" /&gt;&lt;/a&gt;
&lt;p&gt;
See &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AIRGEARDoc"&gt;this page&lt;/a&gt; about detailed use.
&lt;/p&gt;
&lt;p&gt;
Enjoy your development!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-372844484095052011?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/372844484095052011/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=372844484095052011' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/372844484095052011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/372844484095052011'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/07/air-gear-100-released.html' title='AIR GEAR 1.0.0 Released!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PMt2PXEt_oY/SGxWqPq_X6I/AAAAAAAAABM/iAJfbAZs4nA/s72-c/graphycal-editor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-953171584283656703</id><published>2008-06-24T12:00:00.002+09:00</published><updated>2008-06-24T12:11:24.167+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>memcached in Java</title><content type='html'>I'm looking for memcached client library for Java. Then I found two libraries.
&lt;dl&gt;
&lt;dt&gt;&lt;a href="http://www.whalin.com/memcached/"&gt;memcached client for java&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;memcached client for java is simple and synchronous mamcached client libraries. This is easy to use but not support CAS commands.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://code.google.com/p/spymemcached/"&gt;spymemcached&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;spymemcached supports asynchronous processing and CAS commands. Updating cache is high-speed. However implementation is very complex.&lt;/dd&gt;
&lt;/dl&gt;
I think that many web applications don't require asynchronous cache processing. So I think mamcached client for java is better solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-953171584283656703?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/953171584283656703/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=953171584283656703' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/953171584283656703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/953171584283656703'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/06/memcached-in-java.html' title='memcached in Java'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-3880274836610194115</id><published>2008-06-20T21:08:00.004+09:00</published><updated>2008-06-20T21:18:04.308+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amateras'/><title type='text'>prototype.js and script.aculo.us</title><content type='html'>The next version of Amateras JavaScript editor supports &lt;a href="http://www.prototypejs.org/"&gt;prototype.js&lt;/a&gt; and &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;. These libraries are proposed in code completion proposals.
&lt;p&gt;
&lt;div&gt;
prototype.js:&lt;br&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PMt2PXEt_oY/SFueUOxXL3I/AAAAAAAAAA8/ZjHyEfvauJ0/s1600-h/prototype.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_PMt2PXEt_oY/SFueUOxXL3I/AAAAAAAAAA8/ZjHyEfvauJ0/s320/prototype.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213935064011190130" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;
script.aculo.us:&lt;br&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PMt2PXEt_oY/SFueyHuK-OI/AAAAAAAAABE/wNnbPB3d1jc/s1600-h/scriptaculous.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_PMt2PXEt_oY/SFueyHuK-OI/AAAAAAAAABE/wNnbPB3d1jc/s320/scriptaculous.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5213935577514834146" /&gt;&lt;/a&gt;
&lt;/div&gt;
In the future version, many other JavaScript libraries will be supported!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-3880274836610194115?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/3880274836610194115/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=3880274836610194115' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3880274836610194115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3880274836610194115'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/06/prototypejs-and-scriptaculous.html' title='prototype.js and script.aculo.us'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PMt2PXEt_oY/SFueUOxXL3I/AAAAAAAAAA8/ZjHyEfvauJ0/s72-c/prototype.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-4854228589314909162</id><published>2008-06-20T16:17:00.004+09:00</published><updated>2008-06-20T18:57:57.550+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>The page auto mapping without templates</title><content type='html'>Click Framework provides the page auto mapping. This is the important feature to decrease amount of configuration.
&lt;p&gt;
However Click maps page classes to request-path from HTML templates. So page classes which do not have corresponded HTML template is not mapped automatically.
&lt;p&gt;
For example:
&lt;ul&gt;
&lt;li&gt;pages which share a HTML template&lt;/li&gt;
&lt;li&gt;the page which returns JSON or file (response is written in the page class)&lt;/li&gt;
&lt;/ul&gt;
I'm thinking about annotations on Click Framework. How about the @Path annotation which specifies the auto mapping path to page classes.
&lt;pre class="prettyprint"&gt;
@Path("/file-download.htm")
public class FileDonwloadPage extends Page {

  /**
   * Writes response for file downloading in this method.
   */
  @Override public void onRender() {
    HttpServletResponse res = getContext().getResponse();
    OutputStream out = res.getOutputStream();
    ...
  }

  /**
   * This method returns &lt;code&gt;null&lt;/code&gt; to not render template,
   * because this class writes response contents for file download.
   */
  public String getPath(){
    return null;
  }
}
&lt;/pre&gt;
This is one idea of using annotation in Click Framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-4854228589314909162?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/4854228589314909162/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=4854228589314909162' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4854228589314909162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4854228589314909162'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/06/page-auto-mapping-without-templates.html' title='The page auto mapping without templates'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7604927888309224317</id><published>2008-04-22T10:43:00.000+09:00</published><updated>2008-04-22T10:49:46.261+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amateras'/><title type='text'>JavaScript Formatter</title><content type='html'>&lt;p&gt;
&lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=EclipseHTMLEditor"&gt;EclipseHTMLEditor&lt;/a&gt; (a part of Amateras) provides the JavaScript editor. I added JavaScript source code formatter to the JavaScript editor. We can format JavaScript source code from the context menu.
&lt;/p&gt;
&lt;div&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PMt2PXEt_oY/SA1DRnEo18I/AAAAAAAAAAM/tDj2hqS6_EM/s1600-h/js_format_1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_PMt2PXEt_oY/SA1DRnEo18I/AAAAAAAAAAM/tDj2hqS6_EM/s320/js_format_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5191879915253323714" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PMt2PXEt_oY/SA1DzHEo19I/AAAAAAAAAAU/GOfuB5sFc-s/s1600-h/js_format_2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_PMt2PXEt_oY/SA1DzHEo19I/AAAAAAAAAAU/GOfuB5sFc-s/s320/js_format_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5191880490778941394" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
Please wait for the next release of EclipseHTMLEditor!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7604927888309224317?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7604927888309224317/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7604927888309224317' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7604927888309224317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7604927888309224317'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/04/javascript-formatter.html' title='JavaScript Formatter'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PMt2PXEt_oY/SA1DRnEo18I/AAAAAAAAAAM/tDj2hqS6_EM/s72-c/js_format_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6535435141975357101</id><published>2008-04-21T18:00:00.007+09:00</published><updated>2008-04-23T10:06:26.031+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>JJUG Cross Community Conference 2008 Spring</title><content type='html'>&lt;p&gt;
&lt;a href="http://www.java-users.jp/contents/events/ccc2008spring/index.html"&gt;JJUG Cross Community Conference 2008 Spring&lt;/a&gt; will be held at Japan 30 Apr.
&lt;/p&gt;
&lt;p&gt;
JJUG is an abbreviation of &lt;strong&gt;Japan Java User Group&lt;/strong&gt;. In this conference, top Java engineers in Japan talk about hot topics in Java such as Web frameworks, EclipseLink, JAM, Scala and New Swing APIs.
&lt;/p&gt;
&lt;p&gt;
I'll talk about &lt;a href="http://click.sourceforge.net/"&gt;Click Framework&lt;/a&gt; in this conference and join panel discussion with speakers of Grails, JRuby on Rails and Wicket.
&lt;/p&gt;
&lt;p&gt;
I wish to make efforts to spread Click Framework in Japan.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6535435141975357101?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6535435141975357101/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6535435141975357101' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6535435141975357101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6535435141975357101'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/04/jjug-cross-community-conference-2008.html' title='JJUG Cross Community Conference 2008 Spring'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-6293226510903358105</id><published>2008-03-14T00:47:00.002+09:00</published><updated>2008-04-22T10:22:17.965+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>File download in Click Framework</title><content type='html'>&lt;p&gt;
Click Framework provides FileField to upload file, however Click does not provide any support for file downloading. I made &lt;a href="https://click.svn.sourceforge.net/svnroot/click/trunk/sandbox/takezoe/click-extensions/src/net/sf/click/extensions/AbstractDownloadPage.java"&gt;AbstractDownloadPage&lt;/a&gt; to download file.
&lt;/p&gt;
&lt;p&gt;
Usage:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt; public class SampleDownloadPage extends AbstractDownloadPage {
  public SampleDownloadPage(){
    setFileName("sample.txt");
    setContents(SampleDownloadPage.class.getResourceAsStream("sample.txt"));
  }
} &lt;/pre&gt;
&lt;p&gt;
This page class does not have a template because response is written by this class. So auto-mapping does not work for file download pages. The extended page class have to be registered to &lt;tt&gt;click.xml&lt;/tt&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-6293226510903358105?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/6293226510903358105/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=6293226510903358105' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6293226510903358105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/6293226510903358105'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/03/file-download-in-click-framework.html' title='File download in Click Framework'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-3281808826058800345</id><published>2008-03-10T01:30:00.003+09:00</published><updated>2008-04-22T10:23:09.669+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Click'/><title type='text'>Click Framework + LiveValidation</title><content type='html'>&lt;p&gt;
Click controls provide JavaScript validation, but they are not easy to customize. Now I'm writing JavaScript validation framework for Click using &lt;a href="http://www.livevalidation.com/"&gt;LiveValidation&lt;/a&gt;.
In the page class, ready the &lt;code&gt;LivaValiator&lt;/code&gt; control like below:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;Form form = new Form("form");
form.add(new TextField("name", true));
form.add(new PasswordField("password", true));
form.add(new Submit("login"));

addControl(new LivaValidator("validator", form));&lt;/pre&gt;
&lt;p&gt;
In the page template, generates LiveValidation JavaScript code by the &lt;code&gt;LiveValidator&lt;/code&gt; control:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;body&amp;gt;
  $form
  &amp;lt;script type="text/javascript"&amp;gt;
    $validator
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/pre&gt;
&lt;p&gt;
We can also add customized validation rules by use of &lt;code&gt;&lt;a href="http://www.livevalidation.com/documentation#ValidateCustom"&gt;Validate.Custom&lt;/a&gt;&lt;/code&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-3281808826058800345?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/3281808826058800345/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=3281808826058800345' title='3 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3281808826058800345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/3281808826058800345'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/03/click-framework-livevalidation.html' title='Click Framework + LiveValidation'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-4085363048441520825</id><published>2008-03-09T22:30:00.007+09:00</published><updated>2008-04-22T10:24:07.268+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>OVal: The simple validation framework for Java</title><content type='html'>&lt;p&gt;
&lt;a href="http://oval.sourceforge.net/"&gt;OVal&lt;/a&gt; is the simple validation framework for Java. You can specify validation rules using annotations.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;public class Person {
  @NotNull
  public String name;
}
&lt;/pre&gt;
&lt;p&gt;
Usage:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;Validator v = new Validator();

Person p = new Person();
for(ConstraintViolation error: v.validate(p)){
  System.out.println(error.getMessage());
}
&lt;/pre&gt;OVal can switch validation rules by profiles.
&lt;pre class="prettyprint"&gt;public class Person {
  @NotNull(profiles={"profile1"})
  public String name;
  
  @NotNull(profiles={"profile1", "profile2"})
  public String email;
}&lt;/pre&gt;
&lt;p&gt;
Switch profiles like following:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;// Enable all profiles
v.enableAllProfiles();
// Enable a specified profile
v.enableProfile("profile1");

// Disable all profiles
v.disableAllProfiles();
// Disable a specified profile
v.disableProfile("profile1");
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-4085363048441520825?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/4085363048441520825/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=4085363048441520825' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4085363048441520825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4085363048441520825'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/03/oval-simple-validation-framework-for.html' title='OVal: The simple validation framework for Java'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-4339858284302079424</id><published>2008-02-21T10:46:00.005+09:00</published><updated>2008-04-22T10:25:19.083+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JSONIC - simple json encoder/decoder for java</title><content type='html'>&lt;p&gt;
JSONIC is a simple JSON encoder / decoder for Java made in Japan. We can get JSONIC from &lt;a href="http://sourceforge.jp/projects/jsonic/files/"&gt;http://sourceforge.jp/projects/jsonic/files/&lt;/a&gt;.
The use of JSONIC is very easy.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;import net.arnx.jsonic.JSON;

// POJO to JSON
String text = JSON.encode(new Hoge());

// JSON to POJO
Hoge hoge = JSON.decode(text, Hoge.class); &lt;/pre&gt;
&lt;p&gt;
JSONIC can handle POJO's public fields as property well and it also encode / decode &lt;code&gt;java.util.Map&lt;/code&gt; and &lt;code&gt;java.util.List&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;
I recommend JSONIC if you have to handle JSON in Java. It would be a best choice.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-4339858284302079424?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/4339858284302079424/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=4339858284302079424' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4339858284302079424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4339858284302079424'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/02/jsonic-simple-json-encoderdecoder-for.html' title='JSONIC - simple json encoder/decoder for java'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-2473114679591116959</id><published>2008-02-21T10:29:00.008+09:00</published><updated>2008-04-28T23:07:22.936+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Seasar'/><title type='text'>The First Seasar2 Example</title><content type='html'>&lt;p&gt;
At first, I show the very simple example to use S2Container. I created following 3 files into "jp.sf.amateras.seasar.example" package.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;example.dicon&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
          "http://www.seasar.org/dtd/components24.dtd"&amp;gt;
&amp;lt;components&amp;gt;
  &amp;lt;component class="java.util.ArrayList" name="list"&amp;gt;
    &amp;lt;initMethod name="add"&amp;gt;&amp;lt;arg&amp;gt;"Naoki Takezoe"&amp;lt;/arg&amp;gt;&amp;lt;/initMethod&amp;gt;
  &amp;lt;/component&amp;gt;
&amp;lt;/components&amp;gt;
&amp;lt;components&amp;gt;
  &amp;lt;component class="jp.sf.amateras.seasar.example.Hello" name="hello"&amp;gt;
    &amp;lt;property name="target"&amp;gt;list&amp;lt;/property&amp;gt;
  &amp;lt;/component&amp;gt;
&amp;lt;/components&amp;gt; &lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Hello.java&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;package jp.sf.amateras.seasar.example;
import java.util.List;

public class Hello {
 private List target;
 public void setTarget(List target){
   this.target = target;
 }
 public void sayHello(){
   for(int i=0;i&amp;lt;target.size();i++){
     System.out.println("Hello, " + target.get(i));
   }
 }
}&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Main.java&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;package jp.sf.amateras.seasar.example;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class Main {
 public static void main(String[] args){
   S2Container container = S2ContainerFactory.create(
              "jp/sf/amateras/seasar/example/example.dicon");
   Hello hello = (Hello)container.getComponent("hello");
   hello.sayHello();
 }
}&lt;/pre&gt;
&lt;p&gt;
Run the "Main" class as a Java application, it displays "Hello, Naoki Takezoe".
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-2473114679591116959?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/2473114679591116959/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=2473114679591116959' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/2473114679591116959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/2473114679591116959'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/02/first-seasar2-example.html' title='The First Seasar2 Example'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-7850407720030923417</id><published>2008-02-12T11:31:00.003+09:00</published><updated>2008-04-22T10:28:52.788+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Seasar'/><title type='text'>S2Dao: 2-Way SQL</title><content type='html'>&lt;p&gt;
S2Dao can assemble dynamic query using SQL comment. For example:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;@Sql("SELECT * FROM emp WHERE empno = /*empno*/7788")
@Arguments("empno")
public Emp selectEmpByEmpNo(int empNo);&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;/*empno*/&lt;/strong&gt; replaces the given argument and 7788 is removed by S2Dao at runtime. We can execute this SQL without no modification with the database client software such as psql. This solutuion is called "2-Way SQL" in S2Dao.
&lt;/p&gt;
&lt;p&gt;
We can also use IF..ELSE statement as SQL comment.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;/*IF hoge != null*/hoge = /*hoge*/'abc'/*END*/&lt;/pre&gt;
&lt;p&gt;
And see the following example. If all conditions are false, S2Dao ignores &lt;strong&gt;/*BEGIN*/ ... /*END*/&lt;/strong&gt; block. So WHERE phrase is removed when it's not needed.
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;/*BEGIN*/WHERE
  /*IF job != null*/job = /*job*/'CLERK'/*END*/
  /*IF deptno != null*/AND deptno = /*deptno*/20/*END*/
/*END*/&lt;/pre&gt;
&lt;p&gt;
Again, these SQL can be executed with database client software with no modifications. 2-Way SQL makes possible to test SQL easily.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-7850407720030923417?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/7850407720030923417/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=7850407720030923417' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7850407720030923417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/7850407720030923417'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/02/s2dao-2-way-sql.html' title='S2Dao: 2-Way SQL'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-5433204443876732608</id><published>2008-02-11T23:36:00.003+09:00</published><updated>2008-04-22T10:30:44.497+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Seasar'/><title type='text'>S2Dao: The most powerfull database access framework</title><content type='html'>&lt;p&gt;
&lt;a href="http://s2dao.seasar.org/en/"&gt;S2Dao&lt;/a&gt; is a database access framework based on the Seasar2 and AOP solution. Today, I introduce this great framework to you.
&lt;/p&gt;
&lt;p&gt;
S2Dao makes DAO from Java interface using AOP at runtime. We have to write only Java interface such as:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;@S2Dao(bean=UserInfo.class)
public interface UserInfoDao {
  public List&amp;lt;UserInfo&amp;gt; selectAllUserInfos();
  public void insertUserInfo(UserInfo userInfo);
  public void updateUserInfo(UserInfo userInfo);
  public void deleteUserInfo(UserInfo userInfo);
}&lt;/pre&gt;
&lt;p&gt;
SQLs are generated automatically by the entity definition (which is specified by &lt;strong&gt;@S2Dao&lt;/strong&gt;) and DAO method names. So we don't have to write SQL in simple cases such as CRUD to the single table.
&lt;/p&gt;
&lt;p&gt;
Of course, we can use complex SQL instead of auto generated SQL. We can specify WHERE and ORDER BY using &lt;strong&gt;@Query&lt;/strong&gt;:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;@Query("DEPTID=? ORDER BY EMPNO")
public List&amp;lt;UserInfo&amp;gt; selectUserInfoByDeptId(int deptId); &lt;/pre&gt;
&lt;p&gt;
And using &lt;strong&gt;@Sql&lt;/strong&gt;, we can specify all parts of SQL:
&lt;/p&gt;
&lt;pre class="prettyprint"&gt;@Sql("SELECT COUNT(*) FROM USERINFO")
public int getCount(); &lt;/pre&gt;
&lt;p&gt;
These are parts of S2Dao great features. If we have to use complex and large SQL, we can write it as an external SQL file named "classname_methodname.sql" and S2Dao also support dynamic query using SQL comment. I will talk about them as another entries.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-5433204443876732608?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/5433204443876732608/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=5433204443876732608' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5433204443876732608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/5433204443876732608'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/02/s2dao-most-powerfull-database-access.html' title='S2Dao: The most powerfull database access framework'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1669625400637572127.post-4436960084228807500</id><published>2008-02-11T23:18:00.001+09:00</published><updated>2008-04-22T10:31:42.062+09:00</updated><title type='text'>This is the first entry in Blogger!!</title><content type='html'>&lt;p&gt;
This is the first entry in Blogger!!
&lt;/p&gt;
&lt;p&gt;
I'm making a lot of Eclipse plug-ins at the &lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi"&gt;Project Amateras&lt;/a&gt;. Eclipse is the major open source Java Integrated Development Environment. And I'm also commiter of the &lt;a href="http://click.sourceforge.net/"&gt;Click Framework&lt;/a&gt;. Click is powerful and simple web application framework for Java.
&lt;/p&gt;
&lt;p&gt;
Now I'm interested in the small web development project using Java. Which frameworks should we use...? My one answer is here:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Seasar2 (DI/AOP container made in Japan)&lt;/li&gt;
  &lt;li&gt;S2Dao(Data Access Framework based on Seasar2)&lt;/li&gt;
  &lt;li&gt;Click Framework&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://www.seasar.org/en/"&gt;Seasar2&lt;/a&gt; is a poweful DI/AOP container made in Japan. I think Seasar2 is more easy than Spring in many cases. However Seasar2 does not have enough English docuements to use it. So I will try to tell about Seasar2 in this blog.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1669625400637572127-4436960084228807500?l=takezoe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://takezoe.blogspot.com/feeds/4436960084228807500/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1669625400637572127&amp;postID=4436960084228807500' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4436960084228807500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1669625400637572127/posts/default/4436960084228807500'/><link rel='alternate' type='text/html' href='http://takezoe.blogspot.com/2008/02/this-is-first-entry-in-blogger.html' title='This is the first entry in Blogger!!'/><author><name>Naoki Takezoe</name><uri>http://www.blogger.com/profile/17770435894928578175</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
