<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-17924780</atom:id><lastBuildDate>Tue, 02 Mar 2010 00:00:00 PST</lastBuildDate><title>Harlan's Development Journal</title><description>A.D.D. Driven Development creates all the buzz.</description><link>http://blog.devspan.com/</link><managingEditor>noreply@blogger.com (Harlan Iverson)</managingEditor><generator>Blogger</generator><openSearch:totalResults>80</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/HarlansDevelopmentJournal" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="harlansdevelopmentjournal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Links for 2010-03-01 [del.icio.us]</title><link>http://del.icio.us/harlanji#2010-03-01</link><pubDate>Tue, 02 Mar 2010 00:00:00 PST</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2010-03-01</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wolfey.110mb.com/GameVisual/launch.php"&gt;Minimax / Negamax with alpha-beta pruning applet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links for 2010-02-24 [del.icio.us]</title><link>http://del.icio.us/harlanji#2010-02-24</link><pubDate>Thu, 25 Feb 2010 00:00:00 PST</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2010-02-24</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.eventhelix.com/realtimemantra/HeaderFileIncludePatterns.htm"&gt;C++ Header File Include Patterns&lt;/a&gt;&lt;br/&gt;
Infinitely useful pattern for including c++ headers and using forward declarations.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links for 2009-10-06 [del.icio.us]</title><link>http://del.icio.us/harlanji#2009-10-06</link><pubDate>Wed, 07 Oct 2009 00:00:00 PDT</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2009-10-06</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.monzy.com/intro/pimpinglemma_lyrics.html"&gt;The Pimping Lemma | Lyrics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.montana.edu/webworks/projects/theoryportal/models/pumping-lemma/pumpingLemmaApplets/contents.html"&gt;Pumping Lemma Contents&lt;/a&gt;&lt;br/&gt;
Nice interactive pumping lemma utility.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links for 2009-09-04 [del.icio.us]</title><link>http://del.icio.us/harlanji#2009-09-04</link><pubDate>Sat, 05 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2009-09-04</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.netbeans.org/kb/docs/java/debug-deadlock-screencast.html"&gt;Video of Deadlock Detection Using the NetBeans Debugger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/"&gt;What's New in JSF 2?&lt;/a&gt;&lt;br/&gt;
beautiful summary of many new features condensed to one place.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links for 2009-09-02 [del.icio.us]</title><link>http://del.icio.us/harlanji#2009-09-02</link><pubDate>Thu, 03 Sep 2009 00:00:00 PDT</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2009-09-02</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html"&gt;Comparison of Java Mocking Frameworks&lt;/a&gt;&lt;br/&gt;
Mockito seems to take the cake, except for static/final and equals/hasCode methods.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links for 2009-08-22 [del.icio.us]</title><link>http://del.icio.us/harlanji#2009-08-22</link><pubDate>Sun, 23 Aug 2009 00:00:00 PDT</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2009-08-22</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://richardbarabe.wordpress.com/2008/08/14/test-driving-a-simpleformcontroller-with-spring-mvc/"&gt;Test-Driving a SimpleFormController with Spring MVC&lt;/a&gt;&lt;br/&gt;
Good example of mocking a Spring MVC service and controller. Uses EasyMock but it&amp;#039;s a simple example so it applies to any mocking framework.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zenoconsulting.wikidot.com/blog:8"&gt;Testing JPA Hibernate with Spring &amp;amp; DbUnit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links for 2009-08-16 [del.icio.us]</title><link>http://del.icio.us/harlanji#2009-08-16</link><pubDate>Mon, 17 Aug 2009 00:00:00 PDT</pubDate><guid isPermaLink="true">http://del.icio.us/harlanji#2009-08-16</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.developers-blog.org/blog/default/2009/05/20/Create-a-simple-RESTful-Webservice-with-Jersey-and-Spring"&gt;Create a simple RESTful Webservice with Jersey and Spring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-3423904945025713329</guid><pubDate>Tue, 01 Jul 2008 18:27:00 +0000</pubDate><atom:updated>2008-07-01T11:36:44.902-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">web</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>More Thoughts on Maven Loader</title><description>Continuing the train of thought &lt;a href="/2008/06/javascript-dependency-system-using.html"&gt;I started laying out last night&lt;/a&gt;, I have some more details about the MavenLoader client module.&lt;br /&gt;&lt;br /&gt;The Maven JS Plugin could generate a Javascript file or replace a token in HTML files in war projects that sets up the MavenLoader in the way talked about yesterday automatically based on the war project's POM dependencies upon Javascript artifacts. I suppose this could also be a stand-alone plugin that operates on wars.&lt;br /&gt;&lt;br /&gt;There could also be a POM configuration option whether to prefer local copies of dependencies or ones from a specified repository (repopath). The code that expands the artifacts and rolls them up into YUI Loader format could be shared between the daemon and the Maven plugin.&lt;br /&gt;&lt;br /&gt;This would close the circle a little more for Maven developers but still not require Maven in order to take advantage of the system. It would also be a step toward building the YUI Test integration with the JS plugin that I want :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-3423904945025713329?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/07/more-thoughts-on-maven-loader.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-4778770174690294312</guid><pubDate>Mon, 30 Jun 2008 23:36:00 +0000</pubDate><atom:updated>2008-06-30T17:19:52.254-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">web</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Javascript Dependency System using Maven + YUI Loader</title><description>I started thinking a while back about how to create a repository of Javascript libraries / applications using Maven for decentralized transitive dependency management. The progression of things that has led to these thoughts are &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;, &lt;a href="http://mojo.codehaus.org/javascript-maven-tools/"&gt;Maven JS Tools&lt;/a&gt; (&lt;a href="http://jira.codehaus.org/browse/MOJO-1139"&gt;feature request&lt;/a&gt;), &lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;Google AJAX Libraries API&lt;/a&gt;, and &lt;a href="http://developer.yahoo.com/yui/yuiloader"&gt;YUI Loader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My initial thoughts include using the Maven JS Tools plugin to build Javascript libraries in the same fashion as library jars for Java. These can be pushed to an external Maven repository and synced with the central repository.&lt;br /&gt;&lt;br /&gt;A daemon could then pull Javascript artifacts from the central repository and process them. This would include extraction, building dependency meta-data for YUI Loader so that it could discover dependencies and download them as needed, and making both items available on a public HTTP server using YUI Loader's layout conventions.&lt;br /&gt;&lt;br /&gt;On the client side, there would exist a MavenLoader model as a module loaded YUI Loader as normal. It would use &lt;a href="http://developer.yahoo.com/yui/yuiloader/"&gt;addModule()&lt;/a&gt; like:&lt;br /&gt;&lt;pre&gt;loader.addModule({&lt;br /&gt;name: "mavenloader",&lt;br /&gt;type: "js",&lt;br /&gt;fullpath: "http://jsrepo.maven.apache.org/mavenloader/mavenloader.js"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// pull in the mavenLoader module now&lt;br /&gt;loader.insert();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;From this point, you could create a new MavenLoader as a decorator for YUILoader:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;//Add the module to YUILoader&lt;br /&gt;var mavenLoader = new MavenLoader({&lt;br /&gt;loader: loader,&lt;br /&gt;// maybe this can be inferred based on the loaded mavenloader?&lt;br /&gt;repopath: "http://jsrepo.maven.apache.org/"&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;mavenLoader.require( "com.soashable:xmpp4js:1.0-SNAPSHOT" );&lt;br /&gt;// or&lt;br /&gt;mavenLoader.require({&lt;br /&gt;groupId: "com.soashable",&lt;br /&gt;artifactId: "xmpp4js",&lt;br /&gt;version: "1.0-SNAPSHOT"&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt; The meta-data that the repo adds to the Javascript artifacts would call register() and addModule() just like regular yui modules work, except it would be on MavenLoader and actually wrap the YUI Loader functionality under the hood:&lt;br /&gt;&lt;pre&gt;mavenLoader.addModule({&lt;br /&gt;groupId: "com.soashable",&lt;br /&gt;artifactId: "xmpp4js",&lt;br /&gt;version: "1.0-SNAPSHOT",&lt;br /&gt;requires: [{groupId: "com.prototype", artifactId: "prototype", version: "1.5.1"}]&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;// ...&lt;br /&gt;&lt;br /&gt;MavenLoader.register({&lt;br /&gt;groupId: "com.soashable",&lt;br /&gt;artifactId: "xmpp4js",&lt;br /&gt;version: "1.0-SNAPSHOT"&lt;br /&gt;}, YAHOO.xmpp4js.Module);&lt;/pre&gt;&lt;br /&gt;At this point, a call to the normal YUI Loader's insert() method should pull in all Maven dependencies transitively, with tranitive modules being added, registered and included recursively.&lt;br /&gt;&lt;br /&gt;This is of course rough speculation, but my initial experimentation leads me to belieive that this system should be possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-4778770174690294312?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/06/javascript-dependency-system-using.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-7502212767451475292</guid><pubDate>Sun, 18 May 2008 17:33:00 +0000</pubDate><atom:updated>2008-05-18T11:01:24.614-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">maven</category><category domain="http://www.blogger.com/atom/ns#">experiments</category><title>Observations of Doxia Menu Inheritance</title><description>I couldn't find much/any documentation on inheriting menus from a Super POM using Doxia + Maven 2. Here is a quick overview of what I think I have learned using a small reference example to illustrate.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Project Layout&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;superproject&lt;br /&gt;|&lt;br /&gt;+- src/site/site.xml&lt;br /&gt;|&lt;br /&gt;\- module1&lt;br /&gt; |&lt;br /&gt; \- src/site/site.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Super Module site.xml Content&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;project name="${project.name}"&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;1   &amp;lt;menu ref="parent" inherit="top"/&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;menu name="Super Menu"&amp;gt;&lt;br /&gt;      &amp;lt;item name="Parent A" href="parenta.html"/&amp;gt;&lt;br /&gt;      &amp;lt;item name="Parent B" href="parentb.html"/&amp;gt;&lt;br /&gt;  &amp;lt;/menu&amp;gt;&lt;br /&gt;&lt;br /&gt;2   &amp;lt;menu ref="modules" inherit="bottom"/&amp;gt;&lt;br /&gt;3   &amp;lt;menu ref="reports" inherit="bottom"/&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sub Module site.xml Content&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;project name="${project.name}"&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;4   &amp;lt;menu name="Menu A" inherit="bottom"&amp;gt;&lt;br /&gt;       &amp;lt;item name="Link 1" href="link1.html"/&amp;gt;&lt;br /&gt;       &amp;lt;item name="Link 2" href="link2.html"/&amp;gt;&lt;br /&gt;   &amp;lt;/menu&amp;gt;&lt;br /&gt;5  &amp;lt;menu ref="reports" inherit="bottom"/&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what does all this mean?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;interitance="top|bottom" - put a menu node before or after sub module's menu items&lt;/li&gt;&lt;li&gt;1 - will only be visible and have content in sub modules&lt;/li&gt;&lt;li&gt;2 - will only be visible and have content in super modules&lt;/li&gt;&lt;li&gt;3 - put reports at the bottom of all modules&lt;/li&gt;&lt;li&gt;4 - inherit="bottom" is not completely clear to me, but either top or bottom is required for the menu to show up&lt;/li&gt;&lt;li&gt;5 - I wanted project reports to always be at the bottom of the menu and could not figure it out without explicitly putting it there; this seems to override the report menu specified in the super site.xml.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Please correct me if I'm wrong about any of these observations/assumptions, and point me to documentation if you know of any. Otherwise, I hope this helps somebody.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-7502212767451475292?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/05/observations-of-doxia-menu-inheritance.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-4829038268614515723</guid><pubDate>Fri, 16 May 2008 19:26:00 +0000</pubDate><atom:updated>2008-05-16T15:09:24.369-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">opinion</category><category domain="http://www.blogger.com/atom/ns#">iiw6</category><title>Internet Identity Workshop (IIW) - Thoughts</title><description>I had the privilege of attending the Internet Identity Workshop (IIW) in Mountain View this week. It was a very cool experience, and my first time out to the valley. On a whole people are pretty sharp, but I think what differentiates them from the local talent in the Twin Cities is their connections. The majority of people there weren't much beyond my punching weight, but a key difference is that a good number were. I want to be the least talented person in a given setting; not by striving to be the worst, but simply by being surrounded by people who are great.&lt;br /&gt;&lt;br /&gt;My favorite session was of course my own, "Identity Beyond The Web"; it would have been nothing though, without Jeff Hodges there. We went over the basics of SASL and SAML, talked about various SAML profiles and how they would plug into the design pattern of SASL. We also talked about n-tier authN/authZ and bashed OpenID a bit. Not that OpenID sucks, it just doesn't solve any non-web related identity problems.&lt;br /&gt;&lt;br /&gt;Another interesting talk that indirectly tied in to SAML was given by Bryant Cutler and Devlin Daley; I don't have the session title, but the part I caught related to patterns of assertions about n-tiers of parties. I'm looking forward to reading their work.&lt;br /&gt;&lt;br /&gt;My biggest hope for future IIW is more discussion of identity beyond the web and OpenID. I think it's a reasonable solution for a very limited space (probably its intended purpose), but it does not solve the more fundamental problem of ubiquitous identity.&lt;br /&gt;&lt;br /&gt;I have gained a reasonable understanding of the identity space, but it is much, much deeper than the lay person can possibly imagine. I still have a long, long way to go. Otherwise this blog post would be much more insightful :)&lt;br /&gt;&lt;br /&gt;There is no sense reiterating a review of the entire event, as there are plenty out there; just search for IIW2008a or IIW6.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-4829038268614515723?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/05/internet-identity-workshop-iiw-thoughts.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-5247234615152562607</guid><pubDate>Fri, 25 Apr 2008 22:58:00 +0000</pubDate><atom:updated>2008-04-25T13:59:15.547-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">soashable</category><category domain="http://www.blogger.com/atom/ns#">barcamp</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><title>XMPP on the Web: Soashable (upcoming MinneBar Session)</title><description>I'll be hosting a session at &lt;a href="http://barcamp.org/MinneBar"&gt;MinneBar&lt;/a&gt; this year: "XMPP on the Web: Soashable" on Saturday May 10th, at Coffman Union; it's FREE. I've never done anything like this, so hopefully they get out the free beer early ;).&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;XMPP on the Web: Soashable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Soashable is a web based, Open Source, multi-protocol instant messenger based on XMPP(Jabber) using BOSH (XEP-0124 and 0206); it is similar to Meebo. XMPP is anything from an IM protocol to a poor-man's middleware solution. Subject matter will range from technical details of XMPP and Soashable, to high level discussion of Jabber and standardization, to direction of the Soashable project.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Even if you don't come to my session, be sure to check out MinneBar if you're in the area. Last year it had an awesome turn out (I think I heard it was the biggest BarCamp ever), and the MinneDemos throughout the year have become more and more popular (though sometimes the presentations have reflected that... people market/seek VC rather than sharing interesting ideas). The unconference style gets some great conversation outside of the sessions going; I've never had a problem joining any conversation that's sounded interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-5247234615152562607?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/04/xmpp-on-web-soashable-upcoming-minnebar.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6337289973369589013</guid><pubDate>Fri, 25 Apr 2008 14:14:00 +0000</pubDate><atom:updated>2008-04-25T07:22:32.185-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">me</category><category domain="http://www.blogger.com/atom/ns#">social broadcasting</category><category domain="http://www.blogger.com/atom/ns#">experiments</category><title>Twitter</title><description>Along with &lt;a href="http://goatzebra.blogspot.com"&gt;Clayton&lt;/a&gt;, I hesitantly signed up for &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;. Social broadcasting is something that I don't yet understand; well, I should say I don't see as useful; but I'll give it an honest try.&lt;br /&gt;&lt;br /&gt;I remember the days when people made fun of LiveJournal because people posted about mundane things like eating a delicious peanut butter and jelly sandwich. I think I'm stuck at web 1.5.&lt;br /&gt;&lt;br /&gt;Hit me up: &lt;a href="http://twitter.com/harlanji"&gt;http://twitter.com/harlanji&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6337289973369589013?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/04/twitter.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6956832044723894378</guid><pubDate>Wed, 16 Apr 2008 03:57:00 +0000</pubDate><atom:updated>2008-04-16T06:51:23.612-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">me</category><title>What I've Been Up To</title><description>&lt;p style="margin-bottom: 0in;"&gt;Hello Blogosphere. It's been a busy couple of months; lots has happened. Aside from my extremely busy personal life, I've had a pretty fruitful career as well:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Soashable&lt;/b&gt;&lt;br /&gt;The little project that could. I actually haven't had a chance to touch it since Feb (the night of my previous blog post). It's seen a healthy surge of traffic throughout March. I can say that I've reached my first attainable goal of 10,000 unique visits :). How soon till 100k? Let's try for this Summer.&lt;br /&gt;&lt;br /&gt;There will surely be some time to work on this around the end of April or early May. The focus will be on improving documentation, polishing up the GUI, and making it scale. I have some fun ideas, but have no idea which ones I'll end up executing. I will not have a day job for a month or two this summer, so we'll see what kinds of progress I can make on it.&lt;br /&gt;&lt;br /&gt;Another quick nugget: the technique I am using for the Soashable/Xmpp4Js webapp "launcher" is &lt;a href="http://jira.codehaus.org/browse/JETTY-518"&gt;being added &lt;/a&gt;to the Jetty Maven plugin; I was excited to see that somebody picked up on it before I got around to creating a feature request :).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Day-Job&lt;/b&gt;&lt;br /&gt;Perhaps the most interesting thing happening right now is my day job (yea, I know. wtf?). We've recently dropped a $20m vendor contract, and I am heading research on shifting from a procedural to a declarative rules engine. The prospective engine is JBoss Drools 4.0.&lt;br /&gt;&lt;br /&gt;Drools is an extremely exciting piece of technology. I had been interested in it for some time, but had never been able to wrap my head around how it was different from a scripting language. I was recently introduced to logic and predicate calculus at University, and that primed me to accept the basis for declarative rules. Having the opportunity to experiment with Drools full time for a couple weeks and play with concrete examples got me the rest of the way there.&lt;br /&gt;&lt;br /&gt;The JBoss Drools + BRMS + IDE tools blow all other OSS rules engines out of the water, hands down. The Drools team has their head on the right way when they talk about creating tools to strongly integrate process and business rules; that is really the missing link, and supposedly the value that a rules engine adds to business: transparency into the rules by non-technical folk.&lt;br /&gt;&lt;br /&gt;I've amassed a huge collection of knowledge and resources in this area, much of which I've presented to the business team at work. I'm going to try to get permission to post some of my Drools propaganda here on my blog. My references are here: &lt;a href="http://del.icio.us/harlanji/drools"&gt;delicious / harlanji / drools&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;From small business to large, there is a very very compelling case for business rules.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;University&lt;br /&gt;&lt;/b&gt;Okay, a bit more of a personal note. You can leave now if you wish :)&lt;br /&gt;&lt;br /&gt;I moved on campus and sold my house and car this month. So-far I haven't looked back; all I need now is a moped 8-). I haven't had a chance to go out and get smashed at the local bars yet, but soon enough I'll make it down. It has been nice to feel like I'm integrating with student life, if only a little bit. I'm still only taking one course; this situation is a nice logical step between working full time and being a student full time. Which, by the way, I've informed my employer that I am leaving this June/July for the student life.&lt;br /&gt;&lt;br /&gt;I'm excited to start taking Intro to Programming classes next year. For a for a long time the thought of taking that class was insulting, after having programmed for 10 years. But my attitude has chanced after looking into what really goes on in that class. I'm really excited by the prospect of learning algorithms and data structures and augmenting my existing practical knowledge of software engineering with a solid theoretical foundation. I think this shift in attitude has been across the board in my life. I'm less about proving how smart I am and more about taking things in as they come, and actually being a student of life.&lt;br /&gt;&lt;br /&gt;I'm looking forward to learning advanced mathematics at least as much as programming. I'm convinced that the next big thing relies heavily on statistics; things like content suggestion, data mining, and otherwise filtering and relating the plethora of information from all different sources that we are bombarded with every day. Applications are already starting to emerge as nice features of popular sites, but I don't think we've scratched the surface in making all this data that we have useful. The connections between things in many cases is superficial and only related by a natural dimension. I have a research group in mine who I want to do undergrad research with.&lt;br /&gt;&lt;br /&gt;Outside the realm of business and technology, I will take piano and German classes next year. I want to study abroad in Germany at some point (say, 2010), so I'll see if I can hook that up. And as far as piano goes, I want a nice leisure activity and I also want to see how it expands my mind.&lt;br /&gt;&lt;br /&gt;It's an extremely exciting time in my life right now. I feel like I've broken free from my shackles of debt and ignorance and am completely free to expand my mind at the University and in life in general.&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;Cheers!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6956832044723894378?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/04/what-ive-been-up-to.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-4722917597784834408</guid><pubDate>Fri, 29 Feb 2008 04:42:00 +0000</pubDate><atom:updated>2008-02-28T22:28:32.413-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jabber</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">release</category><category domain="http://www.blogger.com/atom/ns#">meebo</category><category domain="http://www.blogger.com/atom/ns#">instant messaging</category><title>Soashable 0.1 Beta RELEASED</title><description>&lt;a href="https://soashable.com/"&gt;Soashable&lt;/a&gt; is an Open Source (&lt;a href="http://sourceforge.net/projects/soashable/"&gt;on SourceForge&lt;/a&gt;) web-based, multi-protocol instant messaging client written in pure Javascript. It connects to an XMPP/Jabber server using BOSH (XEP-0124), which is a COMET protocol that provides instantaneous transport of messages between the web browser and XMPP network. It is supported in all major browsers, and currently has core IM features including messaging and roster management.&lt;br /&gt;&lt;br /&gt;Soashable is Open Source because I believe that any one or any company should be able to creating a competing product, in a cooperative way, as this raises the user experience bar for everyone. I hope it serves as the base for research of web-based UIs, public-facing commercial applications, internal communication applications, and tools in every niche imaginable. XMPP truly is the future of online communication, and finally, I am proud to be able to provide you with yet-another-tool that utilizes it. It's been a LOT of work, but it's finally here!&lt;br /&gt;&lt;br /&gt;&lt;a aiotitle="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_eS8rwzJcHas/R8eZp69TI8I/AAAAAAAAAC0/VT4FHFlFd3Y/s1600-h/soashable-web2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_eS8rwzJcHas/R8eZp69TI8I/AAAAAAAAAC0/VT4FHFlFd3Y/s320/soashable-web2.png" alt="" id="BLOGGER_PHOTO_ID_5172271642538353602" border="0" /&gt;&lt;/a&gt;&lt;a aiotitle="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_eS8rwzJcHas/R8eZpq9TI7I/AAAAAAAAACs/IThmFJTK3c8/s1600-h/soashable-web.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_eS8rwzJcHas/R8eZpq9TI7I/AAAAAAAAACs/IThmFJTK3c8/s320/soashable-web.png" alt="" id="BLOGGER_PHOTO_ID_5172271638243386290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Soashable is the test bed for my recently released Xmpp4Js library, &lt;a href="http://xmpp4js.sourceforge.net/"&gt;available on SourceForge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I hope my work is used in ways that I could have never thought of!&lt;br /&gt;&lt;br /&gt;This release is far from perfect and needs a lot of polish, so all feedback is welcome and appreciated. Please use the bug tracker liberally! It is located here: &lt;a href="http://code.google.com/p/soashable/issues/list"&gt;http://code.google.com/p/soashable/issues/list&lt;/a&gt; . But I am confident that she will be ready for MinneBar (I just hope I can get a presentation slot; nudge nudge, anyone with hookups)!&lt;br /&gt;&lt;br /&gt;You can either try it out online at &lt;a href="https://soashable.com/"&gt;https://soashable.com&lt;/a&gt; (self-signed cert, safe to ignore warnings), or you can download a stand-alone version that is runnable with nothing more than a 1.5+ JVM. That is available through SourceForge, here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=217403&amp;amp;package_id=262062"&gt; http://sourceforge.net/project/showfiles.php?group_id=217403&amp;amp;package_id=262062&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Simply download and click run.bat. If you're on mac or linux, use the command:&lt;br /&gt;&lt;br /&gt;java -jar lib/start.jar&lt;br /&gt;&lt;br /&gt;I haven't tested it on unix, so please, somebody let me know if it works before I officially perform a release with an sh file.&lt;br /&gt;&lt;br /&gt;For you hard core people out there, here is the Maven site with info about how to check the project out of SVN and start hacking:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://soashable.sourceforge.net/"&gt;http://soashable.sourceforge.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Again, this release needs plenty of polish, so please let the bug tracker be your best friend.&lt;br /&gt;&lt;br /&gt;Happy Hacking!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-4722917597784834408?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/02/soashable-01-beta-released.html</link><author>noreply@blogger.com (Harlan Iverson)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_eS8rwzJcHas/R8eZp69TI8I/AAAAAAAAAC0/VT4FHFlFd3Y/s72-c/soashable-web2.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-5305518369395529475</guid><pubDate>Thu, 28 Feb 2008 23:52:00 +0000</pubDate><atom:updated>2008-02-28T19:09:06.452-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">best practices</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">web</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Creating a Distributable WAR Project With Maven and Jetty</title><description>I've always had an itch to give the simplicity of trying out a webapp with jetty:run to people who do not have Maven. It came time to release my project, and people were having trouble getting a third-party component set up (or knowing that they needed to). So naturally I scratched the itch.&lt;br /&gt;&lt;br /&gt;My solution was to use with the Maven Assembly Plugin to create a distributable zip file that contains Jetty jars, configuration, the webapp in question and a batch file to execute start.jar.&lt;br /&gt;&lt;br /&gt;Basically I created a sub project (webappname-launcher, or similar) which depends on the webapp and Jetty. The assembly component descriptor then defined a target to copy Jetty jars, the src/main/launcher directory, and the war file into.&lt;br /&gt;&lt;br /&gt;The src/main/launcher directory contains a run.bat, jetty config, and any distribution files such as README.&lt;br /&gt;Optionally I could include the project generated site with the distribution as well, which could be a nice touch.&lt;br /&gt;&lt;br /&gt;As far as the POM is concerned, simply declare the assembly plugin and execute it the the package phase.&lt;br /&gt;&lt;br /&gt;This can be accomplished without using a subproject, as part of a regular war. But doing it that way causes jetty jars to be included in your war file. I'm sure there's  a way to filter out those dependencies, but I took the most straight forward approach.&lt;br /&gt;&lt;br /&gt;I will be using this pattern for all my web projects, but my opinion is that this sort of behavior should be built into the Jetty plugin itself, for example jetty:create-distributable, and operate directly on war projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;On that note, &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I created a launcher for the xmpp4js demo site using this method. It's available for download on SourceForge, &lt;a href="http://downloads.sourceforge.net/xmpp4js/xmpp4js-launcher-0.2-SNAPSHOT-launcher.zip"&gt;here&lt;/a&gt; and in SVN &lt;a href="http://xmpp4js.sourceforge.net/source-repository.html"&gt;here&lt;/a&gt;. It requires no Maven, no Jabber server, no Apache proxy. Just download and run :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-5305518369395529475?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/02/creating-distributable-war-project-with.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-4364271718526518948</guid><pubDate>Mon, 25 Feb 2008 15:30:00 +0000</pubDate><atom:updated>2008-02-25T07:32:24.720-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">jabber</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">release</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><category domain="http://www.blogger.com/atom/ns#">instant messaging</category><title>Xmpp4Js: Initial Release</title><description>Xmpp4Js is an XMPP client written in pure Javascript. It connects to a server using BOSH (XEP-0124), which is a COMET protocol that provides instantaneous responses.&lt;br /&gt;&lt;br /&gt;It allows any web page to be active on an XMPP network. Uses can range from a simple Meebo-like chat client, to a phpLive-like support interface, and beyond.&lt;br /&gt;&lt;br /&gt;Xmpp4Js is supported in all major browsers, which removes compatibility limitations inherent in browser extensions like xmpp4moz.&lt;br /&gt;&lt;br /&gt;The initial release includes a sample chat client with basic in-browser messaging functionality, and all dependencies.&lt;br /&gt;&lt;br /&gt;Xmpp4Js is dual-licensed under LGPL and Apache 2.0. It is available for download &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=209465&amp;amp;package_id=251329&amp;amp;release_id=579308"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-4364271718526518948?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/02/xmpp4js-initial-release.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-1168324044975695043</guid><pubDate>Sun, 17 Feb 2008 18:36:00 +0000</pubDate><atom:updated>2008-02-17T10:48:30.618-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">food</category><category domain="http://www.blogger.com/atom/ns#">experiments</category><title>Midwest Meets Southwest</title><description>I made up an awesome dish, today, from left-overs! It's not software development, but it is development, no less.&lt;br /&gt;&lt;br /&gt;Slather some mashed potatoes on a tortilla, and throw some chopped chicken breast and nacho cheese on; leave unwrapped, cover with a paper towel and microwave for about a minute. Top it with some sour cream, salt, pepper and salsa. Wrap it up and enjoy!&lt;br /&gt;&lt;br /&gt;Remember: always use safe food preparation practices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-1168324044975695043?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/02/midwest-meets-southwest.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-5184697441451229168</guid><pubDate>Sat, 19 Jan 2008 22:08:00 +0000</pubDate><atom:updated>2008-01-19T14:21:29.494-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><title>TokBox API + Servlet</title><description>&lt;a href="http://tokbox.com/"&gt;TokBox &lt;/a&gt;is a free service that allows anyone to embed video chat in their website. For more advanced implementations, it offers an &lt;a href="http://tokbox.com/view/developer"&gt;API&lt;/a&gt; that allows any 3rd party site (with an API key) to register and query user accounts by email address and password. It is used as the voice and audio chat application on Meebo.&lt;br /&gt;&lt;br /&gt;I started adding video chat to Soashable the other day (surprise, surprise), and have made the fruits of my labor available as a stand-alone TokBox API wrapper and Servlet Maven artifact.&lt;br /&gt;&lt;br /&gt;To use, simply map the Servlet and make a GET request for /tokbox?op=getInfo&amp;amp;jid=whateverjid. It will query TokBox for userId and widgetId of the given email address, and if it's not found it will register and return it. This allows you to not worry about it in your application, and just assume that that URL will always return the current user's TokBox info.&lt;br /&gt;&lt;br /&gt;Okay, so jid= is specific to jabber, but it works with any email address. If you don't like it, submit a patch :).&lt;br /&gt;&lt;br /&gt;Maven project site: &lt;a href="http://labs.devspan.com/tokbox-servlet/"&gt;http://labs.devspan.com/tokbox-servlet/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-5184697441451229168?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2008/01/tokbox-api-servlet.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-3010249335384375537</guid><pubDate>Thu, 13 Dec 2007 00:53:00 +0000</pubDate><atom:updated>2007-12-12T17:10:50.250-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">testing</category><category domain="http://www.blogger.com/atom/ns#">math</category><category domain="http://www.blogger.com/atom/ns#">experiments</category><title>How Logic and Truth Tables Can Apply To Unit Testing</title><description>&lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; In the past month I have done nothing but code reviews and mentoring. It's forced me to work muscles I didn't know I had, but out of it has come one shining gem: a systematic method for determining test cases. Basically it's the same as the set up part of a Logic problem: figure out exactly what the code is doing (in my case, we have a written spec for each class), break it down into variables, write a truth table for all combinations (2^&lt;span style="font-style: normal;"&gt;n&lt;/span&gt; rows, where n is the number of variables), and go at it. The variables can require an understanding of the code, to an extent.&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; For example: “Return whether there is a dependent care child or step child in A1 household” turns into: P=”There is a dependent care person who is a relative”, Q=”The relative is a child or step child”, R=”The dependent care person is in A1 household”. This may seem like white box testing, but really the code necessarily reflects the structure of business objects and these variables must reflect that as well—the objects will not change in this lifetime, so we'll call it gray box testing.&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; At first glance, I came up with a method to intelligently ignore certain cases rather than write all possible combinations (in this case 8, reduced to 5): test the TTT condition, and then each variation with one false (FTT, TFT, TTF), and for good measure the FFF case. This method would become more useful as the number of variables grew (t=n+2, where t is the number of tests and n is the number of variables), with 6 for 16, 7 for 32, etc. The theory was to test each variable in isolation (under the assumption that a single F would make the whole statement F):&lt;/p&gt; &lt;table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="100%"&gt;  &lt;col width="85*"&gt;  &lt;col width="85*"&gt;  &lt;col width="85*"&gt;  &lt;tbody&gt;&lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;P&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;Q&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;R&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;T&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;T&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;T&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;F&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;F&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;F&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;F&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;F&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;F&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;F&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;F&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;F&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;T&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;F&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;F&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="33%"&gt;    &lt;p&gt;&lt;b&gt;F&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; Unfortunately that logic does not follow unless you can independently test P, Q, and R without &lt;a href="http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29"&gt;side effects&lt;/a&gt;. And if that is the case, then it's futile to even test the compound combinations since you could easily prove that all outcomes would be correct!  &lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; I had to work the problem using &lt;a href="http://en.wikipedia.org/wiki/Bayes_theorem"&gt;Bayes' theorem&lt;/a&gt; before I really believed that the shortcut method was ineffective, because (for me, anyway) common sense would dictate that if one F were present, the whole statement would be F, and therefore testing a statement with two F`s would be moot. The problem with that line of thinking is that it is assumed that the code checking Q has no side effects on P or R.  I wish the shortcut method worked!  &lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; In the end, the first part of the solution works and it's easy to develop the table of all test cases. There just isn't the shortcut that I hoped there would be. It makes me wonder if a functional language might allow a provably correct program; but more than anything, it makes me wish that I could work with a true &lt;a href="http://en.wikipedia.org/wiki/Inference_engine"&gt;inference engine&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-3010249335384375537?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/12/how-logic-and-truth-tables-can-apply-to.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-122130292535086772</guid><pubDate>Thu, 15 Nov 2007 17:27:00 +0000</pubDate><atom:updated>2007-11-15T18:46:07.300-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">rpc</category><category domain="http://www.blogger.com/atom/ns#">instant messaging</category><category domain="http://www.blogger.com/atom/ns#">experiments</category><title>Bayeux, Jabber and XEP-0124</title><description>The other night I was introduced to something called &lt;a href="http://svn.xantus.org/shortbus/trunk/bayeux/bayeux.html"&gt;Bayeux&lt;/a&gt; by a fellow at a local meet up. It seems like an ideal way to fight the known limitation on scalability that Soashable (and &lt;a href="http://www.xmpp.org/extensions/xep-0124.html"&gt;XEP-0124&lt;/a&gt; in general) will inevitably suffer from when the service goes live.&lt;br /&gt;&lt;br /&gt;At first glance it appeared that Bayeux didn't quite fit the bill for this type of one-on-one client&lt;-&gt;server session, due to its channel subscription and indiscriminate repeating behavior. But alas, it is indeed possible without hackery because of the reserved /service/* channel name space that is specifies.&lt;br /&gt;&lt;br /&gt;The problem with the XEP solution is that it specifies a client must use an XmlHttpRequest (or equivalent) connection in such a way that limits it by the beloved &lt;a href="http://en.wikipedia.org/wiki/Same_origin_policy"&gt;same origin policy&lt;/a&gt;. As a result, in order to be functional (with a non Java web server), a proxy must sit in front of the main web site and funnel jabber http binding requests to the binding server. This could be hardware, software or Apache/lighty mod_proxy. For example: soashable.com is running Apache on port 80, serving up content and Javascript; and the HTTP binding servlet (for XEP-0124) through Jetty on port, say, 9999.  Because of the same origin policy, XmlHttpRequests can only talk to soashable.com on port 80. In order to bridge the gap, one needs to use the proxy on port 80 and pipe certain requests to Jetty on port 9999 (two servers can't occupy the same port). In this case we could reduce overhead by using mod_jk, but we are ultimately still tied to having a heavy-weight process for each and every COMET connection, and that will not scale well.&lt;br /&gt;&lt;br /&gt;In addition to the limited scalability of the XEP, I can't begin to count the hours I've spent tweaking xmpp4js's polling code due to policy-violation disconnects. The XEP basically defines its own version of what Bayeux specifies, and each client implementation must reinvent the magic. In fact, section 1.4.5 i of the Bayeux 1.0 draft spec is functionally identical to the protocol that the XEP lays out. This means that 1) replacing the polling code with a Bayeux polling client is trivial, and 2) it doesn't make sense to not use a spec and libraries that made for the specific task of polling; they can do one thing and do it well, while the Jabber programmer can worry  about their Jabber. Bayeux can be thought of as a socket implementation for Javascript.&lt;br /&gt;&lt;br /&gt;I've spent a few hours over the past couple days messing with the clients and servers of Bayeux and it is all very immature. But there is a very active community of people pushing it forward. I'm extremely excited to push forward with it when it stabilizes a bit, and possibly even put forth a new XEP to supersede XEP-0124 if nobody else does it first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-122130292535086772?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/11/bayeux-jabber-and-xep-0124.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6571678361242040279</guid><pubDate>Wed, 31 Oct 2007 23:59:00 +0000</pubDate><atom:updated>2007-10-31T17:04:09.590-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">opinion</category><category domain="http://www.blogger.com/atom/ns#">best practices</category><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">testing</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><title>The Future of JS Dev Tools Is The Parse Tree</title><description>&lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; Today I read an article from Sun research, entitled &lt;a href="http://research.sun.com/techrep/2007/abstract-168.html"&gt;Using Javascript as a Real Programming Language&lt;/a&gt;. This obviously struck a chord with me, because it talks about &lt;a href="http://blog.devspan.com/2007/10/maven-javascript-plugin.html"&gt;exactly the stuff I've been pushing for&lt;/a&gt; since I started using it as a real programming language, a few months ago. Recently, I have been collaborating with a fellow from the Maven list who is building a &lt;a href="http://hammerfest.sourceforge.net/maven-javascript-plugin/"&gt;Javascript packaging plug-in for Maven&lt;/a&gt;, and trying to integrate all the features from the late JSLibBuilder.&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; One point I've been touching on lately is that &lt;a href="http://en.wikipedia.org/wiki/Code_coverage"&gt;code coverage testing&lt;/a&gt; is &lt;i&gt;the&lt;/i&gt; key to the sanity of any code base written in a dynamic language (&lt;a href="http://blog.devspan.com/2007/05/testing-rails-first-impression.html"&gt;same point applies to rails&lt;/a&gt;). While &lt;a href="http://www-128.ibm.com/developerworks/java/library/j-cq01316/index.html"&gt;having 100% coverage can be fool's gold&lt;/a&gt;, it is a good measure of which code needs to be better exercised by tests.  &lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; My research has found me one complete tool for doing such a thing in Javascript: &lt;a href="http://siliconforks.com/jscoverage/"&gt;JSCoverage&lt;/a&gt;. It runs on the command line and instruments specified code to see which lines were executed. Basically what it does is add a Javascript function call on every other line, and when it is runs its special runner, it produces a report with annotated code coverage data.  In unison with JSUnit, this gives the same sort of functionality as Java tools like &lt;a href="http://cobertura.sourceforge.net/"&gt;Cobertura&lt;/a&gt; + JUnit (though, AFAIK it is only line coverage, not branch coverage).&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; I'd have liked to have integrated it with JSLibBuilder or javascript-maven-plugin, but because it is written in C (based on &lt;a href="http://www.mozilla.org/js/spidermonkey/"&gt;Spider Monkey&lt;/a&gt;), distribution would be hell. So I was doing &lt;a href="http://del.icio.us/harlanji/javascript"&gt;some research&lt;/a&gt; to see if I could find an alternative Javascript parser that runs in Java or Javascript to port JSCoverage to, and came across a piece of gold: &lt;a href="http://lxr.mozilla.org/mozilla/source/js/narcissus/"&gt;Narcissus&lt;/a&gt;, a Javascript interpreter written in Javascript. It is also, incidentally, based on Spider Monkey :). Easy porting of JSCoverage? I hope so. The reason a tool written in a Java friendly language is important is because it would be able to run during a Maven build, and be distributed through the central Maven repository.&lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; Let me backtrack a little: the best Javascript code monkeying tools available right now are &lt;a href="http://dojotoolkit.org/docs/shrinksafe"&gt;Dojo Shrinksafe&lt;/a&gt; and &lt;a href="http://www.julienlecomte.net/blog/2007/08/13/introducing-the-yui-compressor/"&gt;YUI Compressor&lt;/a&gt; (from a strictly 'safety' standpoint, others have achieved better compression ratios), for the simple fact that they are based on the Rhino Javascript engine, rather than relying on regular expressions and other potentially flaky methods to parse. Because source files are parsed and modified as they are serialized from a real Javascript parse tree, &lt;a href="http://alex.dojotoolkit.org/shrinksafe/"&gt;the engines produce 100% safe results&lt;/a&gt;. Naturally I wanted to see what else I could do with the parse tree available at runtime (cyclomatic complexity and other code analysis), but it turns out there is no public API for  accessing the parse tree in Rhino(!), and no plans to implement one.  &lt;/p&gt; &lt;p style="margin-bottom: 0in; line-height: 150%;"&gt; I only have to wonder whether anyone knows about Narcissus and there is a problem with it, or if it is just sitting there waiting to be discovered (it looks like it's been around since at least 2004). If Javascript is ever to be a first class language as people are treating it, it needs first class tools. This single tool is the key to getting so much more out of Javascript.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in; line-height: 150%;"&gt;I'll surely be writing about this more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6571678361242040279?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/10/future-of-js-dev-tools-is-parse-tree.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-395019445999935322</guid><pubDate>Wed, 10 Oct 2007 18:10:00 +0000</pubDate><atom:updated>2007-10-10T11:28:08.407-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">me</category><title>Admitted to the U of MN</title><description>&lt;span style="font-style: italic;"&gt;Warning: personal entry.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_eS8rwzJcHas/Rw0ZT9nABmI/AAAAAAAAACY/JOfpmZo4Tg0/s1600-h/umn-logo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_eS8rwzJcHas/Rw0ZT9nABmI/AAAAAAAAACY/JOfpmZo4Tg0/s320/umn-logo.gif" alt="" id="BLOGGER_PHOTO_ID_5119776182136473186" border="0" /&gt;&lt;/a&gt;Just an update on the college post a while back. I applied to the U and just learned that I was accepted for Spring semester, CLA Pre-CS. Not that it's a really hard school to get into, but for somebody with an academic background like mine it's one hell of an achievement. It was the last step in officially clearing my name and turning my academic career around. From here on, I have the same opportunity as a 'normal' student--even a good grad school is on the table, if I keep working hard.&lt;br /&gt;&lt;br /&gt;Thanks to everyone for all the support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-395019445999935322?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/10/admitted-to-u-of-mn.html</link><author>noreply@blogger.com (Harlan Iverson)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_eS8rwzJcHas/Rw0ZT9nABmI/AAAAAAAAACY/JOfpmZo4Tg0/s72-c/umn-logo.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6299451109492181684</guid><pubDate>Mon, 08 Oct 2007 16:22:00 +0000</pubDate><atom:updated>2007-10-08T09:30:22.903-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">best practices</category><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Speedier Maven2 Webapp Development</title><description>Now that Soashable is ported to Maven, I want time savers because the change/compile/package/deploy/test cycle is way too slow. I did a bit of research and here's what I've found.&lt;br /&gt;&lt;br /&gt;Some goals that are useful alone or combined:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; war:inplace&lt;/span&gt; - copies all dependencies into the webapp source, including overlays, classes (made with 'compile'), dependencies. See caveat below.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; javascript:inplace&lt;/span&gt; - copies javascript dependencies, the same way war:inplace works&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; jetty:run&lt;/span&gt; - runs the inplace webapp; scanIntervalSeconds of 1 makes rapid 'testing' possible&lt;br /&gt;&lt;br /&gt;Using jetty:run in its own terminal requires no recompilation or packaging in order to see changes reflected in the running webapp, since it runs out of the source directory. A javascript:inplace or war:inplace in another terminal will copy any updated dependencies into place and work while the application is running.&lt;br /&gt;&lt;br /&gt;This method cuts several seconds off of the change/test cycle, from around 10 in any case to 5 or less for dependency changes, and immediate for local changes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The caveat&lt;/span&gt; is that it copies dependencies into src/main/webapp, which might confuse some junior developers or perhaps make svn:ignore invaluable. A slightly slower alternative is to use war:exploded and jetty:run-exploded.&lt;br /&gt;&lt;br /&gt;Perhaps the best solution would be a hybrid resource resolver that first checks src/main/webapp and then falls back to the war:exploded target.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6299451109492181684?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/10/speedier-maven2-webapp-development.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-599199190333353485</guid><pubDate>Fri, 05 Oct 2007 20:01:00 +0000</pubDate><atom:updated>2007-10-05T13:31:12.469-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">opinion</category><category domain="http://www.blogger.com/atom/ns#">best practices</category><category domain="http://www.blogger.com/atom/ns#">productivity</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>maven-javascript-plugin</title><description>&lt;p class="MsoNormal"&gt;I've been watching and trying out new development on this new Maven plug-in that's coming together after the recent threads [&lt;a href="http://www.mail-archive.com/users@maven.apache.org/msg73451.html"&gt;1&lt;/a&gt;, &lt;a href="http://www.nabble.com/recommandation-for-JS-packaging---%28was-Using-maven-for-JavaScript-projects%29-tf4534791s177.html"&gt;2&lt;/a&gt;, &lt;a href="http://jira.codehaus.org/browse/MOJO-921"&gt;Codehaus Proposal&lt;/a&gt;]. I've given a couple patches, and am becoming much more familiar with both it and the internals of Maven and the build lifecycle. I've spent more time than I would have liked encountering bugs and discovering that I’m an idiot, but the main developer has been extremely helpful. And all of this bug chasing has taught me a ton, so it hasn't been a waste by any means. As I told one of my colleagues: it’s the cost of early adoption; in the same way that some people lay down extra dough for the newest gadgets, I lay down extra time for the newest software.&lt;/p&gt;        &lt;p class="MsoNormal"&gt;I think this plug-in will be a great success and could potentially have a wide scale impact on the JS development community. The mature JS projects like dojo, scriptaculous and jsjac all have their own custom build scripts that do about the same thing as maven-javascript-tools. It will unify effort and allow people who like dealing with build tools to deal with build tools, and people who like dealing with libraries to deal with libraries. &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;I’ll be doing my part a bit more this weekend by creating some archetypes and maybe a screen cast if I’m feeling ambitious. I have to keep in mind that Soashable is my main project, and that I still have to do my homework. But man, does this project excite me!&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;It has the potential to raise confidence in JS and propel it to its place as a first class language. It’s been treated as one for quite a while now, but finally it will be able to walk the walk.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-599199190333353485?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/10/maven-javascript-plugin.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-497795427376396757</guid><pubDate>Mon, 01 Oct 2007 06:00:00 +0000</pubDate><atom:updated>2007-09-30T21:00:15.075-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Another JS / Maven2 Thread</title><description>More on JS packaging for Maven:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nabble.com/recommandation-for-JS-packaging---%28was-Using-maven-for-JavaScript-projects%29-tf4534791s177.html"&gt;http://www.nabble.com/recommandation-for-JS-packaging---%28was-Using-maven-for-JavaScript-projects%29-tf4534791s177.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And a wiki page came to be as a result of the discussion. All of the ideas from JSLibBuilder will be included, including a script artifact repository. :)&lt;br /&gt;&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://hammerfest.wiki.sourceforge.net/mavan-javascript-tools" target="_blank"&gt;http://hammerfest.wiki.sourcef&lt;wbr&gt;orge.net/mavan-javascript&lt;wbr&gt;-tools&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-497795427376396757?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/another-js-maven2-thread.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6846822630513429064</guid><pubDate>Thu, 27 Sep 2007 16:54:00 +0000</pubDate><atom:updated>2007-09-27T10:06:39.257-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ant</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>More on JSLibBuilder to Maven2</title><description>Seems like a good time to be thinking about the topic of Javascript development tools.&lt;br /&gt;&lt;br /&gt;Here's an interesting thread on the Maven Users' list that started yesterday:&lt;br /&gt;&lt;a href="http://www.mail-archive.com/users@maven.apache.org/msg73451.html"&gt;http://www.mail-archive.com/users@maven.apache.org/msg73451.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and my contribution to it:&lt;br /&gt;&lt;a href="http://www.mail-archive.com/users@maven.apache.org/msg73613.html"&gt;http://www.mail-archive.com/users@maven.apache.org/msg73613.html&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;blockquote style="font-family: times new roman;"&gt;It looks like there is a good array of tools coming to light from this&lt;br /&gt;thread. I, myself, have been tackling the problem of making JS library&lt;br /&gt;development more like Java development, as far as automated running of unit&lt;br /&gt;tests, documentation, packaging, etc, in recent months.&lt;br /&gt;&lt;br /&gt;I see a growing demand for a nice tool chain of things like jslint,&lt;br /&gt;shrinksafe, jsunit + jscoverage, selenium, jsdoc, and dependency management.&lt;br /&gt;Maybe it's because I just came back to JS after several years with a bunch&lt;br /&gt;of Java development under my belt; but I see all these tools and feel like&lt;br /&gt;they should be integrated. Especially when I make the connection between&lt;br /&gt;web2.0 and people who promote Agile development practice. JS tools are&lt;br /&gt;hardly in the state to accommodate good Agile, IMO. If integration were&lt;br /&gt;better, it would be a different story.&lt;br /&gt;&lt;br /&gt;My original approach was to create an Ant script that would download various&lt;br /&gt;things using the &amp;lt;get&amp;gt; task, and use Maven Antlib for JSUnit, Selenium and&lt;br /&gt;ShrinkSafe dependencies. But now I am getting to the point where I want to&lt;br /&gt;break my library into multiple parts (project-core, project-ext,&lt;br /&gt;project-ext-gui, etc) and Maven seems like the natural answer. And of course&lt;br /&gt;when Maven comes into the picture, I want to manage my other JS dependencies&lt;br /&gt;as such.&lt;br /&gt;&lt;br /&gt;So last night I gave it a shot, and it seems to work well using war&lt;br /&gt;packaging and their built-in overlay behavior. There are a few kinks to work&lt;br /&gt;out, and probably Mojos to write, but I think it will work.&lt;br /&gt;&lt;br /&gt;My immediate need is for JSUnit, which I have hacked into a series of&lt;br /&gt;executions (see pom link below). I'll definitely be looking at some of these&lt;br /&gt;tools and seeing how I can use them (namely the ShrinkSafe mojo!), and&lt;br /&gt;hopefully getting a JSUnit mojo out of them at the very least. I've never&lt;br /&gt;written a plugin (beyond hello world), but I'm eager to give it a shot.&lt;br /&gt;&lt;br /&gt;I have high hopes that Maven can bring the state of JS development up to par&lt;br /&gt;with the Agile way that so many web2.0 people want to develop. I'm looking&lt;br /&gt;forward to hearing more of everyone's great ideas!&lt;br /&gt;&lt;br /&gt;Harlan&lt;br /&gt;&lt;br /&gt;ps.&lt;br /&gt;Here's my main POM with JSUnit (in-progress proof of concept, by no means a&lt;br /&gt;final product). The executions for JSUnit are basically a copy of&lt;br /&gt;Selenium's:&lt;br /&gt;&lt;a rel="nofollow" href="http://soashable.googlecode.com/svn/xmpp4js/branches/maven/pom.xml"&gt;http://soashable.googlecode.com/svn/xmpp4js/branches/maven/pom.xml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here's my old Ant script "JSLibBuilder":&lt;br /&gt;&lt;a rel="nofollow" href="http://soashable.googlecode.com/svn/jslibbuilder/trunk/"&gt;http://soashable.googlecode.com/svn/jslibbuilder/trunk/&lt;/a&gt;&lt;/blockquote&gt;&lt;a rel="nofollow" href="http://soashable.googlecode.com/svn/jslibbuilder/trunk/"&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;Adios!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6846822630513429064?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/more-on-jslibbuilder-to-maven2.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-1191514812837877318</guid><pubDate>Wed, 26 Sep 2007 16:01:00 +0000</pubDate><atom:updated>2007-09-26T09:10:54.894-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">project management</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><category domain="http://www.blogger.com/atom/ns#">maven</category><category domain="http://www.blogger.com/atom/ns#">instant messaging</category><category domain="http://www.blogger.com/atom/ns#">experiments</category><title>Maven2 + Soashable</title><description>&lt;p class="MsoNormal"&gt;The other night I did some tinkering and got Soashable + xmpp4js building with Maven2 (without JSLibBuilder). Basically what I did was create some ‘war’ artifacts for scriptaculous + prototype, extjs, and xmpp4js (none are checked in yet). I also created one for soashable-web that depends on xmpp4js.&lt;br /&gt;&lt;br /&gt;Basically the dependency tree looks like this:&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;ul style="margin-top: 0in;" type="disc"&gt;&lt;li class="MsoNormal" style=""&gt;soashable-web&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;ul style="margin-top: 0in;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;xmpp4js&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;ul style="margin-top: 0in;" type="square"&gt;&lt;li class="MsoNormal" style=""&gt;extjs&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;scriptaculous&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;extjs&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;scriptaculous&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt; I have a preliminary way to run the JSUnits on xmpp4js (though I'd really like to just create a plugin, probably based on Selenium), and hopefully the Selenium plugin works as advertised.&lt;br /&gt;&lt;br /&gt;This means I’ll need to open up a repository for the soashable-web, xmpp4js and js dependency artifacts, and at that point one will be able to build soashable-web with a single mvn jetty:run command on the checkout. In the longer haul, hopefully I can sync up with the central repository and extjs/scriptaculous will create and maintain their own artifacts.&lt;br /&gt;&lt;br /&gt;It's a little ghetto at this point. The projects are war projects and the &lt;a href="http://maven.apache.org/plugins/maven-war-plugin/examples/war-overlay.html"&gt;overlay&lt;/a&gt; happens 1:1 over the war (may be possible to override, but I don't want to look into it now), so a standardized tree under src/main/webapp will need to be used; js/xmpp4js/..., js/extjs/..., etc. However there is a little hope for JS development on the horizon; &lt;a href="http://www.mail-archive.com/users@maven.apache.org/msg73453.html"&gt;just yesterday a maven jstools library was checked in to CVS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If I can get JSUnit working, this stuff should be in by late tonight or tomorrow evening. Matt and I will be working tonight.&lt;br /&gt;&lt;br /&gt;On a side note, it would be cool to start something like '&lt;a href="http://jsrepo.com/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;jsrepo.com&lt;/a&gt;' as a public maven2 js library repo. At the very least, I’ll contact the authors of extjs et all.&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&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/17924780-1191514812837877318?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/maven2-soashable.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-5152015935268923756</guid><pubDate>Thu, 20 Sep 2007 14:40:00 +0000</pubDate><atom:updated>2007-09-20T07:46:14.654-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog-o-spam</category><category domain="http://www.blogger.com/atom/ns#">best practices</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">testing</category><title>Fwd: The Deep Synergy Between Testability and Good Design</title><description>Just a bit of blog-o-spam. I completely agree with the hypothesis presented in this blog post, so I thought I'd pass it on. I've definitely observed this first hand as I've aimed for full unit test coverage of things over the past 6 months:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2007/09/the-deep-synerg.html"&gt;The Deep Synergy Between Testability and Good Design&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-5152015935268923756?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/fwd-deep-synergy-between-testability.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6639856734512850462</guid><pubDate>Sun, 16 Sep 2007 13:54:00 +0000</pubDate><atom:updated>2007-09-16T17:08:25.070-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">me</category><title>College Degree</title><description>&lt;span style="font-style: italic;"&gt;Warning: personal entry.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I started going to college again summer term of this year. Not having a degree has never really been an issue, but new circumstances made it senseless to not work on it, if only part time. I got a new job that will almost never require more than 40 hours per week, and is located a few blocks from a school that offers night classes. So I figured I might as well work on prerequisites for a CS degree 1-2 classes at a time, and have been doing so. The 6 year plan.&lt;br /&gt;&lt;br /&gt;But in the past several months I have been contacted by a few interested parties about my status on the job market. Some of them didn't work out for non-degree related reasons, but the opportunity of my dreams landed on my lap and I was not able to take it due to working on my degree. Believe me, that poured a &lt;span style="font-weight: bold;"&gt;LOT &lt;/span&gt;of fuel on my fire to finish my degree ASAP.&lt;br /&gt;&lt;br /&gt;So after a few weeks of careful consideration, I took this previous Friday to find the answers I need to become a full time student. Whatever the cost. It will be expensive to make the transition (as in, my lifestyle will change a lot), but it is more expensive to both my career and directly in terms of salary to not finish my degree. In economic terms: if I could be making 10k extra by having my degree, then 3 years has 30k opportunity cost. So if I can finish my degree in 3 years instead of 6, then college actually costs 30k less than if I had gone part time for 6 years. And the assumption of 10k more is ridiculously understated.&lt;br /&gt;&lt;br /&gt;But perhaps more important than the bare dollar amount is the chance to work on cool projects and make money doing so. At present, I work on a fairly boring project at my job, and then spend 40 hours a week working on open source for no pay at home. It would be great to work 80 hours on interesting stuff, and I want that as soon as possible.&lt;br /&gt;&lt;br /&gt;My not going to college was never really a choice. I went for about 1.5 years, until I ran out of money. Then I tried to complete a FAFSA, but due to some special circumstances I wasn't able to. I thought maybe I'd wait until I'm 24 and can be considered "independent," and went back to working full time. But I'm 22 now, and too impatient to wait any longer, so I started taking classes even though I can't really afford it.&lt;br /&gt;&lt;br /&gt;Why get a degree if it hasn't hurt me so far? 1) It will hurt me at some point, 2) I need to learn. Emphasis on the latter. There are certain applications that I want to be capable of creating, which I am not, due to my lack in knowledge of statistics, set theory, and algorithms/data structures in general. I could just self-teach myself, but I am already self-teaching myself so many other things. And I might as well work towards a tangible goal, of having a degree, while I learn.&lt;br /&gt;&lt;br /&gt;I'm excited but a little scared. According to the admission guy I spoke with (who, incidentally, will also be reviewing my application), I'll have no problem getting into the UofMN based on GPA in college, SAT scores, and GED scores (yea, I'm a high school dropout), as long as it's all in by Oct 12. My records clearly show that I've redeemed myself from my early-day sins in high school. Wewt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6639856734512850462?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/college-degree.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-8786643350200641513</guid><pubDate>Tue, 11 Sep 2007 13:56:00 +0000</pubDate><atom:updated>2007-09-11T07:10:50.218-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jabber</category><category domain="http://www.blogger.com/atom/ns#">ideas</category><category domain="http://www.blogger.com/atom/ns#">meebo</category><category domain="http://www.blogger.com/atom/ns#">web</category><category domain="http://www.blogger.com/atom/ns#">opensource</category><category domain="http://www.blogger.com/atom/ns#">instant messaging</category><title>Meebo Does File Transfers &amp; Amazon WS</title><description>Always on the cutting edge, &lt;a href="http://mashable.com/2007/09/10/meebo-file-transfer/"&gt;Meebo does file transfers using Amazon WS&lt;/a&gt;. Perhaps validation that the Soashable project is not crazy; we have been discussing that very thing since I became curious about EC2 after &lt;a href="http://www.mn-linux.org/"&gt;TCLUG&lt;/a&gt; announced a speaker from Amazon would be coming.&lt;br /&gt;&lt;br /&gt;It will be interesting to study their implementation, and whether they contributed any patches to GAIM. As usual, it's very possible with Jabber but may require some patches to the gateway components.&lt;br /&gt;&lt;br /&gt;With Jabber, it would be implemented by creating an AJAX server to receive file transfers and connect on behalf of the user (Jabber supports multiple resources) and initiate the transfer of the uploaded file to the target JID. This works regardless of which network the remote party may be on, since the gateway component handles translation between Jabber file transfer and the file transfer mechanism of the remote network.&lt;br /&gt;&lt;br /&gt;And of course with all of this running in the EC2 cloud, S3 would be there to store the files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-8786643350200641513?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/meebo-does-file-transfers-amazon-ws.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-5941267404131547861</guid><pubDate>Fri, 07 Sep 2007 04:25:00 +0000</pubDate><atom:updated>2007-09-07T15:46:07.257-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">opinion</category><category domain="http://www.blogger.com/atom/ns#">best practices</category><category domain="http://www.blogger.com/atom/ns#">productivity</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">stories</category><category domain="http://www.blogger.com/atom/ns#">testing</category><title>Taking Testing Fore Granted</title><description>It feels like I've spent all my time over the past few weeks in front of JUnit and JSUnit test runners. It's true, but it's a hell of a lot better than in front of a browser doing some 'old school' iterative development.&lt;br /&gt;&lt;br /&gt;It doesn't seem like long ago that I would manually test functionality until I believed it was solid, forget about it, and have to re-test everything manually a few months later when I wanted to change something. Did I really even re-test everything? Not usually. A change would be requested and I would do it and check it in (at least I used an RCS, eh eh?), hoping that the change I made would have no impact. This was my life for several years.&lt;br /&gt;&lt;br /&gt;Normally I would have learned from my mistake and set up something to help me out. At work, we did finally started using Maven, which runs tests automatically on every build... but proper testing wasn't exactly in the budget, so it was kinda moot. -Dmaven.test.skip=true was pretty much hardwired into my brain. At home, I was too impatient and my interest was too fleeting. TDD was just something I'd read about in books, and nobody I knew did it. But oh how I &lt;span style="font-style: italic;"&gt;wanted&lt;/span&gt; to do it.&lt;br /&gt;&lt;br /&gt;It seems it would be hard for anyone working on any project to get into the habit of testing, without tasting the fruit of it first. It is tedious and it makes progress seem to wither away. I started Soashable almost two months ago, and am no farther along now than I was then--as far as new features. Part of it is that I rewrote the XMPP library from scratch, and created a builder for it. Another part of it is that I had finals last month. Excuses aside, I wanted to test this one.&lt;br /&gt;&lt;br /&gt;Now I'm completely confident in the new code. Over the past several days I have swapped out the Roster GUI rendering code and made changes to the various components without worry. I simply add new test cases for new functionality, and update cases in code similar to tests that fail. No more having to memorize the whole program and rely on that for refactoring. And being that I'm working on Javascript, a dynamic language where Eclipse can't help me out, that says a lot.&lt;br /&gt;&lt;br /&gt;And a nice side effect of being confident about my code and having great results, is I seem to not get frustrated and stop making time for the project. With high confidence, I know that the thing isn't going to crumble apart and have wasted all my energy. This leads to more net results, despite the lower (initial) throughput.&lt;br /&gt;&lt;br /&gt;I'm sure you, dear reader, are familiar with testing. But I just thought I'd remind you of the hell you lived though before it was in your life. I am at the point now where I completely take it fore granted--I test at work (I spend more time writing tests than code) and I test at home. So while it seems like I spend my life in front of test runners, I see better results when they finally do come out; I can browse to a page full of complex code for the first time and KNOW it will work, and it does. Because I've already seen all the parts work independently. And I am confident in my code, and can not worry if I forget pieces of the system exist.&lt;br /&gt;&lt;br /&gt;I love taking fore granted that my code works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-5941267404131547861?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;</description><link>http://blog.devspan.com/2007/09/joy-of-testing.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>
