<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.1" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>databene blog</title>
	<link>http://databene.org/blog</link>
	<description>thoughts on java, software development, quality and performance</description>
	<pubDate>Fri, 08 Feb 2008 08:07:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.1</generator>
	<language>en</language>
			<item>
		<title>JBossMQ Setup</title>
		<link>http://databene.org/blog/2008/02/08/jbossmq-setup/</link>
		<comments>http://databene.org/blog/2008/02/08/jbossmq-setup/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 08:07:07 +0000</pubDate>
		<dc:creator>Volker Bergmann</dc:creator>
		
		<category><![CDATA[JBoss]]></category>

		<guid isPermaLink="false">http://databene.org/blog/2008/02/08/jbossmq-setup/</guid>
		<description><![CDATA[A whole lot of Mbeans is involved in the configuration and administration of JbossMQ. Since people (including myself) always get confused, which file contains which configuration, I created a configration map: It contains the most important files and MBeans used when configuring JMS queues and/or security.

From the invocation layers, I chose to use only the [...]]]></description>
			<content:encoded><![CDATA[<p>A whole lot of Mbeans is involved in the configuration and administration of JbossMQ. Since people (including <a href="http://databene.org/volker_bergmann.html">myself</a>) always get confused, which file contains which configuration, I created a configration map: It contains the most important files and MBeans used when configuring JMS queues and/or security.</p>
<p><img src="http://databene.org/images/jms-config.png" alt="JBossMQ Setup Overview" align="middle" height="937" width="702" /></p>
<p>From the invocation layers, I chose to use only the JVM Invocation Layer for this example, the other ones are similar. You find and change the JNDI names of each InvocationLayer&#8217;s JMS ConnectionFactory in the InvocationLayer&#8217;s properties &#8216;ConnectionFactoryJNDIRef&#8217; and &#8216;XAConnectionFactoryJNDIRef&#8217;.</p>
<p>The default HypersonicSQL setup files are displayed. You can find examples for other databases in your Jboss AS installation&#8217;s directories docs/examples/jca (for the datasource setup) docs/examples/jms directory (for the DB related database setup).</p>
<p>The ServiceManager chooses the JAAS security domain. Its configuration is located in conf/login-conf.xml.</p>
<p>IMO the most convenient and maintainable way of configuring own Mbeans is storing all Mbean configurations that belong to one application in one *-service.xml file, e.g. myapp-service.xml.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d6').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d6" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://blinklist.com/index.php?Action=Blink/addblink.php&amp;Name=JBossMQ+Setup&amp;Description=JBossMQ+Setup&amp;Url=http://databene.org/blog/2008/02/08/jbossmq-setup/" title="Add to&nbsp;BlinkList"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/blinklist.png" title="Add to&nbsp;BlinkList" alt="Add to&nbsp;BlinkList" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;title=JBossMQ+Setup" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;title=JBossMQ+Setup" title="Add to&nbsp;digg"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=JBossMQ+Setup&amp;url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;title=JBossMQ+Setup" title="Add to&nbsp;DZone"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://furl.net/storeIt.jsp?t=JBossMQ+Setup&amp;u=http://databene.org/blog/2008/02/08/jbossmq-setup/" title="Add to&nbsp;FURL"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/furl.png" title="Add to&nbsp;FURL" alt="Add to&nbsp;FURL" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;bm_description=JBossMQ+Setup" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;T=JBossMQ+Setup" title="Add to&nbsp;Netscape"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;title=JBossMQ+Setup" title="Add to&nbsp;reddit"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;title=JBossMQ+Setup" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://databene.org/blog/2008/02/08/jbossmq-setup/&amp;title=JBossMQ+Setup" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://databene.org/blog/2008/02/08/jbossmq-setup/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d6').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://databene.org/blog/2008/02/08/jbossmq-setup/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to achieve real vendor-independence with JDBC</title>
		<link>http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/</link>
		<comments>http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 08:33:04 +0000</pubDate>
		<dc:creator>Volker Bergmann</dc:creator>
		
		<category><![CDATA[software design]]></category>

		<category><![CDATA[software quality]]></category>

		<category><![CDATA[CallableStatement]]></category>

		<category><![CDATA[Connection Pool]]></category>

		<category><![CDATA[Database]]></category>

		<category><![CDATA[DatabaseMetadata]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JDBC]]></category>

		<category><![CDATA[metadata]]></category>

		<category><![CDATA[PreparedStatement]]></category>

		<category><![CDATA[ResultSet]]></category>

		<category><![CDATA[ResultSetMetadata]]></category>

		<category><![CDATA[SQL]]></category>

		<category><![CDATA[vendor lock-in]]></category>

		<category><![CDATA[vendor-independence]]></category>

		<guid isPermaLink="false">http://databene.org/blog/2008/01/16/ho-to-achieve-real-vendor-independence-with-jdbc/</guid>
		<description><![CDATA[While JDBC promises vendor-independence, it actually turns out that each database vendor has its own interpretation of the JDBC contract (and commitment to usability). That makes it hard to define a common code base that generically fits all databases. I managed to do so and present the necessary rules here - to my knowledge, it [...]]]></description>
			<content:encoded><![CDATA[<p>While JDBC promises vendor-independence, it actually turns out that each database vendor has its own interpretation of the JDBC contract (and commitment to usability). That makes it hard to define a common code base that generically fits all databases. I managed to do so and present the necessary rules here - to my knowledge, it is the first and only compendium of this type. It embraces <a href="http://databene.org/volker_bergmann.html">my</a> experiences with implementing <a href="http://databene.org/databene-benerator/">benerator</a>, an open source test data generator, with support for Oracle, DB2, MS SQL Server, MySQL, PostgreSQL, HSQL and Derby.</p>
<h3>PreparedStatement, CallableStatement</h3>
<p>Different JDBC drivers have different levels of tolerance, what to accept in the <a href="http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setObject(int,%20java.lang.Object)">setObject()</a> method of a PreparedStatement or CallableStatement. Avoid calling setObject() whenever possible, use the type-specific methods like <a href="http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setInt(int,%20int)">setInt()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setString(int,%20java.lang.String)">setString()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setClob(int,%20java.sql.Clob)">setClob()</a>, etc. instead.</p>
<p>If you must use setObject(), use <a href="http://java.sun.com/javase/6/docs/api/java/sql/Date.html">java.<strong>sql</strong>.Date</a> for setting date columns.</p>
<p>Some JDBC drivers are not able to handle null values in setter methods like setString() or setObject(). Use <a href="http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setNull(int,%20int)">setNull()</a> instead.</p>
<h3>ResultSet, CallableStatement</h3>
<p>Calling getObject() on a <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html">ResultSet</a> sometimes returns vendor-specific datatypes, e.g. Oracle TIMESTAMPTZ or XMLTYPE. Use Java-type-specific methods like <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getInt(int)">getInt()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getString(int)">getString()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getClob(int)"> getClob()</a> etc.. For vendor-specific types, find and use the appropriate Java-type-getter, e.g. <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getTimestamp(int)">getTimestamp()</a> for a <a href="http://www.oracle.com/webapps/online-help/jdeveloper/10.1.2/topics/jdbc-javadoc/oracle/sql/TIMESTAMPTZ.html">TIMESTAMPTZ</a> or <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getClob(int)">getClob()</a> for an XMLTYPE (mapped to <a href="http://www.oracle.com/webapps/online-help/jdeveloper/10.1.2/topics/jdbc-javadoc/oracle/sql/OPAQUE.html">OPAQUE</a>).</p>
<h3>Connection Pool</h3>
<p>If the database uses a vendor-specific type, it is likely that the JDBC driver requires its propretary Connection implementation. This may fail if you use a Connection pool. For instance, Oracle will throw a ClassCastException when trying to retrieve an XMLType from a Connection wrapper.  In such a case you need to explicitely unwrap and use the vendor-specific Connection.</p>
<p>I have checked this for two open source connection pools:</p>
<ul>
<li><a href="http://sourceforge.net/projects/c3p0">c3p0</a> hides the original Connection - no-go!</li>
<li><a href="http://commons.apache.org/dbcp/">DBCP</a> exhibits it by providing a getConnection() method of the 	wrapper class - go!</li>
</ul>
<h3>Column Names</h3>
<p>Use column numbers instead of column names.</p>
<h3>Metadata ResultSets</h3>
<p>Metadata is returned in the form of <a href="http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html">ResultSets</a>.</p>
<p>Be prepared that the ResultSet may have less columns than declared in the <a href="http://java.sun.com/javase/6/docs/api/java/sql/DatabaseMetaData.html">DatabaseMetadata Javadoc</a>.</p>
<p>Iterate through the columns only once, from left to right.</p>
<h3>Metadata Capitalization</h3>
<p>When navigating through <a href="http://java.sun.com/javase/6/docs/api/java/sql/DatabaseMetaData.html">DatabaseMetadata</a> by consecutive querying, use the names in the capitalization returned in former requests as arguments for subsequent requests.</p>
<h3>Schema Metadata</h3>
<p>The <a href="http://java.sun.com/javase/6/docs/api/java/sql/DatabaseMetaData.html">DatabaseMetadata</a> groups database schemas into catalogs.  Each JDBC drivers actually seems to ignore one of the two:</p>
<ul>
<li>most drivers have no catalog or a default catalog which 	contains all schemas.</li>
<li>MySQL and (by rumour) the ODBC/JDBC bridge drivers provide no schema, but each &#8216;<em>thing formerly called schema</em>&#8216; as a catalog!</li>
</ul>
<h3>Table Metadata</h3>
<p>When querying schemas for tables, be prepared to retrieve metadata of deleted tables, e.g. BIN$&#8230; tables in Oracle. This is in fact the only piece of code where I make an explicit check for the name of the database vendor - just in case.</p>
<h3>Column Metadata</h3>
<p>The driver may render default values in brackets, e.g. &#8216;(1)&#8217; instead of &#8216;1&#8242;. You may also encounter additional white space, e.g. &#8216;1 &#8216; instead of &#8216;1&#8242;.</p>
<h3>Column Type Metadata</h3>
<p>When querying the column type from database metadata, you get a columnType of type int and a columnTypeName. The columnType is the vendor-independent code from <a href="http://java.sun.com/javase/6/docs/api/java/sql/Types.html">java.sql.Types</a>, e.g. <a href="http://java.sun.com/javase/6/docs/api/java/sql/Types.html#CLOB">Types.CLOB</a>, the columnTypeName is vendor-specific.</p>
<p>In the ResultSetMetaData class, these are provided by the methods</p>
<ul>
<li>int getColumnType(int column)</li>
<li>String getColumnTypeName(int column)</li>
</ul>
<p>The DatabaseMetaData class returns them as ResultSet columns when calling <a href="http://java.sun.com/javase/6/docs/api/java/sql/DatabaseMetaData.html#getColumns(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String)">getColumns()</a></p>
<table width="400">
<tr>
<th>column</th>
<th>column name</th>
<th>column type</th>
</tr>
<tr>
<td>5</td>
<td>DATA_TYPE</td>
<td>int</td>
</tr>
<tr>
<td>6</td>
<td>TYPE_NAME</td>
<td>string</td>
</tr>
</table>
<p>For vendor-specific types this will return 1111 (<a href="http://java.sun.com/javase/6/docs/api/java/sql/Types.html#OTHER">Types.OTHER</a>) and you need to judge the appropriate Java type from the vendor-specific typeName. I map typeName substring to Java types for this, e.g. any type containing a substring &#8216;XML&#8217;  will be handled as Types.CLOB and used with get/setClob().</p>
<h3>Index Metadata</h3>
<p>When querying index metadata, be prepared to face column names that cannot be found in a table! This is the case for e.g. functional indexes in Oracle databases which are used for indexing timestamps.</p>
<h3>&#8230;anything else?</h3>
<p>This list makes no claim to be complete. If you know of other resources or have made further experiences with vendor-dependencies, please tell the world by posting a comment.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d5').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d5" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://blinklist.com/index.php?Action=Blink/addblink.php&amp;Name=How+to+achieve+real+vendor-independence+with+JDBC&amp;Description=How+to+achieve+real+vendor-independence+with+JDBC&amp;Url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/" title="Add to&nbsp;BlinkList"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/blinklist.png" title="Add to&nbsp;BlinkList" alt="Add to&nbsp;BlinkList" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;title=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;title=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;digg"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=How+to+achieve+real+vendor-independence+with+JDBC&amp;url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;title=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;DZone"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://furl.net/storeIt.jsp?t=How+to+achieve+real+vendor-independence+with+JDBC&amp;u=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/" title="Add to&nbsp;FURL"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/furl.png" title="Add to&nbsp;FURL" alt="Add to&nbsp;FURL" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;bm_description=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;T=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;Netscape"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;title=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;reddit"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;title=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/&amp;title=How+to+achieve+real+vendor-independence+with+JDBC" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d5').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://databene.org/blog/2008/01/16/how-to-achieve-real-vendor-independence-with-jdbc/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Performance Meta Antipatterns</title>
		<link>http://databene.org/blog/2008/01/12/performance-meta-antipatterns/</link>
		<comments>http://databene.org/blog/2008/01/12/performance-meta-antipatterns/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 09:12:13 +0000</pubDate>
		<dc:creator>Volker Bergmann</dc:creator>
		
		<category><![CDATA[patterns]]></category>

		<category><![CDATA[performance]]></category>

		<category><![CDATA[software quality]]></category>

		<category><![CDATA[Antipatterns]]></category>

		<category><![CDATA[Performance Antipatterns]]></category>

		<guid isPermaLink="false">http://databene.org/blog/2008/01/12/performance-meta-antipatterns/</guid>
		<description><![CDATA[Since I have been working as trouble shooter and performance specialist for 10 years now (as of 2008), I have faced and solved lots of different and common performance problems. Soon I had to realize that

there are common mistakes, made again and again. That gives cause to systematically collect, analyze and describe these mistakes. They [...]]]></description>
			<content:encoded><![CDATA[<p>Since I have been working as <a href="http://bergmann-it.de">trouble shooter and performance specialist</a> for 10 years now (as of 2008), I have faced and solved lots of different and common performance problems. Soon I had to realize that</p>
<ol>
<li>there are <strong>common mistakes, made again and again</strong>. That gives cause to systematically collect, analyze and describe these mistakes. They are solutions to a problem (mostly a functional requirement) and, thus, might implement a design pattern properly. Though, they cause trouble in some other way (e.g. non-functional or unspecified requirement), constituting an antipattern. For a developer these a samples of what to avoid.</li>
<li><strong>detecting the cause of a problem is a </strong>(to some extend) <strong>intuitive task</strong>, because of the complexity of systems: With rising experience you &#8217;smell&#8217; problems by observations of system behavior under different circumstances, known weaknesses of products and  estimated competence of team members. Step by step you confirm or reject suspects by tests and tools, taking some deviations and finally find the cause. A taxonomy of performance issues would help adding objectivity and system to this process and ease the process of performance analysis for beginners.</li>
</ol>
<p>There are lots of antipatterns already defined, but they are strongly distributed work by individuals. Some sites and books list antipatterns (too bad, it is about any antipatterns, not just performance-related ones):</p>
<p><strong>Books</strong></p>
<ul>
<li>Bitter EJB, by Bruce Tate</li>
<li>Antipatterns, by William J. Brown, Raphael C. Malveau and Hays McCormick</li>
<li>Bitter Java, by Bruce Tate (<a href="http://www.amazon.com/review/product/1930110952">Comments</a> on amazon, <a href="http://www.manning.com/tate/excerpt_contents.html">Table of Contents</a>)</li>
</ul>
<p><strong>Web Sites</strong></p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Anti-pattern">Wikipedia Anti-pattern article</a></li>
<li><a href="http://c2.com/cgi-bin/wiki?AntiPatternsCatalog">Antipatterns Category Catalog</a> of the <a href="http://c2.com/ppr/">Portland Pattern Repository</a></li>
<li><a href="http://www.antipatterns.com/">Antipatterns</a> (related to the book above)</li>
<li><a href="http://cz.sun.com/techdays/prague/prezentace/Day2_Track2/peformance%20antipatterns.pdf">Performance Anti-patterns</a> by Kirk Pepperdine</li>
<li><a href="http://www.solarisinternals.com/wiki/index.php/Performance_Antipatterns">Article</a> on Performance Antipatterns by Bart Smaalders</li>
<li><a href="http://www.perfx.net/pdf/Antipatterns01.pdf">Paper</a> on Software<br />
Performance AntiPatterns by Connie U. Smith &amp; Lloyd G. Williams</li>
</ul>
<p>When searching for performance antipatterns you are on your own: I have not managed to find any systematic list of performance antipatterns; even the known sites or books do not group or at least mark performance antipatterns, you have to read through all of the patterns to refine the performance related ones.</p>
<p>Though reading through all antipatterns would help you a lot improving your design and programmings skill, you probably will not have the time to do so. But I did and decided to start my own list of performance antipatterns. After some time of research, the performance antipatterns found summed up to more than 100 unique patterns.</p>
<p>I observed that many antipatterns of different technologies have something in common, there is a meta concept that impacts performance. I refined the meta concepts and grouped them hierarchically to - voilà – about 30 <strong>performance <em>meta </em>antipatterns</strong>. They are useful for designers and architects, showing rather plattform-independent <em>critical concepts</em> than platform-dependent samples. This still is a work in progress.</p>
<p>Time for some definitions:</p>
<ul>
<li><strong>Design Pattern</strong>: proven solution to a recurring problem</li>
<li><strong>Antipattern</strong>: recurring bad practice in solving a recurring problem</li>
<li><strong>Performance Antipattern</strong>: Antipattern that results in poorly performing systems and/or increased effort in making systems perform (while not affecting fulfillment of functional requirements)</li>
<li><strong>Meta Antipattern</strong>: Common concept that is the foundation of different antipatterns</li>
</ul>
<p>When telling you about antipatterns, I face a problem: The concepts are public domain, since anybody implements the pattern, but the naming and description of an antipattern is individual work and subject to copyright laws. Thus I will restrict my description of foreign work to a minimum and link to the original source in such cases.</p>
<p>Many patterns come frome the following books, I&#8217;ve read all of them and find each one highly valuable. Read at least some of them. I guess they might be most useful for you in the following order (by priority and applicability): &#8216;Bitter EJB&#8217; (EJB-related), &#8216;Antipatterns&#8217; (more architectural and technology-independent) and &#8216;Bitter Java&#8217; (a little outdated, but good patterns for desktop or selfmade server systems).</p>
<p>In the next weeks I will add blog entries for specific performance (meta) antipatterns. Meanwhile read the books and sites recommended above and have a look at some useful performance-test-related open source tools: <a href="http://www.clarkware.com/software/JUnitPerf.html">JUnitPerf</a>, <a href="http://jakarta.apache.org/jmeter/">JMeter</a> and <a href="http://databene.org/databene-benerator/">benerator</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d4').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d4" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://blinklist.com/index.php?Action=Blink/addblink.php&amp;Name=Performance+Meta+Antipatterns&amp;Description=Performance+Meta+Antipatterns&amp;Url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/" title="Add to&nbsp;BlinkList"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/blinklist.png" title="Add to&nbsp;BlinkList" alt="Add to&nbsp;BlinkList" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;title=Performance+Meta+Antipatterns" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;title=Performance+Meta+Antipatterns" title="Add to&nbsp;digg"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Performance+Meta+Antipatterns&amp;url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;title=Performance+Meta+Antipatterns" title="Add to&nbsp;DZone"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://furl.net/storeIt.jsp?t=Performance+Meta+Antipatterns&amp;u=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/" title="Add to&nbsp;FURL"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/furl.png" title="Add to&nbsp;FURL" alt="Add to&nbsp;FURL" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;bm_description=Performance+Meta+Antipatterns" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;T=Performance+Meta+Antipatterns" title="Add to&nbsp;Netscape"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;title=Performance+Meta+Antipatterns" title="Add to&nbsp;reddit"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;title=Performance+Meta+Antipatterns" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/&amp;title=Performance+Meta+Antipatterns" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://databene.org/blog/2008/01/12/performance-meta-antipatterns/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d4').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://databene.org/blog/2008/01/12/performance-meta-antipatterns/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cool &#38; helpful: Literate Programming</title>
		<link>http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/</link>
		<comments>http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 16:56:09 +0000</pubDate>
		<dc:creator>Volker Bergmann</dc:creator>
		
		<category><![CDATA[software design]]></category>

		<category><![CDATA[API Design]]></category>

		<category><![CDATA[Literate Programming]]></category>

		<guid isPermaLink="false">http://databene.org/blog/?p=3</guid>
		<description><![CDATA[Some things make development fun, some things are honoured by your professional environment. Things that provide for both are the most pleasant - literate programming is one!
Literate programming is a concept of programming which states that a program should have readability as a primary goal,
thus making programs works of literature.
Initially this embraced adding documentation to [...]]]></description>
			<content:encoded><![CDATA[<p>Some things make development fun, some things are honoured by your professional environment. Things that provide for both are the most pleasant - literate programming is one!</p>
<p>Literate programming is a concept of programming which states that a program should have readability as a primary goal,<br />
thus making programs works of literature.</p>
<p>Initially this embraced adding documentation to source code like with JavaDoc and has been adopted by many programming languages, e.g. with Doxygen. (For Historians: The original idea was stated by Donald Knuth in some former century and prototyped by his WEB environment, using Pascal as programming language and TeX for documentation.)</p>
<p>Since we all <em>love</em> to write documentation, people have found concepts of literate programming with a much higher coolness factor:</p>
<p><strong>Designing program APIs to form human-readable statements.</strong></p>
<p>A simple example everyone is supposed to be familiar with, is the StringBuffer/-Builder, e.g.</p>
<pre>buffer.append("Hello ").append(user);</pre>
<p>Great examples of complete APIs are <a href="http://www.easymock.org/">EasyMock</a>, <a href="http://www.junit.org/">JUnit 4</a> and <a href="http://commons.apache.org/lang/">commons-lang</a>. For example, JUnit 4 allows you to write fancy test code like this (see the <a href="http://junit.sourceforge.net/doc/ReleaseNotes4.4.html">JUnit 4.4 release notes</a>):</p>
<pre>assertThat(answer, either(containsString("color")).or(containsString("colour")));</pre>
<p>&#8230;do these statements really need documentation?</p>
<p>From the purpose of the mentioned libraries, you get the impression that especially dull tasks inpire people to &#8216;play&#8217; with such ideas. I assume this is true since:<br />
- building objects and testing software is complex and strongly repetitive<br />
- repetitive tasks invite for facilitation by abstractions or at least abbreviations<br />
- your grandma now gets an idea of what you are coding. Even better: you still understand your code when revisiting it six months later!<br />
- when doing dull tasks, you are searching for things to have fun with</p>
<p>The latest statement is funny but exhibits a deeper truth: Making dull tasks a fun is infectuous and you can&#8217;t stop it. I will never be able to write stupid test cases again.</p>
<p>In each business or technical discipline you have common concepts to test that can be abstracted and &#8216;literated&#8217;.</p>
<p>An example from my work: While developing <a href="http://databene.org/databene-benerator">benerator</a>, an open source framework for test data generation, I need to test data sequences that are generated in subsequent calls to a generator object. A naive test implementation looked like this:</p>
<pre>
assertTrue(generator.available());
assertEquals(1L, generator.generate());
assertTrue(generator.available());
assertEquals(3L, generator.generate());
assertTrue(generator.available());
assertEquals(2L, generator.generate());
assertFalse(generator.available());</pre>
<p>With a literate API I could reduce this to</p>
<pre>expectSequence(generator,  1L,  3L,  2L).withCeasedAvailability();</pre>
<p>Much shorter, much quicker to write and understand, yet easier to maintain! It is even supported by code completion. I love it!</p>
<p>If you now state: &#8220;I code like a real man - sissies don&#8217;t need to understand my code&#8221;,you are headed for trouble with your boss and collegues, but I have a relief: Delving into the skills needed to design and implement such APIs you will find a wide playground to unleash your code monsters, yet making users of your code happy:</p>
<p>For implementing such behaviour you need to create<br />
- a parent class of your test case (or a utility class from which you import statically)<br />
- one or more helper classes for invocation chaining</p>
<p>The parent class provides the methods initially called (like <code>expectSequence()</code>), the helper classes provide for invocation chaining. These helper classes are your monster&#8217;s playground and will scare any sissy at first blush:</p>
<pre>
public class GeneratorTestCase extends TestCase {
  // snip...
  protected static &lt;T&gt; Helper expectGenerations(
      Generator&lt;T&gt; generator, T ... products) {
    for (T expectedProduct : products) {
      assertTrue(generator.available);
      assertEquals(expectedProduct, generator.generate());
    }
    return new Helper(generator);
  }

  public static class Helper {

    private Generator generator;

    public Helper(Generator generator) {
      this.generator = generator;
    }

    public Helper withCeasedAvailability() {
      assertFalse("Generator is expected to be unavailable: " +
        generator, generator.available());
      try {
        generator.generate();
        fail("Expectected IllegalGeneratorStateException");
      } catch (IllegalGeneratorStateException e) {
        // exception is required
      }
    }
    // snip...
  }
}</pre>
<p>Reading through the code, you will easily understand the <code>expectGenerations()</code> method: It iterates through a varargs parameter verifying generator invocation results for each. Finally, it returns a <code>Helper</code> instance that enables you to add another <code>.method()</code> call to the <code>expectGenerations()</code> command. This needs to act on one or more of the objects processed by the first method call. Thus, the concerned objects need to be internally submitted to the helper when constructing it.</p>
<p>You can continue the concept iterativly or recursively: Iteratively, by returning the Helper from the method <code>withCeasedAvailability()</code> as shown in the example, or recursively by returning further helper classes that provide features dependent of the sematic that is implied by the current Helper method call.</p>
<p>Once you have grasped the concept, it is supposed to change your development life. When you get the taste of it, it will be hard to get back.</p>
<p>Now go on, infect others with the literate-programming-virus, have fun doing QA and don&#8217;t forget to let grandma check your code!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d3').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d3" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://blinklist.com/index.php?Action=Blink/addblink.php&amp;Name=Cool+%26amp%3B+helpful%3A+Literate+Programming&amp;Description=Cool+%26amp%3B+helpful%3A+Literate+Programming&amp;Url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/" title="Add to&nbsp;BlinkList"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/blinklist.png" title="Add to&nbsp;BlinkList" alt="Add to&nbsp;BlinkList" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;title=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;title=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;digg"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Cool+%26amp%3B+helpful%3A+Literate+Programming&amp;url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;title=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;DZone"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://furl.net/storeIt.jsp?t=Cool+%26amp%3B+helpful%3A+Literate+Programming&amp;u=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/" title="Add to&nbsp;FURL"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/furl.png" title="Add to&nbsp;FURL" alt="Add to&nbsp;FURL" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;bm_description=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;T=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;Netscape"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;title=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;reddit"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;title=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/&amp;title=Cool+%26amp%3B+helpful%3A+Literate+Programming" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/" title="Add to&nbsp;Technorati"><img class="social_img" src="http://databene.org/blog/wp-content/plugins/social_bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d3').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://databene.org/blog/2007/11/14/cool-helpful-literate-programming/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
