<?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-3627102742438898505</id><updated>2012-01-05T12:39:57.673+03:00</updated><category term='Python'/><category term='JPA'/><category term='GWT'/><category term='XP'/><category term='books'/><category term='OOD'/><category term='htmlunit'/><category term='Clojure'/><category term='cool site'/><category term='SOA'/><category term='db2'/><category term='toolbox'/><category term='lifestyle'/><category term='httpunit'/><category term='JXTA'/><category term='JRuby'/><category term='specs'/><category term='BDD'/><category term='DSL'/><category term='Reverse AJAX'/><category term='business rules'/><category term='JAXB'/><category term='Projects'/><category term='Pomodoro technique'/><category term='aspects'/><category term='Spring'/><category term='Ruby on Rails'/><category term='Design Patterns'/><category term='Mindmaps'/><category term='LINQ'/><category term='STM'/><category term='Continuous Integration'/><category term='XSLT'/><category term='OSGi'/><category term='scalability'/><category term='java'/><category term='Stress Testing'/><category term='Grid computing'/><category term='HyperJAXB'/><category term='REST'/><category term='Portal'/><category term='security'/><category term='GlassFish'/><category term='Modeling'/><category term='XML'/><category term='Web services'/><category term='IBM tools'/><category term='Compass'/><category term='Netbeans'/><category term='infrastructure'/><category term='asynchronousity'/><category term='groovy'/><category term='drools'/><category term='functional programming'/><category term='Scrum'/><category term='Hardware'/><category term='WADL'/><category term='JSF'/><category term='fun'/><category term='testing'/><category term='JavaScript'/><category term='J2EE'/><category term='Metrics'/><title type='text'>Wintermute Blog</title><subtitle type='html'>A developer's blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-8488789959010220119</id><published>2011-11-08T19:50:00.005+03:00</published><updated>2011-11-08T20:43:49.676+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='toolbox'/><category scheme='http://www.blogger.com/atom/ns#' term='XSLT'/><title type='text'>Easy XSLT without installing anything</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.typpz.com/wp-content/275px-xml.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 275px; height: 313px;" src="http://blog.typpz.com/wp-content/275px-xml.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Sometimes you need to apply an XSLT to some XML, and there are (at least) a couple of ways to do it:&lt;br /&gt;&lt;br /&gt;(a) Install a processor like Saxon and run it through the command line;&lt;br /&gt;(b) Reference an XSLT from your XML file, and then open it in a browser;&lt;br /&gt;&lt;br /&gt;Both are somewhat problematic - the first one requires installing and running something, and the second requires modifications to the XML. I propose a useful and effective alternative, which I've been using successfully for quite a while. The idea is as following: you simply open a special HTML in a browser. This HTML contains a JavaScript that loads both XML and XSLT files, applies the transform and renders the result into its own DOM. Here is the HTML I use, it is really simple and works in both IE and Mozilla. All you need to do is replace the filenames (input.xml and template.xsl):&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;function loadXMLDoc(fname)&lt;br /&gt;{&lt;br /&gt; var xmlDoc;&lt;br /&gt; if (window.ActiveXObject)&lt;br /&gt; {&lt;br /&gt;  xmlDoc = new ActiveXObject(&amp;quot;Microsoft.XMLDOM&amp;quot;);&lt;br /&gt; }&lt;br /&gt; else if (document.implementation &amp;amp;&amp;amp; document.implementation.createDocument)&lt;br /&gt; {&lt;br /&gt;  xmlDoc = document.implementation.createDocument(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,null);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  alert('Your browser cannot handle this script');&lt;br /&gt; }&lt;br /&gt; xmlDoc.async = false;&lt;br /&gt; xmlDoc.load(fname);&lt;br /&gt; return(xmlDoc);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function displayResult()&lt;br /&gt;{&lt;br /&gt; xml = loadXMLDoc(&amp;quot;&lt;b&gt;&lt;font color="red"&gt;input.xml&lt;/font&gt;&lt;/b&gt;&amp;quot;);&lt;br /&gt; xsl = loadXMLDoc(&amp;quot;&lt;b&gt;&lt;font color="red"&gt;template.xsl&lt;/font&gt;&lt;/b&gt;&amp;quot;);&lt;br /&gt; if (window.ActiveXObject)&lt;br /&gt; {&lt;br /&gt;  ex = xml.transformNode(xsl);&lt;br /&gt;  document.getElementById(&amp;quot;content&amp;quot;).innerHTML = ex;&lt;br /&gt; }&lt;br /&gt; else if (document.implementation &amp;amp;&amp;amp; document.implementation.createDocument)&lt;br /&gt; {&lt;br /&gt;  xsltProcessor=new XSLTProcessor();&lt;br /&gt;  xsltProcessor.importStylesheet(xsl);&lt;br /&gt;  resultDocument = xsltProcessor.transformToFragment(xml,document);&lt;br /&gt;  document.getElementById(&amp;quot;content&amp;quot;).appendChild(resultDocument);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body onLoad=&amp;quot;displayResult()&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;div id=&amp;quot;content&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;A sample use case: you have an application which logs some data into an XML file at a given location. You write an XSLT that filters errors in this log, and adjust the filenames inside the HTML above. You save this HTML on your Desktop, and every time you open or refresh it, it shows you the current errors in the log. It is easier and more user-friendly than running BAT-files saving output of transform into some temporary HTML and then opening it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-8488789959010220119?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/8488789959010220119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2011/11/easy-xslt-without-installing-anything.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8488789959010220119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8488789959010220119'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2011/11/easy-xslt-without-installing-anything.html' title='Easy XSLT without installing anything'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-1682987800899761823</id><published>2011-01-14T22:57:00.003+02:00</published><updated>2011-01-14T23:11:22.537+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Pomodoro technique'/><title type='text'>Meet Flowkeeper, a new open-source software timer for Pomodoro Technique</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_arwiFr_8Dbk/TTC7F4anzxI/AAAAAAAAAOQ/xIakeekyL8I/s1600/screenshot1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 162px;" src="http://1.bp.blogspot.com/_arwiFr_8Dbk/TTC7F4anzxI/AAAAAAAAAOQ/xIakeekyL8I/s400/screenshot1.png" alt="" id="BLOGGER_PHOTO_ID_5562151249520348946" border="0" /&gt;&lt;/a&gt;I want to present you the very first version of &lt;a href="http://flowkeeper.org/"&gt;Flowkeeper&lt;/a&gt; - yet another free software timer for &lt;a href="http://www.pomodorotechnique.com/"&gt;Pomodoro Technique&lt;/a&gt;. Initially it was designed as a desktop UI for &lt;a href="http://code.google.com/p/pomodoro-server/"&gt;Pomodoro Server&lt;/a&gt; - my another project supporting teamwork for PT. Despite the almost-ready-for-production state of the latter one, I decided to implement both online and offline modes in Flowkeeper, and release offline-only version first. So here it is, ready for &lt;a href="http://flowkeeper.sourceforge.net/setup.exe"&gt;download&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;Some of its features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Your plans are persistent and can be viewed after the program is closed;&lt;/li&gt;&lt;li&gt;Configurable timer sounds and system tray notifications;&lt;/li&gt;&lt;li&gt;Some basic single-day statistics;&lt;/li&gt;&lt;li&gt;Supported platforms: Windows (with installer), Linux KDE, Linux Gnome (no system tray), MacOS (reported, but no details yet);&lt;/li&gt;&lt;/ul&gt;I am pretty ambitious about this project. Here are some of the features to be included in the next version, just to name a few:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New multiplatform installer;&lt;/li&gt;&lt;li&gt;Activity Inventory;&lt;/li&gt;&lt;li&gt;Better statistics;&lt;/li&gt;&lt;li&gt;Source code will be published on SourceForge;&lt;/li&gt;&lt;/ul&gt;So, keep tuned and don't hesitate to contact me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-1682987800899761823?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/1682987800899761823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2011/01/meet-flowkeeper-new-open-source.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1682987800899761823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1682987800899761823'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2011/01/meet-flowkeeper-new-open-source.html' title='Meet Flowkeeper, a new open-source software timer for Pomodoro Technique'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_arwiFr_8Dbk/TTC7F4anzxI/AAAAAAAAAOQ/xIakeekyL8I/s72-c/screenshot1.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-19735906117010523</id><published>2010-06-30T17:15:00.002+03:00</published><updated>2010-06-30T17:40:40.700+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Oracle driver in Maven</title><content type='html'>This is just a short reminder how to add Oracle driver as a dependency in POM.&lt;br /&gt;&lt;br /&gt;In pom.xml:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;lt;groupid&amp;gt;com.oracle&amp;lt;/groupid&amp;gt;&lt;br /&gt;&amp;lt;artifactid&amp;gt;driver&amp;lt;/artifactid&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;10.14&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In command line:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mvn install:install-file -Dfile=PATH_TO_DRIVER/ojdbc14.jar -DgroupId=com.oracle -DartifactId=driver -Dversion=10.14 -Dpackaging=jar&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-19735906117010523?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/19735906117010523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2010/06/oracle-driver-in-maven.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/19735906117010523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/19735906117010523'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2010/06/oracle-driver-in-maven.html' title='Oracle driver in Maven'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-3604482788039903009</id><published>2010-04-17T22:55:00.007+03:00</published><updated>2010-04-17T23:30:40.803+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Fluent Interface Inheritance</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://hungrygeek.com.au/wp-content/uploads/2009/08/body_language-101.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 173px; height: 173px;" src="http://hungrygeek.com.au/wp-content/uploads/2009/08/body_language-101.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;Fluent Interface&lt;/a&gt; is a convenient way of writing DSLish code in the general-purpose programming language. Some of the examples are quite impressive. But there comes a problem when you try to reuse this pattern via inheritance, because the basic method chaining implementations do not actually support it very well. I will use a JPA example found in Wikipedia to demonstrate the problem:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public Collection&amp;lt;Student&amp;gt; findByNameAgeGender(String name, int age, Gender gender) {&lt;br /&gt; return em.createNamedQuery("Student.findByNameAgeGender")&lt;br /&gt;  .setParameter("name", name)&lt;br /&gt;  .setParameter("age", age)&lt;br /&gt;  .setParameter("gender", gender)&lt;br /&gt;  .setFirstResult(1)&lt;br /&gt;  .setMaxResults(30)&lt;br /&gt;  .setHint("hintName", "hintValue")&lt;br /&gt;  .getResultList();&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Looking at this code we can now create a naive Query implementation:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public interface Query {&lt;br /&gt; Query setParameter (String name, Object value);&lt;br /&gt; Collection getResultList() throws SqlException;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class PreparedSqlQuery implements Query {&lt;br /&gt; protected Map params = new HashMap();&lt;br /&gt; public Query setParameter (String name, Object value) {&lt;br /&gt;  params.add(name, value);&lt;br /&gt;  return this;&lt;br /&gt; }&lt;br /&gt; public Collection getResultList() throws SqlException {&lt;br /&gt;  // Execute query and return results&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class SimpleQueryUser {&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;  new PreparedSqlQuery().setParameter("name", "value").getResultList();&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;No problems at all, our Fluent Interface is clean and elegant. But what happens when you create a subclass for executing prepared statements? You don't want to implement all that multiple setXxx methods once again, and instead decide to inherit from PreparedSqlQuery:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public class StoredProcedureCall extends PreparedSqlQuery {&lt;br /&gt; protected String outputParameter = null;&lt;br /&gt; // Stored procedures may have both input and output parameters&lt;br /&gt; public StoredProcedureCall setOutputParameter(String param) {&lt;br /&gt;  outputParameter = param;&lt;br /&gt; }&lt;br /&gt; public Collection getResultList() throws SqlException {&lt;br /&gt;  // Execute stored procedure and return results&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class SimpleQueryUser {&lt;br /&gt;public static void main(String[] args) throws Exception {&lt;br /&gt; // This works fine&lt;br /&gt; new StoredProcedureCall().setOutputParameter("OUT").setParameter("name", "value").getResultList();&lt;br /&gt; // This produces compilation errors&lt;br /&gt; new StoredProcedureCall().setParameter("name", "value").setOutputParameter("OUT").getResultList();&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The second oneliner produces a compilation error because Query object returned by setParameter() does not actually have setOutputParameter() method. To address this problem we can use &lt;a href="http://www.java-tips.org/java-se-tips/java.lang/covariant-return-types.html"&gt;return type covariance&lt;/a&gt;, which is a language feature added to Java 5. Here goes a fixed version of our StoredProcedureCall:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public class StoredProcedureCall extends PreparedSqlQuery {&lt;br /&gt; protected String outputParameter = null;&lt;br /&gt; public StoredProcedureCall setOutputParameter(String param) {&lt;br /&gt;  outputParameter = param;&lt;br /&gt; }&lt;br /&gt; // Compiler allows us to use StoredProcedureCall instead of Query as the return type here because StoredProcedureCall implements Query&lt;br /&gt; public StoredProcedureCall setParameter (String name, Object value) {&lt;br /&gt;  super.setParameter(name, value);&lt;br /&gt;  return this;&lt;br /&gt; }&lt;br /&gt; public Collection getResultList() throws SqlException {&lt;br /&gt;  // Execute stored procedure and return results&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Actually you can see exactly the same approach used in the real-world Query implementations, like &lt;a href="http://openjpa.apache.org/builds/latest/docs/javadoc/org/apache/openjpa/persistence/OpenJPAQuery.html#setParameter%28java.lang.String,%20java.lang.Object%29"&gt;OpenJPAQuery&lt;/a&gt;. Now what if you don't want to override all that numerous setXxx methods in all subclasses just to change their return types? Here is my solution utilizing another Java 5 language feature - &lt;a href="http://en.wikipedia.org/wiki/Generics_in_Java"&gt;Generics&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;public interface Query &amp;lt;T extends Query &amp;gt;{&lt;br /&gt; T setParameter (String name, Object value);&lt;br /&gt; Collection getResultList() throws SqlException;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class PreparedSqlQuery&amp;lt;S extends PreparedSqlQuery&amp;gt; implements Query&amp;lt;S&amp;gt; {&lt;br /&gt; protected Map params = new HashMap();&lt;br /&gt; public S setParameter (String name, Object value) {&lt;br /&gt;  params.add(name, value);&lt;br /&gt;  return (S) this;&lt;br /&gt; }&lt;br /&gt; public Collection getResultList() throws SqlException {&lt;br /&gt;  // Execute query and return results&lt;br /&gt; }&lt;br /&gt; // Hide constructor, use factory to ensure users won't try to do something like: new PreparedSqlQuery&amp;lt;StoredProcedureCall&amp;gt;().setOutputParameter&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// We make it generic too to enable further extension&lt;br /&gt;public class StoredProcedureCall&amp;lt;R extends StoredProcedureCall&amp;gt; extends PreparedSqlQuery&amp;lt;StoredProcedureCall&amp;gt; {&lt;br /&gt; protected String outputParameter = null;&lt;br /&gt; public R setOutputParameter(String param) {&lt;br /&gt;  outputParameter = param;&lt;br /&gt;  return (R) this;&lt;br /&gt; }&lt;br /&gt; // Note we don't have to override setParameter here&lt;br /&gt; public Collection getResultList() throws SqlException {&lt;br /&gt;  // Execute stored procedure and return results&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class EntityManager {&lt;br /&gt; public static StoredProcedureCall&amp;lt;StoredProcedureCall&amp;gt; createStoredProcCall() {&lt;br /&gt;  return new StoredProcedureCall&amp;lt;StoredProcedureCall&amp;gt;();&lt;br /&gt; }&lt;br /&gt; public static PreparedSqlQuery&amp;lt;PreparedSqlQuery&amp;gt; createNamedQuery() {&lt;br /&gt;  return new PreparedSqlQuery&amp;lt;PreparedSqlQuery&amp;gt;();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class SimpleQueryUser {&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;  EntityManager.createStoredProcCall().setParameter("name", "value").setOutputParameter("OUT").getResultList();&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;All that trickery with generics is done to fool the compiler. Good thing about it is that no additional methods are created, that means there are no super calls, which can potentially improve runtime performance. Bad things are obvious too:&lt;ol&gt;&lt;li&gt;It is not safe unless you are using factories to instantiate that builders;&lt;/li&gt;&lt;li&gt;It is definitely not obvious and looks ugly;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Disclaimer: this is a hack, never use it in your code :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-3604482788039903009?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/3604482788039903009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2010/04/fluent-interface-inheritance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3604482788039903009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3604482788039903009'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2010/04/fluent-interface-inheritance.html' title='Fluent Interface Inheritance'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-1261295077865745351</id><published>2010-01-29T15:19:00.012+02:00</published><updated>2010-07-13T08:49:28.069+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Reverse AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><title type='text'>WebSphere + GWT + Comet</title><content type='html'>IBM supports Reverse AJAX (AKA &lt;a href="http://en.wikipedia.org/wiki/Comet_%28programming%29"&gt;Comet&lt;/a&gt;) in a form of &lt;a href="http://www.ibm.com/developerworks/websphere/techjournal/0802_haverlock/0802_haverlock.html"&gt;WebSphere Feature Pack for Web 2.0&lt;/a&gt; for WebSphere Application Server 6.0+. It is shipped by default with the latest fix packs for WAS 6.1 and in all 7.0 versions. Actually this Feature Pack has a lot of nice Web 2.0 features, but at the moment we are interested in &lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.webmsg.help/docs/GettingStarted.html"&gt;Web Messaging Service&lt;/a&gt; only.&lt;br /&gt;&lt;br /&gt;To install and enable FP you need to follow the &lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.web20fep.multiplatform.doc/info/welcome_nd.html"&gt;documentation&lt;/a&gt;, it won't take long. As the result you will get the ability to push data to your client's web browser by publishing it to the special JMS topics. As an alternative, you may also use a more specialized API for doing this, but the Publisher object is stored in the Servlet context, therefore it can be somewhat tricky to access it from an arbitrary part of your application, which is not true with JMS.&lt;br /&gt;&lt;br /&gt;I assume that you have successfully installed and tested your Web Messaging, and now want to upgrade your &lt;a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.web20fep.multiplatform.doc/info/welcome_nd.html"&gt;QuoteStreamer sample application&lt;/a&gt; to GWT. For example, you have a widget and want its methods to be called when some data arrives from the backend.&lt;br /&gt;&lt;br /&gt;It is possible to use &lt;a href="http://googlewebtoolkit.blogspot.com/2008/07/getting-to-really-know-gwt-part-1-jsni.html"&gt;JSNI&lt;/a&gt; to achieve exactly this goal. The idea is simple: when you need to push some object to the client (for example, out of your Message Driven Bean), you first serialize it using &lt;a href="http://code.google.com/intl/ru/webtoolkit/doc/1.6/DevGuideServerCommunication.html"&gt;GWT RPC mechanism&lt;/a&gt;, then put the resulting string to the appropriate JMS Topic. This string is wrapped to JSON envelope, sent to the client via WFP and unwrapped there via Dojo. Your JavaScript listener should be triggered at this moment. But as we use GWT for all our JavaScript programming, we should implement that listener as JSNI snippet:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;private native void initCallbackAndSubscribe (String someParam) /*-{&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    if ($wnd.dojox) {&lt;br /&gt;$wnd.dojox.cometd.subscribe("/test/" + someParam, this, &lt;/code&gt;&lt;code&gt;function (comet) {&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    module.@com.test.MyCoolWidget::onReverseAjax(Ljava/lang/String;)(comet.data)&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;}&lt;/code&gt;&lt;code&gt;);&lt;br /&gt;}&lt;br /&gt;}-*/;&lt;br /&gt;&lt;br /&gt;// This is a normal Java code&lt;br /&gt;public void &lt;/code&gt;&lt;code&gt;onReverseAjax&lt;/code&gt;&lt;code&gt;(String msg) throws &lt;/code&gt;&lt;code&gt;SerializationException &lt;/code&gt;&lt;code&gt;{&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;SerializationStreamReader r = ((SerializationStreamFactory) svc).createStreamReader(msg);&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    Object data = &lt;/code&gt;&lt;code&gt;r.readObject();&lt;br /&gt;&lt;/code&gt;&lt;code&gt;    // Do something with that data arrived&lt;br /&gt;&lt;/code&gt;&lt;code&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;As you see, the data is deserialized later in your normal Java code called by this listener. That's it. If you have initialized everything right (in your index.jsp or some similar place), this scheme should work fine. Now I will show you how to send data using GWT RPC. It should be simple via RPC.encodeResponseForSuccess method, but there is one problem - it requires SerializationPolicy object for the security reasons. This mechanism restricts serialized objects to the limited set described in *.gwt.rpc files, generated during compilation. Another problem is that there can be several such files. I haven't found a good way to get the SerializationPolicy other than by concatenating these files altogether:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;public SerializationPolicy getSerializationPolicy() throws Exception {&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;String result = "";&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;for (File file : new File(PATH_TO_YOUR_GENERATED_STUFF).listFiles(new FilenameFilter() {&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;public boolean accept(File dir, String name) {&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;return name.endsWith(".rpc");&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;}&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;})) {&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;&lt;/code&gt;result += (FileUtils.readFileToString(file));&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;}&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;return SerializationPolicyLoader&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;.loadFromStream(new ByteArrayInputStream(result&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;&lt;code&gt;    &lt;/code&gt;.getBytes("UTF-8")), null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void publishObject(String topic, Object obj, Method method) throws Exception {&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;String r = RPC.encodeResponseForSuccess(method, obj, getSerializationPolicy());&lt;br /&gt;&lt;code&gt;    &lt;/code&gt;publishStringViaJms(topic, r.toString());&lt;br /&gt;}&lt;/pre&gt;I forgot to mention that RPC.encodeResponseForSuccess requires a Method instance, but it is used only to extract the return value type, so any method returning the object of the obj.getClass() type will do.&lt;br /&gt;&lt;br /&gt;In general, there are some good things about such WebSphere + GWT + Comet integration, the major one is that it uses WFP, which is a pretty powerful Comet server, compared to some custom-built solutions. For example (at least on WAS 7.0), it uses connection multiplexing, nio and all that cool stuff you expect from the modern web server. Also, it naturally integrates into your ESB, so you can use it in your Process Server applications with ease. Some limitations are obvious too, for example it won't work in GWT Hosted Mode with Tomcat. Also it seems to me that this should be implemented somehow simpler, but I was unable to find it. So if you have any other ideas, please give me a clue.&lt;br /&gt;&lt;br /&gt;P.S.: Actually, there are some alternatives to this approach. For example you can use &lt;a href="http://code.google.com/p/gwt-comet-streamhub/"&gt;gwt-comet-streamhub&lt;/a&gt; to enable Reverse AJAX for your GWT applications. But it provides its own Comet server called &lt;a style="font-style: italic;" href="http://www.stream-hub.com/"&gt;StreamHub&lt;/a&gt; which is definitely not a part of the IBM WebSphere product line :)&lt;br /&gt;&lt;br /&gt;P.P.S.: The described method should work with other Comet-enabled J2EE servers like &lt;a href="http://docs.codehaus.org/display/JETTY/Cometd+%28aka+Bayeux%29"&gt;Jetty&lt;/a&gt; with minor modifications.&lt;br /&gt;&lt;br /&gt;P.P.P.S.: There is left one more issue with security. As for now, it is not really clear for me how to implement role-based security for Comet... I can think of using several update servlets at the same time, and it should allow me to use webapp security. But this issue definitely needs further investigation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-1261295077865745351?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/1261295077865745351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2010/01/websphere-gwt-comet.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1261295077865745351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1261295077865745351'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2010/01/websphere-gwt-comet.html' title='WebSphere + GWT + Comet'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5360230855431866070</id><published>2010-01-26T09:30:00.008+02:00</published><updated>2010-01-28T09:14:47.258+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WADL'/><category scheme='http://www.blogger.com/atom/ns#' term='Web services'/><category scheme='http://www.blogger.com/atom/ns#' term='toolbox'/><title type='text'>WADL toolbox</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_arwiFr_8Dbk/S16kcDNzwTI/AAAAAAAAAIE/3FW9yvQWPAo/s1600-h/soapui.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 263px; height: 230px;" src="http://4.bp.blogspot.com/_arwiFr_8Dbk/S16kcDNzwTI/AAAAAAAAAIE/3FW9yvQWPAo/s400/soapui.png" alt="" id="BLOGGER_PHOTO_ID_5430959002461913394" border="0" /&gt;&lt;/a&gt;&lt;a href="http://weblogs.java.net/blog/mhadley/archive/2005/05/introducing_wad.html"&gt;WADL&lt;/a&gt; stands for Web Application Description Language and currently is in a state of &lt;a href="http://www.w3.org/Submission/wadl/"&gt;W3C Member Submission&lt;/a&gt;, that means at the early stage of W3C standardization process. The purpose of the "language" is similar to &lt;a href="http://www.w3schools.com/WSDL/wsdl_intro.asp"&gt;WSDL&lt;/a&gt;, with the orientation towards &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;RESTful APIs&lt;/a&gt; in the first place. What is essential for me is that this language perfectly suits the task of &lt;a href="http://code.google.com/p/pomodoro-server/"&gt;Pomodoro Server&lt;/a&gt; API description. There are surprisingly few tools utilizing this format, I guess this is due to the immaturity of the language. Though I can name some of the most useful ones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://jersey.dev.java.net/"&gt;Jersey&lt;/a&gt;, a reference implementation of &lt;a href="http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features"&gt;JAX-RS&lt;/a&gt;. It is able to &lt;a href="http://wikis.sun.com/display/Jersey/WADL"&gt;generate WADL&lt;/a&gt; at run time based on the metadata found in your Java classes.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.soapui.org/"&gt;soapUI&lt;/a&gt;, a great tool for testing web services. As one of its numerous new features in version 2.5 it can &lt;a href="http://www.soapui.org/userguide/rest/index.html"&gt;utilize WADL&lt;/a&gt; web service description and generate sample test cases automagically. It can even do the trick in the opposite direction, i. e. &lt;a href="http://www.soapui.org/userguide/rest/inference.html"&gt;infer both WADL and XSD&lt;/a&gt; from the existing test case structure! Unfortunately I've found some aspects of this generation somewhat &lt;strike&gt;buggy&lt;/strike&gt; not really obvious. For example, it does not inherit template parameters for nested resources. And despite the ability to specify application-wide settings for HTTP Basic Auth, it does not get applied somehow, so it should be specified for each test case separately. Anyway, it is a great tool and I'm looking forward to see it in a bit more stable state.&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/mnot/wadl_stylesheets/"&gt;WADL to HTML&lt;/a&gt; is an advanced XSLT stylesheet to generate documentation from your WADLs. It seems that either my WADL is all wrong (then why it conforms to the &lt;a href="https://wadl.dev.java.net/wadl200610-rddl.xhtml"&gt;WADL Schema&lt;/a&gt;?), or my XSLT processors are broken (both &lt;a href="http://saxon.sourceforge.net/"&gt;Saxon&lt;/a&gt; and &lt;a href="http://xml.apache.org/xalan-j/"&gt;Xalan&lt;/a&gt; running on Windows and Linux), because I was unable to get any output. But they say it works for them, so I tend to think it is actually my own problem. Anyway, I've already wrote my own simple XSLTs and going to put it here in a matter of few days :)&lt;/li&gt;&lt;li&gt;&lt;a href="https://wadl.dev.java.net/wadl2java.html"&gt;wadl2java&lt;/a&gt;  generates a web service client based on WADL. It uses &lt;a href="https://jaxb.dev.java.net/"&gt;JAXB&lt;/a&gt; to create the necessary representations based on XSD referred in &lt;span style="font-style: italic;"&gt;grammars&lt;/span&gt; section.&lt;/li&gt;&lt;li&gt;&lt;a href="http://tomayac.de/rest-describe/latest/RestDescribe.html"&gt;REST Describe &amp;amp; Compile&lt;/a&gt; is yet another client generator. It can infer WADL from the set of supplied request URLs, and then generate client code in several languages, namely Java and Python. The tool looks promising, but as for me, the UI is not intuitive enough. Also, you have no control over code generation, so good chances are that you will have to modify your clients manually after generation. &lt;a href="http://docs.google.com/Doc?id=dgdcn6h3_38fz2vn5"&gt;Here&lt;/a&gt; you can find a great deal of documentation for the tool and underlying concepts.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;P. S.: You can find WADL for Pomodoro Server &lt;a href="http://code.google.com/p/pomodoro-server/source/browse/trunk/src/pomodoro.wadl"&gt;here&lt;/a&gt;. Also you can see some &lt;a href="http://code.google.com/p/pomodoro-server/wiki/GeneratedAPI"&gt;generated documentation&lt;/a&gt; in the &lt;a href="http://code.google.com/projecthosting/"&gt;Google Code&lt;/a&gt; &lt;a href="http://code.google.com/p/support/wiki/WikiSyntax"&gt;wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5360230855431866070?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5360230855431866070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2010/01/wadl-toolbox.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5360230855431866070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5360230855431866070'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2010/01/wadl-toolbox.html' title='WADL toolbox'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_arwiFr_8Dbk/S16kcDNzwTI/AAAAAAAAAIE/3FW9yvQWPAo/s72-c/soapui.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2538868691088848819</id><published>2009-12-23T12:56:00.004+02:00</published><updated>2009-12-23T17:18:55.098+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mindmaps'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='Portal'/><title type='text'>Some useful JSR-168 resources</title><content type='html'>While trying to figure out the essentials of portlet development, I found few useful resources on this topic:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developers.sun.com/portalserver/reference/techart/jsr168/pb_whitepaper.pdf"&gt;Introduction to JSR 168—The Java Portlet Specification&lt;/a&gt; (pdf)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.developer.com/article.php/10915_3366111_1/Understanding-the-Java-Portlet-Specification.htm"&gt;Understanding the Java Portlet Specification&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-jstl0415/"&gt;I18n in portlets&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here goes a mindmapped extract of those two:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_arwiFr_8Dbk/SzH62Zfr3lI/AAAAAAAAAH8/MwAORe3khPM/s1600-h/JSR168+Portlets.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 168px;" src="http://4.bp.blogspot.com/_arwiFr_8Dbk/SzH62Zfr3lI/AAAAAAAAAH8/MwAORe3khPM/s400/JSR168+Portlets.png" alt="" id="BLOGGER_PHOTO_ID_5418387639167082066" 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/3627102742438898505-2538868691088848819?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2538868691088848819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/12/some-useful-jsr-168-resources.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2538868691088848819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2538868691088848819'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/12/some-useful-jsr-168-resources.html' title='Some useful JSR-168 resources'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_arwiFr_8Dbk/SzH62Zfr3lI/AAAAAAAAAH8/MwAORe3khPM/s72-c/JSR168+Portlets.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7565523631209780137</id><published>2009-12-17T17:43:00.003+02:00</published><updated>2009-12-17T17:47:44.588+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Using Spring in server side of GWT</title><content type='html'>Thanks to &lt;a href="http://pgt.de/2009/07/17/non-invasive-gwt-and-spring-integration-reloaded/"&gt;this post&lt;/a&gt;, I was able to use Spring in my GWT-RPC services. Though, I had to fix it a bit - use &lt;code&gt;autowireBeanProperties&lt;/code&gt; instead of &lt;code&gt;autowireBean&lt;/code&gt; (otherwise my services didn't get populated).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7565523631209780137?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7565523631209780137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/12/using-spring-in-server-side-of-gwt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7565523631209780137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7565523631209780137'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/12/using-spring-in-server-side-of-gwt.html' title='Using Spring in server side of GWT'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7354166405947364551</id><published>2009-11-07T19:36:00.008+02:00</published><updated>2009-11-07T21:15:57.908+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='JAXB'/><category scheme='http://www.blogger.com/atom/ns#' term='Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='HyperJAXB'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Relational storage using JAXB, JPA and HyperJAXB</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2utjXD-6neI/SnHuTNgwRKI/AAAAAAAABh0/UdWpXcWCIG8/s400/silver_bullet.jpg"&gt;&lt;img style="margin: 0pt 10pt 10px 0px; float: left; cursor: pointer; width: 250px; height: 250px;" src="http://4.bp.blogspot.com/_2utjXD-6neI/SnHuTNgwRKI/AAAAAAAABh0/UdWpXcWCIG8/s400/silver_bullet.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span lang="EN-US"&gt;Let us imagine a situation when you are writing an application sitting on the ESB, or providing a web service enabled interface. In both cases you will probably end up having some XML Schema describing your data transfer format. Also, good chances are that you will have to have a RDBMS schema, too. Usually both are designed, implemented and documented separately. But when you write your application from scratch, you have a unique possibility to seriously reduce amount of work need to be done. Here I want to share some of my ideas how to achieve this.&lt;/span&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Few variants are possible. You can start with DDL, &lt;a href="https://www.hibernate.org/hib_docs/tools/reference/en/html_single/#d0e1193"&gt;generate&lt;/a&gt; JPA-annotated beans using &lt;a href="https://www.hibernate.org/255.html"&gt;Hibernate Tools&lt;/a&gt; for example, and then annotate it with some JAXB stuff (or use something not requiring annotations at all, like &lt;a href="http://xstream.codehaus.org/"&gt;XStream&lt;/a&gt;). You will be able to get an XSD using some JavaBeans-to-XSD tool (like you have in IBM Rational tools when generating WSDLs for given beans), or just generate a bunch of sample XML files by marshaling some test data and use any modern XML editor to &lt;a href="http://www.dotkam.com/2008/05/28/generate-xsd-from-xml/"&gt;generate XSD by example&lt;/a&gt;. But I must warn you that the XSD will be rather ugly, because usually you don't have too much control over the whole process, that's why the proper tooling is vital for success. Nevertheless, this approach is quite common and supported by many powerful tools, such as my favorite IBM Rational Software Architect 7.5.&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;From the other hand, you can start with some UML and generate Java Beans, then put all the necessary annotations (both JAXB and JPA) inside. But you will have to do a double amount of work fixing the beans structure and hardcoding annotations for both technologies. Once again, you will need to fix the resulting XSD manually, that's for sure.&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;What I prefer to do is design the data layer entirely in XSD (which maps to Java classes in a more natural way than DDL), then generate Java beans using JAXB or something similar, enrich it with JPA annotations and generate DDL as the result. Sounds pretty nice, but there are some problems, particularly at the JPA annotations stage. The major one is that you lose flexibility in XSD changing, because after each change your beans will be generated again and you will lose all your precious annotations (yes, you can keep JPA configuration in XML, but this approach has its own drawbacks, and it's beyond the scope of this post anyway). &lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Fortunately there exists a tool which reduces (and in some cases can even eliminate it at all) the amount of the manual work at the JPA stage. It is implemented by &lt;a href="http://lexicore.blogspot.com/"&gt;Aleksei Valikov&lt;/a&gt; and called &lt;a href="http://confluence.highsource.org/display/HJ3/Home"&gt;HyperJAXB 3&lt;/a&gt; (version 1 is outdated and version 2 supports Hibernate instead of pure JPA). It is more-or-less a plugin set for &lt;a href="http://java.sun.com/webservices/docs/1.6/jaxb/xjc.html"&gt;XJC&lt;/a&gt;, adding JPA annotations to JAXB-generated beans. It is &lt;a href="http://confluence.highsource.org/display/HJ3/Downloads"&gt;distributed&lt;/a&gt; as an easy to use bundle containing everything (including build.xml) to start converting your XSDs to JAXB + JPA enabled Java Beans. &lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Here comes the concepts of relationships and keys. The problem is, when not specified explicitly, HyperJAXB creates an autogenerated integer ID for every entity, which is not always what you really want to get. Let me explain. I want to automate not only the data schema creation, but also the API to access data. For example, when there comes an XML from the client, I don't want to check if the same piece of data is already present in my DB (in fact it can be a hell lot of work to do, especially when some complex, deeply nested XML structures are considered). I want the intelligent middleware to &lt;a href="http://blog.xebia.com/2009/03/23/jpa-implementation-patterns-saving-detached-entities/"&gt;merge it automatically&lt;/a&gt; with the existing data. But it won't happen by default, because of the autogenerated IDs, which are always issued new. So, if you will try to persist the same XML twice, it will put two copies in your DB, which is probably not what you expect to see. &lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;To fix this behavior, you need to explicitly specify the meaningful IDs for your entities. With HyperJAXB you can specify it directly in your XSD by marking some of the entity fields with the special XSD annotation in the same way you document your schemas (For details please consult &lt;a href="http://confluence.highsource.org/display/HJ3/Documentation"&gt;HyperJAXB documentation&lt;/a&gt;. Yes, you still can't use the XSD uniqueness constraints support because it's &lt;a href="http://jira.highsource.org/browse/HJIII-13"&gt;a bit too hard&lt;/a&gt; to parse by XJC-like tool). Same is true for the relationship options – for example, you can define one-to-many with all the possible JPA attributes, so it's quite flexible in case you need it. &lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;So far, so good. Things start being complicated when you have compound IDs (and I think it happens really soon in the real life applications). Fortunately HyperJAXB gained support for IdClass &lt;a href="http://markmail.org/message/wp45bguix3ncddak"&gt;few weeks ago&lt;/a&gt;. But here comes another problem of “cascading” IDs – when you have a complex primary key (in entity A) used as a foreign key in another entity (B), which at the same time is a part of its (B's) primary key. We had a brief &lt;a href="http://markmail.org/message/2evf6nd2gbembgn3"&gt;discussion&lt;/a&gt; on this topic with Aleksei (BTW, I want to say THANKS! for his great instant support for HyperJAXB and related stuff), and it seems to be too hard to implement in the foreseeable future due to some limitations of XJC extension mechanisms. So, the only way out is to tweak generated beans manually. Well, I think it is something like 20% of the job, and another 80% is done automatically.&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;So, in the end the results are pretty sweet. You design your data structure as XML Schema (which itself can be generated based on XML samples). Then you put some metadata (mostly ID information) inside to make sure it is complete. Now you run HyperJAXB against your XSDs and fix the generated Java Beans in case you need to handle some “complex” situations. Then, using one of the tools (either Hibernate Tools or &lt;a href="http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/ref_guide_mapping.html#ref_guide_ddl_examples"&gt;OpenJPA Mapping Tool&lt;/a&gt;) you get DDL in a matter of seconds. After that you are able to (un)marshal your entities in a single line of code using JAXB, and load / merge them from / to any RDBMS in a single LOC using JPA. That totally eliminates all the serialization and storage-related code, reducing complexity, improving reliability, bla-bla-bla :)&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;P. S.: I must warn you that there are some issues when using this approach with different JPA providers. I've tried both Hibernate and OpenJPA and they seem to be not really compatible with each other for anything but the most trivial models. It worth a separate post and I'm not going to explain it here, just to make it short: I prefer OpenJPA over Hibernate nowadays, because I find it less restricting in defining relationships and complex IDs. Also, from the tooling point of view, those are pretty close.&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;P. P. S.: HyperJAXB functionality is growing rapidly, so I won't be surprised to see the majority of the issues mentioned in this post addressed in the upcoming releases. I wish this project good luck and can't wait to see it gaining popularity in the JEE development community.&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;P. P. P. S.: Code samples and / or detailed tutorial will come later, because it is a considerable amount of work and I'm pretty busy nowadays. Though, if you have any questions regarding the aforementioned approach, please feel free to ask.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7354166405947364551?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7354166405947364551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/11/relational-storage-using-jaxb-jpa-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7354166405947364551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7354166405947364551'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/11/relational-storage-using-jaxb-jpa-and.html' title='Relational storage using JAXB, JPA and HyperJAXB'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2utjXD-6neI/SnHuTNgwRKI/AAAAAAAABh0/UdWpXcWCIG8/s72-c/silver_bullet.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7976795043429736501</id><published>2009-08-28T12:38:00.000+03:00</published><updated>2009-08-28T12:39:25.467+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Web 3.0 Explained</title><content type='html'>&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Rd21qGeQbp0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Rd21qGeQbp0&amp;amp;hl=en&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7976795043429736501?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7976795043429736501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/08/web-30-explained.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7976795043429736501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7976795043429736501'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/08/web-30-explained.html' title='Web 3.0 Explained'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2213265506074135677</id><published>2009-08-17T13:43:00.009+03:00</published><updated>2010-02-02T11:54:32.460+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Very Simple RESTful Web Services in Python</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.vanille-media.de/images/python.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 267px; height: 235px;" src="http://www.vanille-media.de/images/python.png" alt="" border="0" /&gt;&lt;/a&gt;I was trying to find something for easy implementation of web services in any CGI language. Firstly I considered PHP. A lot of negative emotions, nothing really simple and a wasted day. Perl has some better support for the stuff, but I've chosen Python (mostly because I've got less experience in it and wanted to give it a try).&lt;br /&gt;&lt;br /&gt;Python has a CGI-like standard called &lt;a href="http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface"&gt;WSGI&lt;/a&gt;, which makes Web Services implementation much easier. But still not that easy, as I want it. So, spent a day writing my own "library", which you can find &lt;a href="http://code.google.com/p/python-very-simple-web-services/"&gt;here&lt;/a&gt;, hosted on Google Code. Now you can write RESTful Web Services like this:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;a name="Examples"&gt;&lt;span class="lit"&gt;@url_pattern&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"/users/${username}/plans/${year}"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;[&lt;/span&gt;&lt;span class="str"&gt;'GET'&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;'PUT'&lt;/span&gt;&lt;span class="pun"&gt;])&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="kwd"&gt;def&lt;/span&gt;&lt;span class="pln"&gt; get_plans &lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;username&lt;/span&gt;&lt;span class="pun"&gt;, year, request):&lt;/span&gt;&lt;span class="pln"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span class="kwd"&gt;return&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="str"&gt;"Inside get_plans('%s', '%s')"&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;%&lt;/span&gt;&lt;span class="pln"&gt; (username, year)&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;I'm gonna use it to implement a very first version of &lt;a href="http://code.google.com/p/pomodoro-server/"&gt;Pomodoro Server&lt;/a&gt;. Some brief impressions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Python is very easy to learn and has a lot of great metaprogramming capabilities, very similar to Ruby. Great language, it's a pleasure to code it!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Python's documentation is just awesome!&lt;/li&gt;&lt;li&gt;Some Web Frameworks provide the similar functionality, but it's painful to install and comes with a lot of other heavyweight features, such as MVC and ORM.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google Code is a nice place to host your projects, though there are some limitations (for example, wiki is very basic and not compatible with anything else).&lt;/li&gt;&lt;/ul&gt;Update: I've just found a similar thing in Java, defined in &lt;a href="https://jsr311.dev.java.net/"&gt;JSR-311: JAX-RS - Java API for RESTful Web Services&lt;/a&gt; and implemented as &lt;a href="https://jersey.dev.java.net/"&gt;Jersey&lt;/a&gt;. Just a short sample from its &lt;a href="http://docs.sun.com/app/docs/doc/820-4867?l=en"&gt;tutorial&lt;/a&gt;:&lt;pre&gt;@Path("/users/{username}")&lt;br /&gt;public class UserResource {&lt;br /&gt;  @GET&lt;br /&gt;  @Produces("text/xml")&lt;br /&gt;  public String getUser(@PathParam("username") String userName) {&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Update2: found a very similar solution for Python called &lt;a href="http://github.com/defnull/bottle#readme"&gt;Bottle&lt;/a&gt;. Sample code:&lt;br /&gt;&lt;pre&gt;@route('/hello/:name')&lt;br /&gt;def hello_name(name):&lt;br /&gt;  return 'Hello %s!' % name&lt;br /&gt;&lt;br /&gt;run(host='localhost', port=8080)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-2213265506074135677?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2213265506074135677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/08/very-simple-restful-web-services-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2213265506074135677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2213265506074135677'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/08/very-simple-restful-web-services-in.html' title='Very Simple RESTful Web Services in Python'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-4669766162687937529</id><published>2009-08-05T16:57:00.000+03:00</published><updated>2009-08-05T17:45:14.614+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><title type='text'>DSL Killer Application</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://deesel.codecauldron.org/SayNoToXMLWebSize.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 213px;" src="http://deesel.codecauldron.org/SayNoToXMLWebSize.png" alt="" border="0" /&gt;&lt;/a&gt;Now I want to point at a really mind-blowing tool called &lt;a href="http://www.jetbrains.com/mps/"&gt;JetBrains Meta Programming System&lt;/a&gt;. You see, some time ago to implement your own &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;Domain-Specific Language&lt;/a&gt; it was necessary to develop a grammar, implement a parser (or use such tools as &lt;a href="http://www.gnu.org/software/bison/"&gt;GNU Bison&lt;/a&gt; for example) which normally operates in &lt;a href="http://en.wikipedia.org/wiki/Simple_API_for_XML"&gt;XML SAX&lt;/a&gt; manner and finally do something with the results obtained. Nowadays these new tools enable you to do virtually all this stuff in kinda type-safe way. It strictly watches at all your manipulations and alerts violations.&lt;br /&gt;&lt;br /&gt;The whole process somehow resembles XDoclet and XSLT a bit, but it's much more reliable, because of the advanced IDEA editor, which takes into account all the necessary constraints, disallowing to misprint something. Still (due to verbose syntax) logical errors at source generation stage are highly possible. Good news is that you can use the whole power of modularity in this process to reduce such risks. Maybe the most striking thing about it is that its own language to define grammar and generate artifacts is also a DSL implemented in the same environment!&lt;br /&gt;&lt;br /&gt;You can download JetBrains MPS &lt;a href="http://www.jetbrains.com/mps/download/index.html"&gt;here&lt;/a&gt; for free and try &lt;a href="http://www.jetbrains.com/mps/docs/tutorial.html"&gt;a tutorial&lt;/a&gt;. It will take some time to get used to the tool's UI. Its strangeness is in fact that there's a pretty complex tree representation behind a text you see on the screen, and it contains a lot of meta-information displayed as special markup signs, different colors, etc. So you shouldn't think of it as of a plain old source code anymore (to see what I'm talking about, just look at XML files inside a simple test project).&lt;br /&gt;&lt;br /&gt;There are some alternatives to this environment, namely &lt;a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx"&gt;Microsoft Visual Studio Domain-Specific Language Tools&lt;/a&gt; and &lt;a href="http://www.metacase.com/products.html"&gt;MetaEdit+&lt;/a&gt;, though I haven't tried any.&lt;br /&gt;&lt;br /&gt;P.S.: Thanks to &lt;a href="http://www.martinfowler.com/bliki/"&gt;Martin Fowler's bliki&lt;/a&gt; for the link - it's a really visionary source of information! Here you can also watch his &lt;a href="http://www.infoq.com/presentations/domain-specific-languages"&gt;video&lt;/a&gt; on this topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-4669766162687937529?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/4669766162687937529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/08/dsl-killer-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4669766162687937529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4669766162687937529'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/08/dsl-killer-application.html' title='DSL Killer Application'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5139410565537708547</id><published>2009-07-14T15:26:00.001+03:00</published><updated>2009-07-14T16:17:02.043+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Metrics'/><category scheme='http://www.blogger.com/atom/ns#' term='cool site'/><category scheme='http://www.blogger.com/atom/ns#' term='OOD'/><title type='text'>Code City</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.inf.unisi.ch/phd/wettel/pics/codecity_screenshot.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 355px; height: 224px;" src="http://www.inf.unisi.ch/phd/wettel/pics/codecity_screenshot.png" alt="" border="0" /&gt;&lt;/a&gt;Today I was reading a book about software metrics called "&lt;a href="http://www.springer.com/computer/programming/book/978-3-540-24429-5"&gt;Object-Oriented Metrics in Practice&lt;/a&gt;" by  &lt;a href="http://www.inf.unisi.ch/faculty/lanza/publications.html"&gt;Michele Lanza&lt;/a&gt; and &lt;a href="http://www.cs.utt.ro/%7Eradum/papers.html"&gt;Radu Marinescu&lt;/a&gt;. It's abouth things like "Design Harmony" and so on.&lt;br /&gt;&lt;br /&gt;Some of the ideas are debatable, for example &lt;a href="http://books.google.com.by/books?id=gdLbgnaMaa0C&amp;amp;lpg=PA46&amp;amp;ots=sZsSyPJtrL&amp;amp;dq=%22Object-Oriented%20Metrics%20in%20Practice%22%20harmony%20poem&amp;amp;hl=en&amp;amp;pg=PA46"&gt;on page 46&lt;/a&gt; they say:&lt;blockquote style="font-style: italic;"&gt;...you cannot understand the beauty of a painting by measuring its frame or understand the depth of a &lt;em&gt;poem&lt;/em&gt; by counting the lines...&lt;br /&gt;&lt;br /&gt;...metrics can help to evaluate and improve designs, but those have to be meaningful metrics that are put in a context of design harmony...&lt;br /&gt;&lt;/blockquote&gt;But at the same time it's obvious that you won't see the beauty of the poem looking on it's grammar, syntax or verse structure (these are more-or-less analogues for software design metrics), without actually reading and understanding the sense. That's why my conclusion is that for creating a &lt;span style="font-style: italic;"&gt;harmonious&lt;/span&gt; software design it's necessary (but not sufficient) for the metrics to be &lt;span style="font-style: italic;"&gt;harmonious, &lt;/span&gt;too&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What I liked most of all was the concept of visualizing software projects as cities. The metaphor includes classes as buildings and packages as districts. It is implemented in a tool called &lt;a href="http://moose.unibe.ch/tools/codecity"&gt;CodeCity&lt;/a&gt;. Some results of its work can be seen on &lt;a href="http://www.inf.unisi.ch/phd/wettel/activities.html"&gt;Richard Wettel's page&lt;/a&gt;, who actually wrote it. Here is just one of them:&lt;br /&gt;&lt;br /&gt;&lt;object style="margin: 0px;" type="application/x-shockwave-flash" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wettel-icse09doc-090520041413-phpapp01&amp;amp;stripped_title=visual-exploration-of-largescale-evolving-software" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wettel-icse09doc-090520041413-phpapp01&amp;amp;stripped_title=visual-exploration-of-largescale-evolving-software"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Though, there are few things which I think can make it even better:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It would be great to see a color scheme based on the developers responsible for changes, for example, using &lt;a href="http://svnbook.red-bean.com/en/1.0/re02.html"&gt;svn blame&lt;/a&gt; (it can be useful for both "normal" and "timeline" views).&lt;/li&gt;&lt;li&gt;Building base should be Sqrt(NOA), not just NOA - it will look more realistic. It also should have an option to scale building height to Log(NOM).&lt;/li&gt;&lt;li&gt;Color scheme should be configurable - for example, it's hard to see some "outdated" buildings on the dark backgrounds.&lt;/li&gt;&lt;/ul&gt;Nevertheless, thank you very much for giving really interesting food for my mind :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5139410565537708547?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5139410565537708547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/07/code-city.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5139410565537708547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5139410565537708547'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/07/code-city.html' title='Code City'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-1115554467876329186</id><published>2009-07-13T15:43:00.001+03:00</published><updated>2009-08-12T16:11:57.456+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Stress Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Grid computing'/><title type='text'>A way to stress-test GUI</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tecacentre.net/funpics/funpics/super_elephant.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 175px; height: 269px;" src="http://www.tecacentre.net/funpics/funpics/super_elephant.jpg" alt="" border="0" /&gt;&lt;/a&gt;What to do if you need to test the performance of your client-server application, which is not on the Web? For example, some kind of Lotus Notes one. The problem is - you can't even execute several Lotus instances on a single machine, so it's quite a tricky task to simulate multiple simultaneous users.&lt;br /&gt;&lt;br /&gt;Virtualization is what you can use in this case. There's an example of working stress testing system consisting of &lt;a href="http://en.wikipedia.org/wiki/Citrix_XenApp"&gt;Citrix XenApp&lt;/a&gt; terminal server running 10 Lotus Notes instances (eating 50 Mb of RAM each), and a load generator running IBM Rational Performance Tester (which is just a very advanced point-and-click thing), which can safely simulate 20 - 40 concurrent users.&lt;br /&gt;&lt;br /&gt;Major bottlenecks of this setup are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;RAM on Terminal Server (it's better to use 64 bit solution)&lt;/li&gt;&lt;li&gt;Network bandwidth (at least 1 Gbit Ethernet)&lt;/li&gt;&lt;li&gt;It takes much longer (up to 4 times) to implement and debug such test cases, compared to usual web testing scenarios&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-1115554467876329186?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/1115554467876329186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/07/way-to-stress-test-gui.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1115554467876329186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1115554467876329186'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/07/way-to-stress-test-gui.html' title='A way to stress-test GUI'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-3836022015044808779</id><published>2009-07-13T13:01:00.000+03:00</published><updated>2009-07-13T13:09:56.787+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>XML Appliances</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www-01.ibm.com/software/integration/datapower/images/xi50_mainframe.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 245px; height: 82px;" src="http://www-01.ibm.com/software/integration/datapower/images/xi50_mainframe.jpg" alt="" border="0" /&gt;&lt;/a&gt;I was surprised to find some hardware XML processors, called &lt;a href="http://en.wikipedia.org/wiki/XML_appliance"&gt;XML Appliances&lt;/a&gt;. They can do XSLT,validation, encryption and many more. Implemented as a separate network device it can be useful in SOA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-3836022015044808779?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/3836022015044808779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/07/xml-appliances.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3836022015044808779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3836022015044808779'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/07/xml-appliances.html' title='XML Appliances'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5569250657512575893</id><published>2009-06-07T23:25:00.000+03:00</published><updated>2009-06-07T23:48:52.333+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='infrastructure'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Things we should add to our build process</title><content type='html'>I want to try some of these and see what happens:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Use &lt;a href="http://sonar.codehaus.org/"&gt;Sonar&lt;/a&gt; for tracking various metrics (it uses all well-known Open Source tools like &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, &lt;a href="http://checkstyle.sourceforge.net/"&gt;Checkstyle&lt;/a&gt;, etc. and &lt;a href="http://sonar.codehaus.org/a-new-hudson-plugin-for-a-closer-integration-with-sonar/"&gt;compatible&lt;/a&gt; with &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;, which we already use in our projects);&lt;/li&gt;   &lt;li&gt;Use &lt;a href="http://clirr.sourceforge.net/clirr-core/index.html"&gt;Cirr&lt;/a&gt; to document public API changes (to know when something really important has changed);&lt;/li&gt;   &lt;li&gt;Use     &lt;a href="http://innig.net/macker/faq.html#goodfor"&gt;Macker&lt;/a&gt; (btw, its' &lt;a href="http://innig.net/macker/faq.html"&gt;FAQ&lt;/a&gt; is really informative, thanks!) to keep dependencies between different modules under control. It first requires &lt;a href="http://innig.net/macker/guide/basic.html#rules"&gt;some modeling&lt;/a&gt;, after which it can break builds in case someone breaks convention;&lt;/li&gt; &lt;/ol&gt; Also, what I want to do in the nearest future is some kind of &lt;span style="font-style: italic;"&gt;retrospective metrics analysis&lt;/span&gt; tool. It will consist of (maybe) set of shell scripts checking out revisions from Subversion repository, compiling code, running &lt;a href="http://www.clarkware.com/software/JDepend.html"&gt;JDepend&lt;/a&gt; and &lt;a href="http://java-source.net/open-source/code-analyzers"&gt;others&lt;/a&gt; against it, applying some XSLTs to its results to combine it altogether into single big XML, putting it then into some kind of 3D storage (Revision * Metric * Module), like OLAP cube in order to analyse it. Theoretically, such tool can generate a great amount of information, and what's interesting is how useful it could actually be.&lt;br /&gt;&lt;br /&gt;The idea was inspired by one of the reports on &lt;a href="http://www.infopark.by/main.aspx?uid=2536"&gt;Software Engineering Forum 2009&lt;/a&gt; (link in Russian).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5569250657512575893?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5569250657512575893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/things-we-should-add-to-our-build.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5569250657512575893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5569250657512575893'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/things-we-should-add-to-our-build.html' title='Things we should add to our build process'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-8894075134924836792</id><published>2009-06-07T22:22:00.000+03:00</published><updated>2009-06-07T22:38:31.177+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool site'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>TeamCity by JetBrains: yet another great CI solution</title><content type='html'>After some excitement about Rational Team Concert features, here comes another one about &lt;a href="http://www.jetbrains.com/teamcity/index.html"&gt;TeamCity&lt;/a&gt;, by &lt;a href="http://www.jetbrains.com/"&gt;JetBrains&lt;/a&gt;, the same company which gave us &lt;a href="http://www.jetbrains.com/idea/index.html"&gt;IntelliJ IDEA&lt;/a&gt; and &lt;a href="http://www.jetbrains.com/resharper/index.html"&gt;ReShaper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, TeamCity is an all-included solution supporting &lt;a href="http://www.jetbrains.com/teamcity/features/index.html"&gt;tons of really advanced features&lt;/a&gt;, among which there are:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.jetbrains.com/teamcity/features/continuous_integration.html#Remote_Build_Run_and_Pre-Tested_Commit"&gt;Remote Run and Pre-tested commit&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.jetbrains.com/teamcity/features/build_grid.html"&gt;Build Grid&lt;/a&gt; (just awesome!)&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.jetbrains.com/teamcity/features/code_quality.html#Code_Coverage_Inspections_and_Duplicates_Search"&gt;Code Coverage, Inspections and Duplicates Search&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.jetbrains.com/teamcity/features/continuous_integration.html#Build_Progress_and_Estimation"&gt;Build Progress and Estimation&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;&lt;a class="improved" href="http://www.jetbrains.com/teamcity/features/continuous_integration.html#Notifications"&gt;Notifications&lt;/a&gt; (of all kinds)&lt;/li&gt; &lt;/ul&gt; You can try and actually &lt;a href="http://www.jetbrains.com/teamcity/buy/edition_comparison.html"&gt;use it for free&lt;/a&gt; until your project is huge enough. It takes just 225 Mb to &lt;a href="http://www.jetbrains.com/teamcity/download/index.html"&gt;download&lt;/a&gt; and 3 minutes to install.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-8894075134924836792?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/8894075134924836792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/teamcity-by-jetbrains-yet-another-great.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8894075134924836792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8894075134924836792'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/teamcity-by-jetbrains-yet-another-great.html' title='TeamCity by JetBrains: yet another great CI solution'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-8153780767595786717</id><published>2009-06-05T18:10:00.000+03:00</published><updated>2009-06-07T22:39:38.199+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><category scheme='http://www.blogger.com/atom/ns#' term='cool site'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Nice short article about IBM Rational Team Concert</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://spicytunas.com/wp-content/uploads/2008/07/teamwork.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 188px;" src="http://spicytunas.com/wp-content/uploads/2008/07/teamwork.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://jazz.net/forums/viewtopic.php?t=4383"&gt;Here it is&lt;/a&gt;. Seems that RTC is even better than I thought... Among cool things mentioned, there are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for Agile methodology out of the box&lt;/li&gt;&lt;li&gt;Original approach to SCM, based on the concept of "streams" (which are essentially branches)&lt;/li&gt;&lt;li&gt;Advanced build system, automatically collecting all supporting artifacts, such as change sets, fixed defects, etc.&lt;/li&gt;&lt;li&gt;A lot of great documentation (like &lt;a href="http://jazz.net/library/article/41"&gt;Getting Started with Jazz Source Control&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What I can add from my personal experience, is that the Major Huge Advantage of RTC is that you get all these features integrated altogether out of the box. Installed it today on Windows 2003 Server - it took just 15 minutes (!) to install and configure a complete team collaboration solution. It normally takes few days to configure something like Trac + Subversion + Hudson, and even longer if you'd like to replace Trac with Redmine or Bugzilla on Linux, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-8153780767595786717?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/8153780767595786717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/nice-short-article-about-ibm-rational.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8153780767595786717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8153780767595786717'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/nice-short-article-about-ibm-rational.html' title='Nice short article about IBM Rational Team Concert'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-4928796521920597362</id><published>2009-06-05T12:11:00.000+03:00</published><updated>2009-06-05T12:24:24.140+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Client JavaScript data storage</title><content type='html'>Cross-browser data storage made easy using &lt;a href="http://pablotron.org/software/persist-js/"&gt;PersistJS&lt;/a&gt;. It supports a lot of different ways of storing data on client browser, falling back to plain old cookies, when necessary. The library itself is really minimalistic and standalone (opposed to &lt;a href="http://www.dojotoolkit.org/node/115"&gt;Dojo Storage&lt;/a&gt;, for example). Also, &lt;a href="http://taffydb.com/index.cfm?oa=faq&amp;amp;q=clientStorage"&gt;it can be integrated&lt;/a&gt; with another lightweight runtime storage solution called "&lt;a href="http://taffydb.com/index.cfm"&gt;Taffy DB&lt;/a&gt;", which will enable almost SQL-like queries in JavaScript. Looks very nice to store some user-related info, session data, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-4928796521920597362?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/4928796521920597362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/client-javascript-data-storage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4928796521920597362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4928796521920597362'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/06/client-javascript-data-storage.html' title='Client JavaScript data storage'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-3269402167983158791</id><published>2009-05-31T14:37:00.000+03:00</published><updated>2009-05-31T15:05:10.197+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projects'/><category scheme='http://www.blogger.com/atom/ns#' term='Pomodoro technique'/><title type='text'>Ultimate Pomodoro?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2252/2300694417_2f1818ede8.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer; width: 170px; height: 250px;" src="http://farm3.static.flickr.com/2252/2300694417_2f1818ede8.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;What is the major problem of using the &lt;a href="http://wintermuteblog.blogspot.com/2009/02/pomodoro-technique.html"&gt;Pomodoro Technique&lt;/a&gt;? I think it's a &lt;a href="http://metalelf0dev.blogspot.com/2009/05/shared-pomodoro-to-share-or-not-to.html"&gt;sharing one&lt;/a&gt;. You see, when you're "in the middle of a pomodoro", no one really cares - your team mates will go on interrupting you anyway!&lt;br /&gt;&lt;br /&gt;So, you need to synchronize it somehow. Setting a single timer per team is a bad idea, for the obvious reasons. What I suggest to do is to invent some kind of a Pomodoro Server and track your current status there (team-wise or project-wise). Of course, the policy should be invented for all team members to check this status before interrupting another person.&lt;br /&gt;&lt;br /&gt;Sample feature list:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Notification when required person's pomodoro has finished&lt;/li&gt;&lt;li&gt;Integration with your &lt;strike&gt;corporate&lt;/strike&gt; favourite IM client as a plugin&lt;/li&gt;&lt;li&gt;Integration with popular issue tracking systems via plugins&lt;/li&gt;&lt;li&gt;Speach recognition to simplify items entry&lt;/li&gt;&lt;li&gt;Flexible hotkeys for all frequent actions to make things even easier&lt;/li&gt;&lt;li&gt;Statistics gathering to analyze and boost personal productivity&lt;/li&gt;&lt;/ul&gt;Hope to find some time to figure it out in a further detail... Frankly speaking, already tried some of the most popular open source voice recognition tools. It seems that either my microphone, or my English, or these tools, or its' settings, or alltogether are too bad to recognize anything but "one [pause] two". With 25% accuracy. Sigh...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-3269402167983158791?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/3269402167983158791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/05/ultimate-pomodoro.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3269402167983158791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3269402167983158791'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/05/ultimate-pomodoro.html' title='Ultimate Pomodoro?'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-214832071888750445</id><published>2009-05-12T23:57:00.000+03:00</published><updated>2009-05-13T00:04:24.624+03:00</updated><title type='text'>About coding</title><content type='html'>I want to separate two different kinds of coding.&lt;br /&gt;&lt;br /&gt;First is handwriting code from scratch, which is a good old not-reusable-bad-to-support approach. It gives me a great pleasure, because I know what to expect and when I solve a Task, it's clear what I've done to complete it. I mean, it's all so clear and predictable, that nothing can spoil your pleasure of getting things done. I used to code this way somewhere about seven years ago writting C++ utils in MS Visual Studio 7.&lt;br /&gt;&lt;br /&gt;Nowadays, things are different. I'm developing Important Enterprise Java Applications, and the &lt;strike&gt;coding&lt;/strike&gt; development sequence looks like this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Find an appropriate Library or Framework.&lt;/li&gt;&lt;li&gt;Choose the one which either the trendiest one (in this case all your further actions will be more painful), or the wider used one (of course, in this case everyone will think that you're starting to lose your grip on modern hi-tech).&lt;/li&gt;&lt;li&gt;Try it on some sample application (though, this stage will not give you any useful information at all).&lt;/li&gt;&lt;li&gt;Try to plug it to your existing application, consisting of Frameworks, Libraries and running on Servers. Configure it (that's where you start hating both XML and lazy developers who suddenly appear not being able to write any meaningful documentation at all). That's where the vast majority of time gets spent.&lt;/li&gt;&lt;li&gt;Fix all bugs and side effects brought by that all-new yet-another Framework. You won't be able to spot all of them fast enough of course, so this stage virtually never ends.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;So, in this world the pleasure of getting things done is usually comes at step 4, when you finally manage to squeeze your brand new part into the puzzle. But that's not it - it has nothing in common with the first Predictable Big Pleasure, and this makes a huge problem for me. Somehow, programming (which is such an interesting and exciting thing in fact!) doesn't make me happy anymore - it became just a job.&lt;br /&gt;&lt;br /&gt;And exactly that's why I'm really looking forward to start coding in Ruby, to see if it's that good, as they say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-214832071888750445?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/214832071888750445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/05/about-coding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/214832071888750445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/214832071888750445'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/05/about-coding.html' title='About coding'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-8334390101272715818</id><published>2009-04-07T13:57:00.000+03:00</published><updated>2009-04-07T14:11:53.226+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>web.xml security limitations</title><content type='html'>It appears that web.xml security is kinda useless in the real world - it has few severe limitations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This will not work at all (several wildcards):&lt;br /&gt;&lt;code&gt;&amp;lt;url-pattern&amp;gt;/stations/*/departure/*&amp;lt;/url-pattern&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;This will not work as expected, because only one security constraint will be checked (both constraints work separately):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  &amp;lt;security-constraint&amp;gt;&lt;br /&gt;      &amp;lt;display-name&gt;Station 14 constraint&amp;lt;/display-name&amp;gt;&lt;br /&gt;      &amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;          &amp;lt;web-resource-name&amp;gt;All station 14'th resources&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;          &amp;lt;url-pattern&amp;gt;&lt;b&gt;/stations/14/*&lt;/b&gt;&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;      &amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;      &amp;lt;auth-constraint&amp;gt;&lt;br /&gt;          &amp;lt;role-name&amp;gt;STATION_14&amp;lt;/role-name&amp;gt;&lt;br /&gt;      &amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;  &amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;security-constraint&amp;gt;&lt;br /&gt;      &amp;lt;display-name&amp;gt;View arrival constraint&amp;lt;/display-name&amp;gt;&lt;br /&gt;      &amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;          &amp;lt;web-resource-name&amp;gt;View arrival page&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;          &amp;lt;url-pattern&amp;gt;&lt;b&gt;/stations/14/arrival/*&lt;/b&gt;&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;      &amp;lt;auth-constraint&amp;gt;&lt;br /&gt;          &amp;lt;role-name&amp;gt;VIEW_ARRIVAL&amp;lt;/role-name&amp;gt;&lt;br /&gt;      &amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;  &amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;Had to spend three days to figure it out :( Now I'm going to investigate &lt;a href="http://static.springframework.org/spring-security/site/"&gt;Spring Security&lt;/a&gt; (AKA &lt;a href="http://www.acegisecurity.org/"&gt;Acegi Security&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-8334390101272715818?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/8334390101272715818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/04/webxml-security-limitations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8334390101272715818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8334390101272715818'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/04/webxml-security-limitations.html' title='web.xml security limitations'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7611155103823214026</id><published>2009-03-20T15:47:00.000+02:00</published><updated>2009-06-07T22:43:26.420+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='infrastructure'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Mercurial vs Subversion</title><content type='html'>&lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; is yet another version control system. According to its' &lt;a href="http://hgbook.red-bean.com/hgbook.pdf"&gt;book&lt;/a&gt;, here are the main differences to Subversion:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mercurial is distributed, i. e. each Mercurial client has his own complete copy of repository, including whole history. That's the main difference to Subversion, which is client-server, so other differences can be considered as side-effects of this.&lt;/li&gt;&lt;li&gt;Merge is much better in Mercurial, which makes it easier to use branches (always a big pain with Subversion). This is really required, because it's the main mechanism of sharing code between developers.&lt;/li&gt;&lt;li&gt;Performance - Mercurial is in general somewhat faster.&lt;/li&gt;&lt;li&gt;Space - Mercurial is more efficient when consuming disk space.&lt;/li&gt;&lt;li&gt;3rd-party integration - Subversion has more integration means, at least now.&lt;/li&gt;&lt;li&gt;Locks - Subversion provides locking mechanism, which is suitable for working with large binary files. Mercurial is not that efficient in this respect, also due to its distributed nature.&lt;/li&gt;&lt;li&gt;Import/Export - Mercurial is able to import and export data from Subversion, CVS, git and others. It makes it easier to migrate to.&lt;/li&gt;&lt;/ul&gt;A simple way to start with Mercurial (at least for Windows users) is to download &lt;a href="http://freefr.dl.sourceforge.net/sourceforge/tortoisehg/TortoiseHg-0.7.exe"&gt;TortoiseHg installer for Windows&lt;/a&gt; (all included).&lt;br /&gt;&lt;br /&gt;Also, &lt;a href="http://doc.bazaar-vcs.org/latest/en/user-guide/index.html"&gt;Bazaar&lt;/a&gt; should be considered as an alternative (&lt;a href="http://sayspy.blogspot.com/2006/11/bazaar-vs-mercurial-unscientific.html"&gt;here&lt;/a&gt; is a good article comparing and explaining those). Yes, Mercurial appears to be much simpler in install and more than 2 times faster than Bazaar for nearly all operations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7611155103823214026?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7611155103823214026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/03/mercurial-vs-subversion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7611155103823214026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7611155103823214026'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/03/mercurial-vs-subversion.html' title='Mercurial vs Subversion'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-3313279099741246238</id><published>2009-03-20T11:17:00.000+02:00</published><updated>2009-06-07T22:43:25.060+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool site'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Complete stack of Redmine</title><content type='html'>When installing &lt;a href="http://www.redmine.org/wiki/redmine/Features"&gt;Redmine&lt;/a&gt; (which seems to be a nice alternative to &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;), I found a site where you can &lt;a href="http://bitnami.org/stacks/"&gt;download complete stacks&lt;/a&gt; of different open source software, like &lt;a href="http://bitnami.org/stack/lampstack"&gt;LAMP&lt;/a&gt;, &lt;a href="http://bitnami.org/stack/trac"&gt;Trac&lt;/a&gt;, etc. Should be very useful when one needs a basic fast installation. Versions there are more-or-less fresh (i. e. 0.10.4 for Trac and 0.8.1 for Redmine).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-3313279099741246238?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/3313279099741246238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/03/complete-stack-of-redmine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3313279099741246238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3313279099741246238'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/03/complete-stack-of-redmine.html' title='Complete stack of Redmine'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-8515033377322420175</id><published>2009-03-02T17:43:00.000+02:00</published><updated>2009-06-07T22:43:46.637+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='infrastructure'/><category scheme='http://www.blogger.com/atom/ns#' term='Continuous Integration'/><title type='text'>Trac + Subversion installation on Windows</title><content type='html'>Here I'll describe a 20 minute procedure of &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; + &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; (the latest versions) installation for 32 bit Windows (successfully tested under Windows XP and Windows 2003 Server). It's really simple and straightforward.&lt;br /&gt;&lt;br /&gt;I assume the following directory structure (my project is called "rw"):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;D:\projects&lt;br /&gt;D:\projects\trac&lt;br /&gt;D:\projects\trac\rw&lt;br /&gt;D:\projects\repos&lt;br /&gt;D:\projects\repos\rw&lt;br /&gt;D:\projects\tools&lt;br /&gt;D:\projects\tools\Python25&lt;br /&gt;D:\projects\tools\svn-win32-1.5.5&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Well, let's get started!&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;Subversion server setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are two ways to install SVN server. I tried both of them and both work fine, so it's up to you which one to choose.&lt;br /&gt;&lt;br /&gt;1.1.1. Download &lt;a href="http://www.visualsvn.com/files/VisualSVN-Server-1.6.3.msi"&gt;VisualSVN server&lt;/a&gt;&lt;br /&gt;1.1.2. Download &lt;a href="http://subversion.tigris.org/files/documents/15/44589/svn-win32-1.5.5.zip"&gt;SVN binaries&lt;/a&gt; (also see complete &lt;a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100"&gt;downloads list&lt;/a&gt;)&lt;br /&gt;1.1.3. Download &lt;a href="http://subversion.tigris.org/files/documents/15/44591/svn-win32-1.5.5_py.zip"&gt;Python bindings for Subversion&lt;/a&gt; (at the same place)&lt;br /&gt;1.1.4. Install VisualSVN to any location, set repositories location to &lt;code&gt;d:\projects\repos&lt;/code&gt; (you can accept defaults for all other options)&lt;br /&gt;1.1.5. Create a repository (you can use management console for this) named "rw" and check a special checkbox to create a standard folder structure (&lt;span style="font-style: italic;"&gt;trunk&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;tags&lt;/span&gt;, etc)&lt;br /&gt;1.1.5. Create a new user for accessing repository. Now you can browse it using this URL and newly created login: &lt;a href="https://localhost:8443/svn/rw/"&gt;https://localhost:8443/svn/rw/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OR&lt;br /&gt;&lt;br /&gt;1.2.1. Download &lt;a href="http://subversion.tigris.org/files/documents/15/44589/svn-win32-1.5.5.zip"&gt;SVN server&lt;/a&gt; from tigris.org (also see complete &lt;a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100"&gt;downloads list&lt;/a&gt;)&lt;br /&gt;1.2.2. Download &lt;a href="http://subversion.tigris.org/files/documents/15/44591/svn-win32-1.5.5_py.zip"&gt;Python bindings for Subversion&lt;/a&gt; (at the same place)&lt;br /&gt;1.2.3. Unzip SVN server to &lt;code&gt;d:\projects\tools&lt;/code&gt;, optionally add its &lt;span style="font-style: italic;"&gt;bin &lt;/span&gt;folder to &lt;span style="font-style: italic;"&gt;PATH&lt;/span&gt;&lt;br /&gt;1.2.4. Create a repository named "rw" (&lt;code&gt;svnadmin create d:\projects\repos\rw&lt;/code&gt;) and create a standard folder structure (trunk, tags, etc) manually&lt;br /&gt;1.2.5. Create a new user for accessing repository (modify &lt;code&gt;D:\projects\repos\rw\conf\passwd&lt;/code&gt; and uncomment a line in &lt;code&gt;D:\projects\repos\rw\conf\svnserve.conf&lt;/code&gt;). Now you can browse it using this URL and newly created login: &lt;a href="svn://localhost/rw/"&gt;svn://localhost/rw/&lt;/a&gt;&lt;br /&gt;1.2.6. You can start the server like this: &lt;code&gt;svnserve.exe -r d:\projects\repos -d&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TODO&lt;/span&gt;: See how it can be tunelled through HTTPS, also see how it can be run as a service.&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;Trac setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2.1. Download &lt;a href="http://ftp.edgewall.com/pub/trac/Trac-0.11.3.win32.exe"&gt;Trac for windows installer&lt;/a&gt; (see complete &lt;a href="http://trac.edgewall.org/wiki/TracDownload"&gt;downloads section&lt;/a&gt;)&lt;br /&gt;2.2. Download &lt;a href="http://www.python.org/ftp/python/2.5/python-2.5.msi"&gt;Python 2.5 installer&lt;/a&gt; (details &lt;a href="http://trac.edgewall.org/wiki/TracOnWindows/Python2.5"&gt;here&lt;/a&gt;, if needed)&lt;br /&gt;2.3. Download &lt;a href="http://ftp.edgewall.com/pub/genshi/Genshi-0.5.1.win32-py2.5.exe"&gt;genshi installer&lt;/a&gt; for Python 2.5&lt;br /&gt;2.4. Download &lt;a href="http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9.win32-py2.5.exe#md5=602d06054ec1165e995ae54ac30884d7"&gt;setuptools&lt;/a&gt; (instructions available &lt;a href="http://pypi.python.org/pypi/setuptools/#windows"&gt;here&lt;/a&gt;)&lt;br /&gt;2.5. Install Python, for example to &lt;code&gt;d:\Python25&lt;/code&gt;&lt;br /&gt;2.6. (Optionally) add &lt;code&gt;d:\Python25&lt;/code&gt; to &lt;span style="font-style: italic;"&gt;PATH&lt;/span&gt; system environment variable&lt;br /&gt;2.7. Install setuptools, genshi and Trac to default locations&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Integration with Subversion&lt;/span&gt; (this solution is kinda ugly hack. I assume it could be achieved much easier, though I was unable to find how exactly):&lt;br /&gt;&lt;br /&gt;3.1. Unzip &lt;code&gt;svn-win32-1.5.5_py.zip&lt;/code&gt; to &lt;code&gt;d:\Python25\Lib\site-packages&lt;/code&gt;&lt;br /&gt;3.2. Unzip &lt;code&gt;svn-win32-1.5.5.zip\svn-win32-1.5.5\bin&lt;/code&gt; to &lt;code&gt;d:\Python25\Lib\site-packages\libsvn&lt;/code&gt;&lt;br /&gt;3.3. &lt;code&gt;copy d:\Python25\Lib\site-packages\libsvn\*.dll d:\Python25\Lib\site-packages\libsvn\*.pyd&lt;/code&gt;&lt;br /&gt;3.4. &lt;code&gt;mkdir d:\projects\trac\rw&lt;/code&gt;&lt;br /&gt;3.5. Execute this: &lt;code&gt;trac-admin d:\projects\trac\rw initenv&lt;/code&gt;, enter the project name and &lt;code&gt;d:\projects\repos\rw&lt;/code&gt; when asked for Subversion repository location. Leave all other values default.&lt;br /&gt;3.7. To test installation just execute this: &lt;code&gt;tracd --port 8000 d:\projects\trac\rw&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;4. &lt;span style="font-weight: bold;"&gt;Setup authentication&lt;/span&gt; (see &lt;a href="http://trac.edgewall.org/wiki/TracOnWindows/Python2.5"&gt;instructions&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;4.1. Create a new file named &lt;code&gt;trac-digest.py&lt;/code&gt; and fill it with code from &lt;a href="http://trac.edgewall.org/wiki/TracStandalone"&gt;this page&lt;/a&gt;&lt;br /&gt;4.2. Create an administrator user (user "&lt;span style="font-style: italic;"&gt;adm&lt;/span&gt;" with password "&lt;span style="font-style: italic;"&gt;adm&lt;/span&gt;"): &lt;code&gt;python trac-digest.py -u adm -p adm &gt;&gt; d:\projects\trac\rw\digest.txt&lt;/code&gt;&lt;br /&gt;4.3. Give that user all permissions: &lt;code&gt;trac-admin d:\projects\trac\rw permission add adm TRAC_ADMIN&lt;/code&gt;&lt;br /&gt;4.4. Run this to test everything: &lt;code&gt;tracd -p 80 --auth=rw,trac\rw\digest.txt,trac trac\rw&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now you should be able to see the Admin tab if you log in with "&lt;span style="font-style: italic;"&gt;adm&lt;/span&gt;" / "&lt;span style="font-style: italic;"&gt;adm&lt;/span&gt;" (see &lt;a href="http://localhost:8000/rw"&gt;http://localhost/rw&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;4.5. Adjust attachment limit in &lt;code&gt;trac.ini&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;[attachment]&lt;br /&gt;max_size = 262144000&lt;/code&gt;&lt;br /&gt;(it's 250 Mb)&lt;br /&gt;&lt;br /&gt;5. &lt;span style="font-weight: bold;"&gt;Enable automatic ticket control via Subversion comments.&lt;/span&gt; See &lt;a href="http://trac.edgewall.org/wiki/TracFaq#can-trac-automatically-update-a-ticket-when-i-commit-a-changeset"&gt;instuctions&lt;/a&gt;:&lt;br /&gt;Download &lt;code&gt;trac-post-commit-hook&lt;/code&gt; and &lt;code&gt;trac-post-commit-hook.cmd&lt;/code&gt; from &lt;a href="http://trac.edgewall.org/browser/branches/0.11-stable/contrib"&gt;here&lt;/a&gt; and follow instructions in &lt;code&gt;trac-post-commit-hook.cmd&lt;/code&gt;.&lt;br /&gt;Place it to &lt;code&gt;d:\projects\repos\rw\hooks&lt;/code&gt; and modify &lt;span style="font-style: italic;"&gt;.cmd&lt;/span&gt; file like that:&lt;br /&gt;&lt;code&gt;SET TRAC_ENV=D:\projects\trac\rw&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;6. &lt;span style="font-weight: bold;"&gt;Update. Use Subversion authentication in Trac. &lt;/span&gt;&lt;br /&gt;Using &lt;a href="http://trac-hacks.org/wiki/AccountManagerPlugin"&gt;AccountManagerPlugin&lt;/a&gt; we can work with Trac users fast and easy. I'll describe the simplest and unsecure way of setting it up.&lt;br /&gt;&lt;br /&gt;6.1. &lt;code&gt;easy_install http://trac-hacks.org/svn/accountmanagerplugin/trunk&lt;/code&gt;&lt;br /&gt;6.2. Go to Trac Admin tab and enable Account Manager Plugin and the following modules:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AccountManagerAdminPage&lt;/li&gt;&lt;li&gt;AccountManager&lt;/li&gt;&lt;li&gt;AbstractPasswordFileStore&lt;/li&gt;&lt;li&gt;HttpAuthStore&lt;/li&gt;&lt;li&gt;AccountChangeListener&lt;/li&gt;&lt;li&gt;AccountChangeNotificationAdminPanel&lt;/li&gt;&lt;li&gt;SvnServePasswordStore&lt;/li&gt;&lt;li&gt;AccountModule&lt;/li&gt;&lt;li&gt;LoginModule&lt;/li&gt;&lt;li&gt;RegistrationModule&lt;/li&gt;&lt;/ul&gt;(it will make your life much easier allowing not to login into that Windoze box to change some passwords).&lt;br /&gt;6.3. Now you'll need to add the following line to [components] section of trac.ini (it will disable HTTP authentication):&lt;br /&gt;&lt;code&gt;trac.web.auth.LoginModule = disabled&lt;/code&gt;&lt;br /&gt;6.4. Go to Accounts / Configuration (see left menu in Admin mode) and enter your passwd filename into &lt;span style="font-style: italic;"&gt;SvnServePasswordStore&lt;/span&gt; box (i. e. &lt;code&gt;D:\projects\repos\rw\conf\passwd&lt;/code&gt;)&lt;br /&gt;6.5. Now you can login as &lt;span style="font-style: italic;"&gt;adm&lt;/span&gt; (don't forget to add this user to your Subversion's &lt;span style="font-style: italic;"&gt;passwd&lt;/span&gt; file) and add / remove Trac users via new menu items in Admin tab. The best thing about it is that now all your changes will be reflected in Subversion configuration, so this could be considered as the common place of manipulating users for your development environment.&lt;br /&gt;6.6. IMPORTANT. Now &lt;a href="http://trac-hacks.org/wiki/AccountManagerPlugin#DisableHTTPauthentication"&gt;you can't use --auth&lt;/a&gt; when starting &lt;span style="font-style: italic;"&gt;tracd&lt;/span&gt;. So, my command line is simply &lt;code&gt;tools\Python25\Scripts\tracd.exe -p 80 trac\rw&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now you can customize all the necessary settings, first of all authorization. Also there available a lot of useful plugins for Trac, see &lt;a href="http://trac-hacks.org/"&gt;Trac hacks site&lt;/a&gt;. What I'm going to do next is install &lt;a href="http://maven-proxy.codehaus.org/"&gt;Maven proxy&lt;/a&gt; and &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; continuous integration solution.&lt;br /&gt;&lt;br /&gt;P.S. The best thing about this installation is that it can be done once and then packed into a handy (in my case 80 Mb) redistributable ZIP file and use it everywhere. The only issue in this case is that you will need to install Python anyway (because of some shared DLLs), but during installation you can choose the existing &lt;code&gt;D:\projects\tools\Python25&lt;/code&gt; directory and it won't override your changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-8515033377322420175?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/8515033377322420175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/03/trac-subversion-installation-on-windows.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8515033377322420175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/8515033377322420175'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/03/trac-subversion-installation-on-windows.html' title='Trac + Subversion installation on Windows'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5917304511210334924</id><published>2009-02-28T14:16:00.000+02:00</published><updated>2009-06-07T22:43:55.894+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lifestyle'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='Pomodoro technique'/><title type='text'>The Pomodoro Technique</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.open4dev.com/storage/img/sourcesense/pomodoro.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 230px; height: 188px;" src="http://www.open4dev.com/storage/img/sourcesense/pomodoro.png" alt="" border="0" /&gt;&lt;/a&gt;Again, thanks to &lt;a href="http://blog.crisp.se/henrikkniberg/2009/01/19/1232358360000.html"&gt;Henrik Kniberg's blog&lt;/a&gt; I've got a brief introduction to &lt;a href="http://www.pomodorotechnique.com/"&gt;Pomodoro Technique&lt;/a&gt;, which is essentially a way to improve one's productivity. The &lt;a href="http://www.pomodorotechnique.com/resources/cirillo/ThePomodoroTechnique_v1-3.pdf"&gt;PDF describing it&lt;/a&gt; is quite a simple one and is fun to read (for those lazy enough there exists a &lt;a href="http://blog.staffannoteberg.com/2008/02/22/pomodoro-technique-in-5-minutes/"&gt;5-minute guide&lt;/a&gt; too).&lt;br /&gt;&lt;br /&gt;The sole idea of this technique is to split the work into fixed short time frames separated by breaks, plan it and protect it against interruptions. A set of simple yet efficient rules promises to make it work.&lt;br /&gt;&lt;br /&gt;I was completely carried away by this paragraph, because it seems to be the thing I'm lacking most of all in my everyday work:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;We can stimulate this ability to feel time in a different way by means of a series of exercises which serve to enhance consciousness of passing time among Pomodoro users. This different awareness of the passage of time seems to lead Pomodoro users to a higher level of concentration in performing the activity at hand.&lt;br /&gt;&lt;/blockquote&gt;BTW, the concept is thoroughly developed and there exist various tools dedicated to help using it, so it should be a fun thing to advance this technique, but I'm going to use it's simplest, hardware form. Yes, gonna try this on Monday! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5917304511210334924?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5917304511210334924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/pomodoro-technique.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5917304511210334924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5917304511210334924'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/pomodoro-technique.html' title='The Pomodoro Technique'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-1545121841134341809</id><published>2009-02-27T10:40:00.001+02:00</published><updated>2009-12-23T13:13:05.228+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mindmaps'/><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Scrum and XP from the Trenches</title><content type='html'>Just finished reading &lt;a href="http://blog.crisp.se/henrikkniberg/2009/02/01/1233470340000.html"&gt;a book&lt;/a&gt; by &lt;span&gt;&lt;a href="http://blog.crisp.se/henrikkniberg/"&gt;Henrik Kniberg&lt;/a&gt;. I found it really exciting and fun to read (at least, in Russian translation). Thank you, Henrik, looking forward to read more of your books :)&lt;br /&gt;&lt;br /&gt;Short extract follows:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_arwiFr_8Dbk/SaequYJAzPI/AAAAAAAAAFw/ENCeU8OF4Yk/s1600-h/Scrum.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 194px;" src="http://3.bp.blogspot.com/_arwiFr_8Dbk/SaequYJAzPI/AAAAAAAAAFw/ENCeU8OF4Yk/s400/Scrum.png" alt="" id="BLOGGER_PHOTO_ID_5307398399610375410" 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/3627102742438898505-1545121841134341809?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/1545121841134341809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/scrum-and-xp-from-trenches.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1545121841134341809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1545121841134341809'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/scrum-and-xp-from-trenches.html' title='Scrum and XP from the Trenches'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_arwiFr_8Dbk/SaequYJAzPI/AAAAAAAAAFw/ENCeU8OF4Yk/s72-c/Scrum.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2278028024948698167</id><published>2009-02-25T15:49:00.000+02:00</published><updated>2009-06-07T22:44:26.255+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>XQuery for mashups?</title><content type='html'>Consider this basic XQuery sample:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;for $statement in document(https://www.sample.com/sample.xml)//post&lt;br /&gt;let $comment := $statement/comment&lt;br /&gt;where $statement/postedby = 'userBob'&lt;br /&gt;return &amp;lt;quotebob&amp;gt;{$comment}&amp;lt;/quotebob&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;Nice, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-2278028024948698167?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2278028024948698167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/xquery-for-mashups.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2278028024948698167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2278028024948698167'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/xquery-for-mashups.html' title='XQuery for mashups?'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7092346126877742028</id><published>2009-02-25T15:10:00.000+02:00</published><updated>2009-02-25T15:26:10.619+02:00</updated><title type='text'>False language</title><content type='html'>I guess it's the most obfuscated programming language ever invented (and it's more-or-less useful, compared to &lt;a href="http://en.wikipedia.org/wiki/Brainfuck"&gt;Brainfuck&lt;/a&gt; for example). Meet &lt;a href="http://c2.com/cgi/wiki?FalseLanguage"&gt;False Language&lt;/a&gt;!&lt;br /&gt;&lt;blockquote&gt;99 9[1-$][\$@$@$@$@\/*=[1-$$[%\1-$@]?0=[\$.' ,\]?]?]#&lt;/blockquote&gt;It's a program which prints all primes up to 100. It's so impressively smart, that inspired creation of &lt;a href="http://en.wikipedia.org/wiki/K_programming_language"&gt;K&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/F_programming_language"&gt;F&lt;/a&gt; and Y programming languages, which in turn are... somewhat similar to &lt;a href="http://en.wikipedia.org/wiki/J_%28programming_language%29"&gt;J&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Q_%28programming_language_from_Kx_Systems%29"&gt;Q&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7092346126877742028?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7092346126877742028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/false-language.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7092346126877742028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7092346126877742028'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/false-language.html' title='False language'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-172008668996894252</id><published>2009-02-24T16:29:00.000+02:00</published><updated>2009-02-24T16:32:41.683+02:00</updated><title type='text'>Nice diagrams</title><content type='html'>Take a look at &lt;a href="http://blog.mountaingoatsoftware.com/?p=33"&gt;Treemap&lt;/a&gt; diagrams:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.mountaingoatsoftware.com/wp-content/uploads/theme4zoomed.jpg"&gt;&lt;img style="cursor: pointer; width: 834px; height: 445px;" src="http://blog.mountaingoatsoftware.com/wp-content/uploads/theme4zoomed.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's like a... well, upskirts view of the tree. Really cool Javascript for automated generation of these diagrams could be found &lt;a href="http://js-treemap.sourceforge.net/tests/demo.xml.html"&gt;here&lt;/a&gt; (it's a demo).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-172008668996894252?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/172008668996894252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/nice-diagrams.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/172008668996894252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/172008668996894252'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/nice-diagrams.html' title='Nice diagrams'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-1202007739745325783</id><published>2009-02-18T18:07:00.000+02:00</published><updated>2009-02-18T18:17:57.997+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='Grid computing'/><title type='text'>Grid Computing made easy with GridGain</title><content type='html'>I've just watched a &lt;a href="http://www.gridgain.com/screencast/grid_app_in_15min/screencast.html"&gt;20 minute demo&lt;/a&gt; of &lt;a href="http://www.gridgain.com/index.html"&gt;GridGain&lt;/a&gt; usage for parallel computations. Looks quite impressive, at least easy due to &lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;Map-Reduce&lt;/a&gt;-like approach employed in a very simple form. Also it has a nice feature of transparent propagation of code changes between nodes, still it's not actually clear for me how they gonna manage changes in classpath, libraries, etc.&lt;br /&gt;&lt;br /&gt;It seems that GridGain is not very popular (yet), at least I was unable to find a wiki article about it :) though I really sympathize its simplicity and wish them good luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-1202007739745325783?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/1202007739745325783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/grid-computing-made-easy-with-gridgain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1202007739745325783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/1202007739745325783'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/grid-computing-made-easy-with-gridgain.html' title='Grid Computing made easy with GridGain'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-6771770934620257561</id><published>2009-02-16T12:17:00.000+02:00</published><updated>2009-02-27T13:32:26.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='GlassFish'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Sun Web 2.0 tech is easy</title><content type='html'>Two following links describe how to achieve famous Ruby on Rails rapid development on Java platform using Sun tools - &lt;a href="http://www.netbeans.org/ruby/"&gt;Netbeans&lt;/a&gt; and &lt;a href="https://glassfish.dev.java.net/"&gt;GlassFish&lt;/a&gt;. Among pros there are really fast setup, high performance (due to clustering) and flexibility (mix Java and Ruby):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mysql.com/news-and-events/on-demand-webinars/display-od-272.html"&gt;Developing MySQL-Backed Applications with Netbeans, JRuby-on-Rails &amp;amp; Glassfish&lt;/a&gt; (needs registration)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=m5zB2xU6O44"&gt;GlassFish Clustering In Under 10 Minutes&lt;/a&gt; (also high-resolution version is available - the link is right after the movie window)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-6771770934620257561?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/6771770934620257561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/sun-web-20-tech-is-easy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6771770934620257561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6771770934620257561'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/sun-web-20-tech-is-easy.html' title='Sun Web 2.0 tech is easy'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-6005527947078644844</id><published>2009-02-13T15:50:00.000+02:00</published><updated>2009-02-13T16:07:51.787+02:00</updated><title type='text'>Pushing data to browser</title><content type='html'>What will happen if a server don't close the TCP/IP connection after web page has finished loading? Right, it will wait until timeout, which could be quite a long period of time. That means we can use it to establish long-live connections (keeping them alive via some kind of polling) to provide server-to-client data push, events, bidirectional data streams, etc.&lt;br /&gt;&lt;br /&gt;With AJAX such things became simpler, because no IFrames nor page reloads nor applets of any kind are necessary anymore. Instead nowadays we have &lt;a href="http://en.wikipedia.org/wiki/Comet_%28programming%29"&gt;Comet&lt;/a&gt;, which is an umbrella term for all such technologies, for example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.oracle.com/slc/2009/02/introduction_to_bayeux_protoco.html"&gt;Bayeux &lt;/a&gt;protocol providing publish/subscribe model&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/BOSH"&gt;BOSH&lt;/a&gt; for establishing bi-directional connections between client and server&lt;/li&gt;&lt;/ul&gt;Usually these things are combined with some kind of non-blocking IO on the server side in order to save resources there. For example, there exists integration with &lt;a href="https://grizzly.dev.java.net/"&gt;Grizzly&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-6005527947078644844?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/6005527947078644844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/pushing-data-to-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6005527947078644844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6005527947078644844'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/pushing-data-to-browser.html' title='Pushing data to browser'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-4227886666579959183</id><published>2009-02-13T14:42:00.001+02:00</published><updated>2010-01-05T16:04:33.674+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>The shortest way to read a text file</title><content type='html'>Check this out (in fact it retrieves complete web page):&lt;blockquote&gt;&lt;pre&gt;new java.util.Scanner(url.openConnection().getInputStream()).useDelimiter("\\Z").next();&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Thanks to &lt;a href="http://www.jroller.com/ctarrington/entry/read_entire_file_with_java"&gt;CT Arrington's Weblog&lt;/a&gt; and &lt;a href="http://java.sun.com/developer/JDCTechTips/"&gt;Core Java Technologies Tech Tips&lt;/a&gt; magazine.&lt;br /&gt;&lt;br /&gt;Update: one more short way, using &lt;a href="http://commons.apache.org/io/"&gt;Apache Commons IO&lt;/a&gt;:&lt;blockquote&gt;&lt;pre&gt;FileUtils.readFileToString(file);&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-4227886666579959183?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/4227886666579959183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/shortest-way-to-read-whole-text-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4227886666579959183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4227886666579959183'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/shortest-way-to-read-whole-text-file.html' title='The shortest way to read a text file'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-4748941873900334609</id><published>2009-02-13T13:01:00.000+02:00</published><updated>2009-02-13T13:26:39.995+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='JXTA'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='Compass'/><title type='text'>Some open-source Java tech for scalability</title><content type='html'>Some articles I've read briefly and don't want to forget:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://jxta.dev.java.net/"&gt;JXTA&lt;/a&gt; is a P2P framework for Java (&lt;a href="https://guest@jxta-guide.dev.java.net/svn/jxta-guide/trunk/src/guide_v2.5/JXSE_ProgGuide_v2.5.pdf"&gt;here&lt;/a&gt; is a very nice 171 page guide about it)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cecs.uci.edu/%7Epapers/ipdps07/pdfs/SMTPS-201-paper-1.pdf"&gt;Scale-up vs scale-out&lt;/a&gt; study by IBM (PDF): horizontal scaling wins&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.compass-project.org/overview.html"&gt;Compass &lt;/a&gt;- ORM-like &lt;a href="http://en.wikipedia.org/wiki/Lucene"&gt;Lucene &lt;/a&gt;wrapper. Seems it's extremely scalable&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-4748941873900334609?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/4748941873900334609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/some-open-source-java-tech-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4748941873900334609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4748941873900334609'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/some-open-source-java-tech-for.html' title='Some open-source Java tech for scalability'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-4555154803572593358</id><published>2009-02-12T15:10:00.001+02:00</published><updated>2009-02-12T15:16:40.826+02:00</updated><title type='text'>Nice IBM advertisement from 1975</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.squareamerica.com/images5/ib15.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 603px; height: 399px;" src="http://www.squareamerica.com/images5/ib15.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;That's not about James Bond. The rest of slides &lt;a href="http://www.squareamerica.com/ib.htm"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-4555154803572593358?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/4555154803572593358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/nice-ibm-advertisement-from-1975.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4555154803572593358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4555154803572593358'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/nice-ibm-advertisement-from-1975.html' title='Nice IBM advertisement from 1975'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5599501097271395230</id><published>2009-02-12T13:07:00.000+02:00</published><updated>2009-02-12T13:22:16.468+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='STM'/><category scheme='http://www.blogger.com/atom/ns#' term='Clojure'/><title type='text'>Software transactional memory</title><content type='html'>I've never heard about such thing as &lt;a href="http://en.wikipedia.org/wiki/Software_transactional_memory"&gt;STM&lt;/a&gt;, which is quite an interesting concurrency control concept, an alternative to more commonly used &lt;a href="http://en.wikipedia.org/wiki/Lock_%28computer_science%29"&gt;lock-based synchronization&lt;/a&gt;. It's usage could be found in &lt;a href="http://en.wikipedia.org/wiki/Clojure"&gt;Clojure&lt;/a&gt; programming language running under JVM, which I think makes both of these worth trying.&lt;br /&gt;&lt;br /&gt;Though, it can't replace locking completely, well... because in fact it provides no locking :) So, some inconsistent states are still possible, therefore &lt;a href="http://en.wikipedia.org/wiki/Software_transactional_memory#Transactional_locking"&gt;transaction locking&lt;/a&gt; should be used, which returns us back to Earth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5599501097271395230?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5599501097271395230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/software-transactional-memory.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5599501097271395230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5599501097271395230'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/software-transactional-memory.html' title='Software transactional memory'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-4932528951880703333</id><published>2009-02-11T15:12:00.000+02:00</published><updated>2009-02-11T16:12:16.653+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Modeling'/><title type='text'>Tools for XSD-LDM-DDL roundrip development</title><content type='html'>There are some articles suggesting to use Rational Data Architect for XSD-DDL-&lt;a href="http://en.wikipedia.org/wiki/Logical_data_model"&gt;LDM&lt;/a&gt; roundtrip development. It doesn't work. None of four RDA 7.0.0.5 installations I found in my department is able to import XSD into LDM, as &lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0711selvage/"&gt;this article&lt;/a&gt; suggests. It shows all the necessary dialog boxes, but in the end it does nothing. Just sielently does nothing.&lt;br /&gt;&lt;br /&gt;Ok, maybe my schema is all wrong (maybe because it was not created by Business Modeler), still it's very simple and I see no reason why it shouldn't work. Also, it doesn't permit to transform LDM to Physical Data Model, so no DDL generation too... Ok, I guess it should work, but only after reading some Redbook about it.&lt;br /&gt;&lt;br /&gt;I decided to give a short try to other ER modeling tools. &lt;a href="http://en.wikipedia.org/wiki/PowerDesigner"&gt;PowerDesigner&lt;/a&gt; allowed me to easily create an LDM (it's called "Conceptual Data Model" there) and transform it to Physical Data Model AKA DDL in few clicks. &lt;a href="http://en.wikipedia.org/wiki/XMLSpy"&gt;Altova XML Spy&lt;/a&gt; was able to move between XML Schema and DDL seamlessly...&lt;br /&gt;&lt;br /&gt;Both tools also provide a lot of useful additional functionality, which I'm going to explore and describe a bit later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-4932528951880703333?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/4932528951880703333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/tools-for-xsd-ldm-ddl-roundrip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4932528951880703333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/4932528951880703333'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/tools-for-xsd-ldm-ddl-roundrip.html' title='Tools for XSD-LDM-DDL roundrip development'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2607703271490029617</id><published>2009-02-06T17:40:00.000+02:00</published><updated>2009-02-06T17:42:42.391+02:00</updated><title type='text'>Trends</title><content type='html'>I asked &lt;a href="http://www.google.com/trends"&gt;Google Trends &lt;/a&gt;for the following stuff, and it gives some rather interesting results:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;grid computing, soa, cloud computing&lt;/li&gt;&lt;li&gt;mainframe&lt;/li&gt;&lt;li&gt;java, c#&lt;/li&gt;&lt;li&gt;c++, c#, java&lt;/li&gt;&lt;li&gt;j2ee, microsoft .net&lt;/li&gt;&lt;li&gt;ruby, groovy&lt;/li&gt;&lt;li&gt;ruby on rails, grails&lt;/li&gt;&lt;li&gt;google&lt;/li&gt;&lt;li&gt;amazon&lt;/li&gt;&lt;li&gt;netbook, notebook&lt;/li&gt;&lt;li&gt;yahoo&lt;/li&gt;&lt;li&gt;scala, groovy&lt;/li&gt;&lt;li&gt;neural networks, artificial intelligence&lt;/li&gt;&lt;li&gt;wiki, blog&lt;/li&gt;&lt;li&gt;crisis, sex&lt;/li&gt;&lt;li&gt;hardware, software&lt;/li&gt;&lt;li&gt;netweaver, websphere&lt;/li&gt;&lt;li&gt;abap, sap&lt;/li&gt;&lt;li&gt;abap, netweaver&lt;/li&gt;&lt;li&gt;websphere, weblogic&lt;/li&gt;&lt;li&gt;ibm, oracle, microsoft&lt;/li&gt;&lt;li&gt;open source&lt;/li&gt;&lt;/ul&gt;Try yourself! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-2607703271490029617?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2607703271490029617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/trends.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2607703271490029617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2607703271490029617'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/trends.html' title='Trends'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2057241219850447683</id><published>2009-02-06T16:01:00.000+02:00</published><updated>2009-02-06T17:12:38.335+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><title type='text'>IBM Rational products I didn't know about</title><content type='html'>Finally I managed to find some time and go through the &lt;a href="http://www-01.ibm.com/software/rational/sw-atoz/"&gt;complete list of IBM Rational products&lt;/a&gt;. Here is a list of tools I found interesting and new to me:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www-01.ibm.com/software/awdtools/hostintegration/"&gt;Rational Host Integration Solution&lt;/a&gt;. It looks like an advanced screen-scrambler for existing [ugly] mainframe user interfaces, powered by &lt;a href="http://www-01.ibm.com/software/awdtools/hats/index.html"&gt;Rational Host Access Transformation Services&lt;/a&gt;. They say it's done &lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;quickly style="font-style: italic;"&gt;without changing the existing applications". &lt;/quickly&gt;&lt;quickly&gt;Kinda telnet2ws.&lt;/quickly&gt;&lt;/li&gt;&lt;li&gt;Rational Software Analyzer. This static software analyzer looks promising, it supports C++, Java and something else. What I'm interested in is 500+ code review rules for Java. I tried to run it against one of our projects, and it produces some quite impressive results. I mean, something I wouldn't notice in an everyday life. The major drawback is that the installation is &gt;600 Mb, which is just too much for such a simple thing (I would prefer to have it just as a downloadable plugin for my RSA). Furthermore, &lt;a href="http://www-01.ibm.com/software/awdtools/swarchitect/websphere/"&gt;Rational Software Architect&lt;/a&gt; which I use as a main tool already have limited support for such analysis (providing &lt;span style="font-style: italic;"&gt;just&lt;/span&gt; 200+ rules).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www-01.ibm.com/software/awdtools/developer/business/index.html"&gt;Rational Business Developer&lt;/a&gt;. After reading this: "&lt;span style="font-style: italic;"&gt;EGL (Enterprise Generation Language) compliments the breadth and depth of Java and COBOL technology with a simplified, more abstract development paradigm&lt;/span&gt;"&lt;egl style="font-style: italic;"&gt;&lt;breadth style="font-style: italic;"&gt;, &lt;/breadth&gt;&lt;/egl&gt;&lt;egl&gt;&lt;breadth&gt;I imagined an EGL editor with a radiobutton allowing to choose one of these: "&lt;span style="font-style: italic;"&gt;Generate COBOL code&lt;/span&gt;", "&lt;span style="font-style: italic;"&gt;Generate Java code&lt;/span&gt;". No COBOL please. Also they &lt;a href="ftp://ftp.software.ibm.com/software/rational/web/reports/Rational_EGL_Tools_Study_20080416.pdf"&gt;compare it with .NET&lt;/a&gt; for a task of retreiving data from IBM mainframe (!). In the end they claim something like "&lt;span style="font-style: italic;"&gt;yep, we knew it would happen. Dotnet sucks, it doesn't work with mainframes&lt;/span&gt;". In fact, that PDF is the most exciting thing about RBD, and reading it somehow resembles watching Belarussian political news on government TV channel (that's exaclty the situation when one look is worth a hundered words).&lt;/breadth&gt;&lt;/egl&gt;&lt;egl style="font-style: italic;"&gt;&lt;breadth style="font-style: italic;"&gt;&lt;br /&gt;&lt;/breadth&gt;&lt;/egl&gt;&lt;/li&gt;&lt;/ul&gt;Wheeew! To be continued.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-2057241219850447683?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2057241219850447683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/ibm-rational-products-i-didnt-know.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2057241219850447683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2057241219850447683'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/ibm-rational-products-i-didnt-know.html' title='IBM Rational products I didn&apos;t know about'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-6066520751175920442</id><published>2009-02-06T13:11:00.000+02:00</published><updated>2009-02-06T13:14:47.868+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><title type='text'>JSF in RAD links</title><content type='html'>Here are just few good links found about how to easily implement JSF in Rational Application Developer. Haven't managed to read it yet, so posting it here just in order not to lose it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/rational/library/04/r-3219/"&gt;Developing Java Server Faces Applications in Rational Application Developer (RAD)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/rational/library/06/1205_lloyd_rad/"&gt;What's new in IBM Rational Application Developer V7.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/rational/library/06/1205_kats_rad2/"&gt;JSF and Ajax: Web 2.0 application made easy with Rational Application Developer V7&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-6066520751175920442?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/6066520751175920442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/jsf-in-rad-links.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6066520751175920442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6066520751175920442'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/jsf-in-rad-links.html' title='JSF in RAD links'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-6535629058729985811</id><published>2009-02-05T12:30:00.001+02:00</published><updated>2010-01-19T18:21:19.730+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lifestyle'/><title type='text'>Habits and motivation</title><content type='html'>Recently I've read a short post by &lt;a href="http://www.chadfowler.com/"&gt;Chad Fowler&lt;/a&gt; about &lt;a href="http://www.chadfowler.com/2008/12/4/develop-a-good-habit-in-20-days"&gt;development of good habits in 20 days&lt;/a&gt;. In short, he says that it's easy to make yourself do something just for 20 days and at the same time that's usually enough for this activity to become a habit. I like his idea (it's so simple!) and already started gathering some good habits, mostly in the household area. Let's see and wait until March :)&lt;br /&gt;&lt;br /&gt;Also I've looked through a &lt;a href="http://websitesuccessdoctor.com/blog/"&gt;Paul Gram's blog&lt;/a&gt;, which I frankly speaking dislike because of it's well, straightforwardness. He's an over-positive, super-optimistic, completely American businessman saying some &lt;a href="http://websitesuccessdoctor.com/blog/powerful-question-to-ask-yourself/"&gt;quite obvious things&lt;/a&gt; trying to find some deep sense inside. Anyway, I found an interesting idea there too. Let me quote it:&lt;blockquote style="font-style: italic;"&gt; &lt;p&gt;If you start a new year off with massive success in the first month, it’s amazing how fast it can snowball and help propel you to your best year EVER.&lt;/p&gt;&lt;/blockquote&gt;I think that's a fresh idea and it's not too late to start something like that in mid-February :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-6535629058729985811?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/6535629058729985811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/habits-and-motivation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6535629058729985811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6535629058729985811'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/habits-and-motivation.html' title='Habits and motivation'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5173761896082973843</id><published>2009-02-04T13:47:00.000+02:00</published><updated>2009-02-04T14:22:13.645+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><title type='text'>Tricky</title><content type='html'>I'm really intrigued by &lt;a href="http://en.wikipedia.org/wiki/OSGi"&gt;OSGi&lt;/a&gt; stuff. No, really, I can't understand what does it mean. They call it "technology" and "framework", but these words are so generic that it doesn't mean anything to me... I gave up and searched in Russian, and it didn't help either! It's very, very interesting.&lt;br /&gt;&lt;br /&gt;UPD: Finally found an &lt;a href="http://neilbartlett.name/blog/osgi-articles/"&gt;easy tutorial&lt;/a&gt; on it. They could have told "it's a megasophisticated way of using pluging" instead of "framework" :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5173761896082973843?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5173761896082973843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/tricky.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5173761896082973843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5173761896082973843'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/tricky.html' title='Tricky'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7288740669094098242</id><published>2009-02-03T14:11:00.001+02:00</published><updated>2010-04-17T05:39:21.724+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Simplifying JDBC in DSL fashion</title><content type='html'>I like these libs, which are way simpler to understand and learn (at least, for simple queries) and much more lightweight than full-blown ORM tools like Hibernate:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://h2database.com/html/jaqu.html"&gt;JaQu&lt;/a&gt;, though I can't figure out if it could be downloaded without &lt;a href="http://en.wikipedia.org/wiki/H2_%28DBMS%29"&gt;H2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/liquidform/"&gt;LIQUidFORM&lt;/a&gt;, which does its best to look like &lt;a href="http://en.wikipedia.org/wiki/Language_Integrated_Query"&gt;LINQ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;And &lt;a href="http://quaere.codehaus.org/"&gt;some other&lt;/a&gt; LINQ-inspired implementations for Java &lt;/li&gt;&lt;/ul&gt;To understand what I'm talking about, consider this simple example replacing all that verbose JDBC stuff:&lt;br /&gt;&lt;blockquote&gt;   &lt;pre&gt;Product p = new Product();&lt;br /&gt;List&lt;product&gt; soldOutProducts =&lt;br /&gt;db.from(p).where(p.unitsInStock).is(0).select();&lt;/product&gt;&lt;/pre&gt; &lt;/blockquote&gt;And yes, I wish you good luck, because I'm afraid, some cool features (closures, etc) which can improve &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;DSL&lt;/a&gt; implementation in Java &lt;a href="http://tech.puredanger.com/java7/"&gt;won't be included in JSE 7&lt;/a&gt;. That's why I'm looking at Groovy with increasing interest and can't wait to see &lt;a href="http://groovy.dzone.com/news/which-ide-supports-groovy-best"&gt;good IDE support&lt;/a&gt; for it.&lt;br /&gt;&lt;br /&gt;Update: they actually &lt;a href="http://puredanger.com/tech/2009/11/18/closures-after-all/"&gt;will include closures in JSE 7&lt;/a&gt;! Not looking at Groovy anymore :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7288740669094098242?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7288740669094098242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/simplifying-jdbc-in-dsl-fashion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7288740669094098242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7288740669094098242'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/simplifying-jdbc-in-dsl-fashion.html' title='Simplifying JDBC in DSL fashion'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-6787638588389344818</id><published>2009-02-02T16:12:00.000+02:00</published><updated>2009-02-02T16:20:10.804+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>Functional Programming in Architecture</title><content type='html'>While reading an article about &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;Functional Programming&lt;/a&gt; (&lt;a href="http://rsdn.ru/article/dotnet/LinqAsStapToFp.xml"&gt;it's in Russian&lt;/a&gt;), I've caught myself that &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer#Principles"&gt;RESTful&lt;/a&gt; web service is a kind of &lt;a href="http://en.wikipedia.org/wiki/Pure_function"&gt;Pure Function&lt;/a&gt;, so &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; is kinda FP approach :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-6787638588389344818?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/6787638588389344818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/rest-fp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6787638588389344818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6787638588389344818'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/rest-fp.html' title='Functional Programming in Architecture'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-7998850419167411314</id><published>2009-02-02T12:55:00.000+02:00</published><updated>2009-02-02T14:44:04.030+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='specs'/><title type='text'>BDD is too repetitive?</title><content type='html'>I've got acquainted with &lt;a href="http://dannorth.net/introducing-bdd"&gt;Behavior-driven testing&lt;/a&gt;, though it still looks too verbose for me. The aforementioned article doesn't give the &lt;a href="http://www.ryangreenhall.com/articles/bdd-by-example.html"&gt;JBehave annotation "syntax" examples&lt;/a&gt;, which I don't like so much.&lt;br /&gt;&lt;br /&gt;UPD: Thinking of our poor testers who were unable to document their functional tests, start suspecting that &lt;a href="http://blog.m.artins.net/acceptance-tests-with-jbehave-selenium-page-objects/"&gt;this &lt;/a&gt;is what they might have needed instead of using IBM Rational Functional Tester...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-7998850419167411314?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/7998850419167411314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/bdd-is-too-repetitive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7998850419167411314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/7998850419167411314'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/02/bdd-is-too-repetitive.html' title='BDD is too repetitive?'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-6137629321120224969</id><published>2009-01-29T12:38:00.000+02:00</published><updated>2009-01-29T13:02:27.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='asynchronousity'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Cool Groovy feature 2</title><content type='html'>I can't stop surprising by all that cool language features Groovy provides. I like learning them by example. This time it is &lt;a href="http://www.jroller.com/vaclav/entry/asynchronous_methods_in_groovy_with"&gt;calling methods asynchronously in Groovy&lt;/a&gt;, part two - using Categories. This is not that easy to implement (though it's easy enough) compared to &lt;a href="http://www.jroller.com/vaclav/entry/asynchronous_methods_in_groovy"&gt;methodMissing approach&lt;/a&gt;, however it lacks all that disadvantages of overriding handlers.&lt;br /&gt;&lt;br /&gt;Briefly, it uses closures, and functionality provided by &lt;span style="font-style: italic;"&gt;use&lt;/span&gt; keyword. I guess it could be improved to make the whole thing less verbose, but right now I have no time to think about it. Tried to do something similar in Java using AspectJ, but stuck due to Java syntax limitations due to absence of closures. Using anonymous classes here and there looks ugly and is not less verbose nor easier to understand than straightforward approach.&lt;br /&gt;&lt;br /&gt;I wonder if some kind of closures can be implemented in Java using aspects. Haven't found the solution yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-6137629321120224969?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/6137629321120224969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/cool-groovy-feature-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6137629321120224969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/6137629321120224969'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/cool-groovy-feature-2.html' title='Cool Groovy feature 2'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-9197801501310258327</id><published>2009-01-27T17:55:00.000+02:00</published><updated>2009-01-29T13:02:53.477+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drools'/><category scheme='http://www.blogger.com/atom/ns#' term='business rules'/><title type='text'>Some business rules resources</title><content type='html'>In the recent project we used Hirix XRules business rules engine (you would barely find any information on it anywhere, because it's an IBM internal tool), which appeared to be buggy and slow in our web environment. So, we switched to native Groovy code then and implemented all our rules (supported by more than 700 pages of very brief documentation) and underlying rules engine. I've spent about three months optimizing and polishing it, and in the end it has a very good performance, outperforming the initial solution by more than 100 times.&lt;br /&gt;&lt;br /&gt;Why haven't we used some off-the-shelf product instead? Well, mostly because we lacked information, were limited in time and virtually all other resources. So now when I have time to investigate (the project is over), I found some neat stuff about it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gandalf-lab.com/blog/2006/08/rule-based-systems-why-use-rules.html"&gt;Rule Based Systems: Why use a rules engine&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jboss.org/drools/featuresandscreenshots.html"&gt;Drools features and screenshots&lt;/a&gt; (damn, I love these screenshots!)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bizrules.info/page/articles.htm"&gt;Complete site about Business Rules&lt;/a&gt; (still under construction I guess)&lt;/li&gt;&lt;/ul&gt;So, at the first glance, it seems that the vast majority of current BR tools have &lt;a href="http://www.jessrules.com/jess/docs/71/basics.html"&gt;absolutely ugly syntax&lt;/a&gt;, &lt;a href="http://www.ilog.com/"&gt;too expensive&lt;/a&gt; or both. Seems I didn't manage to find the Perfect Business Rules Engine again...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-9197801501310258327?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/9197801501310258327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/some-business-rules-resources.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/9197801501310258327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/9197801501310258327'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/some-business-rules-resources.html' title='Some business rules resources'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2126848253553005976</id><published>2009-01-23T13:55:00.001+02:00</published><updated>2009-01-29T13:03:15.625+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asynchronousity'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Cool Groovy feature</title><content type='html'>I found a smart article, where is described &lt;a href="http://www.jroller.com/vaclav/entry/asynchronous_methods_in_groovy"&gt;how to add very easy-to-use support for asynchronous  execution to Groovy code&lt;/a&gt; by hooking into &lt;i&gt;methodMissing.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-2126848253553005976?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2126848253553005976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/one-more-cool-groovy-feature.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2126848253553005976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2126848253553005976'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/one-more-cool-groovy-feature.html' title='Cool Groovy feature'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-3804532361661962647</id><published>2009-01-22T09:37:00.000+02:00</published><updated>2009-02-02T14:45:09.884+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM tools'/><category scheme='http://www.blogger.com/atom/ns#' term='httpunit'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='htmlunit'/><category scheme='http://www.blogger.com/atom/ns#' term='db2'/><title type='text'>HTTPUnit in DB2 stored procedure</title><content type='html'>That was nightmare - running &lt;a href="http://httpunit.sourceforge.net/doc/cookbook.html"&gt;HttpUnit&lt;/a&gt; as a stored procedure (don't ask me why) on 8.2 was crashing db2fmp to heap dump. After two days tossing xercesImpl.jar here and there, I decided that was enough and upgraded DB2 to 9.5 Viper-2! &lt;a href="http://www.ibm.com/developerworks/db2/library/techarticle/dm-0602saracco/"&gt;Pretty cool XML support&lt;/a&gt; and a lot of other large-scale-supporting stuff, but all I need is stable interpretation of my precious stored procedure.&lt;br /&gt;&lt;br /&gt;And guess what? It works! More or less... Xerces still unable to find something important inside HttpUnit, but at least no crashes. I guess it's because Xerces uses something internal as a classloader, that's why they have so many &lt;a href="http://osdir.com/ml/java.rife.user/2006-09/msg00118.html"&gt;problems with shared libraries&lt;/a&gt;, etc. So, I've just put that nasty JARs here and there and everywhere (yes, that's not any kind of production system, just a learning application) and now it seems working fine. Well, I'm not sure yet, because it's quite a long-running procedure, but I will know for sure in about ten minutes.&lt;br /&gt;&lt;br /&gt;Keeping my fingers crossed + +&lt;br /&gt;&lt;br /&gt;UPD: Yes, it works finally. Also, I've found a nice article about &lt;a href="http://daniel.gredler.net/2007/10/04/htmlunit-vs-httpunit/"&gt;HtmlUnit vs HttpUnit&lt;/a&gt;. Damn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-3804532361661962647?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/3804532361661962647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/httpunit-in-db2-stored-procedure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3804532361661962647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/3804532361661962647'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/httpunit-in-db2-stored-procedure.html' title='HTTPUnit in DB2 stored procedure'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-5527663648426834761</id><published>2009-01-21T12:06:00.001+02:00</published><updated>2009-01-29T13:04:03.910+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='aspects'/><title type='text'>Artima Developer Spotlight Forum - Java Properties without Getters and Setters</title><content type='html'>&lt;a href="http://www.artima.com/forums/flat.jsp?forum=270&amp;amp;thread=247837"&gt;Here&lt;/a&gt; is described an elegant way of implementing C#-like properties in Java (1.4+) using AspectJ. Nice try, though quite a useless one in a modern reflection-based Java world... Such things make me consider learning AspectJ in a more detail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-5527663648426834761?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/5527663648426834761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/artima-developer-spotlight-forum-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5527663648426834761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/5527663648426834761'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/artima-developer-spotlight-forum-java.html' title='Artima Developer Spotlight Forum - Java Properties without Getters and Setters'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3627102742438898505.post-2813728072227770959</id><published>2009-01-21T11:56:00.000+02:00</published><updated>2009-01-21T12:02:26.161+02:00</updated><title type='text'>My first entry AKA disclaimer</title><content type='html'>Hello, I'm a software developer in a major Belorussian IT company, and I think that's all you need to know about me at the moment :)&lt;br /&gt;Firstly, it was surprisingly easy to create that blog, thanks to blogger.com! I'm not a native English speaker (actually, I've born in ex-USSR country), so don't get confused with it please.&lt;br /&gt;I think this will be mostly IT-related blog, where I'm going to collect my favorite links, articles, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3627102742438898505-2813728072227770959?l=wintermuteblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wintermuteblog.blogspot.com/feeds/2813728072227770959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/my-first-entry-aka-disclaimer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2813728072227770959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3627102742438898505/posts/default/2813728072227770959'/><link rel='alternate' type='text/html' href='http://wintermuteblog.blogspot.com/2009/01/my-first-entry-aka-disclaimer.html' title='My first entry AKA disclaimer'/><author><name>Constantine</name><uri>http://www.blogger.com/profile/01268291797043527406</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_arwiFr_8Dbk/S9STmafoNtI/AAAAAAAAAMM/KYaNF-fPRro/S220/me.png'/></author><thr:total>0</thr:total></entry></feed>
