<?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" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-17924780</atom:id><lastBuildDate>Mon, 09 Jan 2012 10:35:54 +0000</lastBuildDate><category>ruby</category><category>barcamp</category><category>activerecord</category><category>lighttpd</category><category>soashable</category><category>postgresql</category><category>design patterns</category><category>blog-o-spam</category><category>sysadmin</category><category>javascript</category><category>workflow</category><category>debugging</category><category>web</category><category>iiw6</category><category>development</category><category>maven</category><category>cocoon</category><category>rum</category><category>ejb</category><category>opensource</category><category>aim</category><category>rails</category><category>productivity</category><category>dotnet</category><category>jmx</category><category>bind</category><category>database</category><category>humor</category><category>facebook platform</category><category>apache</category><category>xml</category><category>i18n</category><category>hibernate</category><category>math</category><category>me</category><category>business</category><category>propel</category><category>ant</category><category>dbunit</category><category>soap</category><category>jabber</category><category>java</category><category>rpc</category><category>php</category><category>programming</category><category>sqlite</category><category>meebo</category><category>best practices</category><category>experiments</category><category>metaprogramming</category><category>wii</category><category>gotchas</category><category>draft</category><category>instant messaging</category><category>ideas</category><category>social broadcasting</category><category>sql</category><category>dns</category><category>groovy</category><category>opinion</category><category>food</category><category>smarty</category><category>marketing</category><category>project management</category><category>testing</category><category>stories</category><category>release</category><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>85</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 uri="harlansdevelopmentjournal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6656664219901387289</guid><pubDate>Wed, 15 Jun 2011 18:07:00 +0000</pubDate><atom:updated>2011-06-15T11:18:43.591-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">me</category><title>Hello World 2.0</title><description>Hello again.  I'm back in the real world with a shiny new Computer Science degree, after three grueling years of hard work. I've relocated to the SF Bay Area from Minneapolis in search of greener pastures. I accepted a position with a startup, &lt;a href="http://emota.net/"&gt;Emota.net&lt;/a&gt;, and am now working with Node.js and Redis. I'm still getting on my feet out here, but I'll be resuming business as usual as I explore the Node ecosystem. Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6656664219901387289?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/4kjmZSmJbq0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/4kjmZSmJbq0/hello-world-20.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.devspan.com/2011/06/hello-world-20.html</feedburner:origLink></item><item><title>Links for 2011-01-14 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/U2ydAjRmal8/harlanji</link><pubDate>Sat, 15 Jan 2011 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2011-01-14</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=246488"&gt;Setting Multiple Inheritance Straight&lt;/a&gt;&lt;br/&gt;
Compares MI vs Mixin vs Trait and their implementation in a number of languages including Python, Ruby, Smalltalk, Scala, and more. Lots of citations, very interesting read.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/U2ydAjRmal8" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2011-01-14</feedburner:origLink></item><item><title>Links for 2010-12-14 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/glqf2E-f4rM/harlanji</link><pubDate>Wed, 15 Dec 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2010-12-14</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.puremango.co.uk/2010/12/genetic-algorithm-for-hello-world/"&gt;Genetic Algorithm For Hello World&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/glqf2E-f4rM" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2010-12-14</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-4721476063873912963</guid><pubDate>Mon, 30 Aug 2010 05:09:00 +0000</pubDate><atom:updated>2010-08-30T08:31:42.135-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Creating a Javascript Library with Maven</title><description>A Javascript library consists of some Javascript files, and potentially some resources like images, templates, and stylesheets. In Maven, these are arranged in the following directory structure:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;my-library/&lt;br /&gt;.  pom.xml&lt;br /&gt;.  src/&lt;br /&gt;.    main/&lt;br /&gt;.      javascript/&lt;br /&gt;.      resources/&lt;br /&gt;.    test/&lt;br /&gt;.      javascript/&lt;br /&gt;.      resources/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The one item that might require some explanation is pom.xml. It is a “project object model” file, which has information about your project and its configuration. It'll be explained piece-by-piece below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Initial Steps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first thing you need to do is install Maven. Go to &lt;a href="http://maven.apache.org/"&gt;http://maven.apache.org&lt;/a&gt; and grab a copy of 2.2.x. Extract it somewhere and add the bin directory to your path.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ export PATH=$PATH:path/to/maven/bin &amp;amp;&amp;amp; mvn --version&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If that worked out right, you should see a Maven version and some Java environment information displayed.&lt;br /&gt;&lt;br /&gt;Next you need to edit your settings.xml file. Run the following command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ mkdir ~/.m2 &amp;amp;&amp;amp; gedit ~/.m2/settings.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and add this content to the file:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gist.github.com/557035#file_settings.xml" target="file"&gt;http://gist.github.com/557035#file_settings.xml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These settings are adding the Sonatype OSS repository where the Javascript plugin and several popular libraries that I have packaged for Maven use are hosted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creating the Project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All that is needed to create a Javascript library is a POM and some source code. A simple POM looks like this, and is called pom.xml:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gist.github.com/557035#file_pom.xml" target="file"&gt;http://gist.github.com/557035#file_pom.xml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are a couple notes about this file, as seen in the comments above.&lt;br /&gt;&lt;br /&gt;1. In Maven, every project is defined uniquely by these 4 pieces. groupId should be a subdomain under your control. artifactId is the name of this project. version is typically [major].[minor].[point]-[type]; type is either a “release” or a “snapshot”. This pertains to deployment which I'll cover in the next article.&lt;br /&gt;&lt;br /&gt;2. A project has many dependencies and a few possible scopes. In this case we're using the “test” scope. The other important one is “runtime”, which I'll describe later. Each dependency has a version; is good practice to use a range. In this case we can use any 1.4.x version of jQuery. This is especially important as many dependencies are added to the project, which may all rely on different point releases of the same library.&lt;br /&gt;&lt;br /&gt;3. Each project can have many plugins. The one that makes JS development possible is the javascript-maven-plugin. Not all plugins require the 'extensions' &lt;extensions&gt; &lt;extensions&gt; element. This one does because it adds 'javascript' dependency and packaging types which are not built into Maven.&lt;br /&gt;&lt;br /&gt;Once you have your POM in place, you need to create some Javascript. Create a file called hello.js in src/main/javascript:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gist.github.com/557035#file_hello.js" target="file"&gt;http://gist.github.com/557035#file_hello.js&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Adding QUnit Tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that we have a little functionality in place, let's create a test for it. Create suite-hello.html in src/test/javascript:&lt;br /&gt;&lt;/extensions&gt;&lt;br /&gt;&lt;a href="http://gist.github.com/557035#file_suite_hello.js" target="file"&gt;http://gist.github.com/557035#file_suite_hello.js&lt;/a&gt;&lt;br /&gt;&lt;extensions&gt;&lt;br /&gt;&lt;br /&gt;First, all tests match the pattern suite-*.html. Second, notice your hello.js file is in the scripts/ directory, while external dependencies (qunit and junit) are in scripts/${artifactId}/filename.js. These are conventions I have put in place that mirror web application packaging, which will be covered later.&lt;br /&gt;&lt;br /&gt;One thing to notice is that qunit is never declared as a dependency to the project. This is likely to change in the near future. At the moment it is automatically added by the plugin code. It might be safe to declare it explicitly, but I'll leave that as an exercise to the reader.&lt;br /&gt;&lt;br /&gt;Now run the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;my-library$ mvn test &amp;amp;&amp;amp; cat target/surefire-reports/qunit.txt&lt;/pre&gt;&lt;br /&gt;If everything went right, you should get a message that says “Build Successful” and have a brief summary of the executed test displayed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Next Time...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the next article I'll show you how to release your project to an open source repository, and declare where it exists in an SCM for automatic release tagging.&lt;/extensions&gt;&lt;/extensions&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-4721476063873912963?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/XmBPUGlloWE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/XmBPUGlloWE/creating-javascript-library-with-maven.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.devspan.com/2010/08/creating-javascript-library-with-maven.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-6435852548035668027</guid><pubDate>Sun, 29 Aug 2010 03:13:00 +0000</pubDate><atom:updated>2010-08-28T20:18:51.563-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Javascript Maven Plugin Revamped</title><description>In the process of researching for the Engineering Better Javascript series, I ended up implementing some of my ideas to make them concrete. I've extended the existing Javascript Maven Tools to include a QUnit plugin and report integration, as well as added some integration tests to ensure that things are working as expected. I also added a javascript-project base parent, which takes some of the redundant code out of the POM for a Javascript project. The code is available on GitHub, &lt;a href="http://github.com/harlanji/javascript-maven-tools"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A good example project to check out is my &lt;a href="http://github.com/harlanji/activitystreams-js"&gt;ActivityStreams JS&lt;/a&gt; project. There are just a few things to notice.&lt;br /&gt;&lt;br /&gt;In the pom.xml file the packaging type is 'javascript' and the parent project is 'javascript-project'. The former enables Javascript lifecycle phases and packaging, and which also allows Javascript dependencies which you can also notice in the pom.xml.&lt;br /&gt;&lt;br /&gt;There is a profiles.xml file. This defines Sonatype OSS repositories, which is where this plugin and several 'vendor' Javascript libraries are deployed. Releases are eventually synced with Maven Central, but that hasn't happened yet. If you're using Maven 3, you need to copy the profiles to your settings.xml.&lt;br /&gt;&lt;br /&gt;The source code to the project lives in src/main/javascript, and the QUnit tests live in src/test/javascript.&lt;br /&gt;&lt;br /&gt;When you run 'mvn test' on the command line, all source and test source is copied to a work directory, where all dependencies are also expanded under the lib directory. These can be included by the test suites. After tests are completed, failures are recorded to target/surefire-reports/qunit.txt where they are placed into generated reports exactly as JUnit tests are for Java.&lt;br /&gt;&lt;br /&gt;This project does not contain integration tests, but to the best of my knowledge it can easily be done using the Jetty plugin with an integration testing tool of your choice fairly easily. This is a feature I'd like to implement sooner rather than later.&lt;br /&gt;&lt;br /&gt;All these tools also work for Webapp projects. I will write a short post about that when I have one working well. To see a sneak peak, check out the hi-og-integration branch of the &lt;a href="http://github.com/harlanji/soashable-osw/tree/mavenjs"&gt;Soashable OSW&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;This post is lacking on the theory and technical details behind this project, which I've been slower than I'd hoped to deliver. But it's a practical taste of what I've been doing in the past few weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-6435852548035668027?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/uSkhMRJ4xnA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/uSkhMRJ4xnA/javascript-maven-plugin-revamped.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.devspan.com/2010/08/javascript-maven-plugin-revamped.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-7682322917126508934</guid><pubDate>Sat, 14 Aug 2010 00:28:00 +0000</pubDate><atom:updated>2010-08-13T18:30:11.155-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Benefits of a Repository Manager</title><description>On the same day I started this series, Tim O'Brien at Sonatype started a series describing the benefits of using a repository manager and saved me a little work ;). He essentially replaced the piece that I've been working on this past week, but he likely did it better (and I still learned tons while researching and writing). Here are links to his articles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-i/" rel="bookmark"&gt;Benefits of a Repository Manager: Part I&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-ii-caching-and-collaborating/" rel="bookmark"&gt;Benefits of a Repository Manager: Part II – Caching and Collaborating&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iii-continuous-build-deployment/" rel="bookmark"&gt;Benefits of a Repository Manager: Part III Continuous Build Deployment&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-iv-deployment/" rel="bookmark"&gt;Benefits of a Repository Manager: Part IV Deployment&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.sonatype.com/people/2010/08/benefits-of-a-repository-manager-part-v-external-partners-and-vendors/" rel="bookmark"&gt;Benefits of a Repository Manager: Part V External Partners and Vendors&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Further pieces to this series are still in the works, though I'll need to do some refactoring and may change the format of some of them to comment on his series with details specific to Javascript, since I'd be repeating much of what he says anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-7682322917126508934?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/fk0X8HSTpzE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/fk0X8HSTpzE/benefits-of-repository-manager.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2010/08/benefits-of-repository-manager.html</feedburner:origLink></item><item><title>Links for 2010-08-05 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/ZuMmKe-1YUw/harlanji</link><pubDate>Fri, 06 Aug 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2010-08-05</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/present/view?id=dgbfz8sm_16f84msqd2"&gt;How to explain Euler's identity using triangles and spirals&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/ZuMmKe-1YUw" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2010-08-05</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-17924780.post-1804866894202178160</guid><pubDate>Thu, 05 Aug 2010 01:37:00 +0000</pubDate><atom:updated>2010-08-04T18:52:11.240-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Engineering Better Javascript</title><description>&lt;span style="font-style: italic;"&gt;This is the first in a series of articles exploring a divergent idea for engineering better Javascript using ideas from the Maven build system.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just a few years ago Javascript became used extensibly enough to warrant automated builds. It went from a language which was embedded sparingly in HTML pages to validate forms, make interactive menus, and disable right clicking, to the central language of the biggest social applications today. Not only is it used in the browser, but increasingly it is used on the server as well.&lt;br /&gt;&lt;br /&gt;In these short few years, the need for a build system has arisen. The most popular systems today are Rake, Make and Ant; and recently Jake was introduced. These systems are declarative and task based, and can generally perform any build that is thrown at them with varying levels of complexity. In the simplest case, they concatenate scripts and replace tokens, download a compressor/test framework and other dependencies, run a compression/optimization routine, execute tests, and create a distribution package.&lt;br /&gt;&lt;br /&gt;So what's the problem? If every Javascript library requires the same build steps, why should they all have their own slightly-different declarative build script? What happened to DRY? Why can't there be a build system which performs all these steps and allows for customization and extension when necessary, but is zero-config in the general case? It turns out that in Java land there are such systems, including Maven and Gradle. And in Maven's case, there is a plugin which extends it to Javascript.&lt;br /&gt;&lt;br /&gt;A few years ago I created a Javascript application that had several library dependencies, and a supporting library for it that also had several of the same dependencies. Having spent a long stint in Java land, building several projects using Ant and eventually porting them to Maven, I had come to love what Maven offered even if it was slightly painful in the beginning. So naturally I wanted to go back to life without the pain of manual transitive dependency management and repetitive build scripts. This is when I found and began using (and contributing to) the Maven Javascript plugin.&lt;br /&gt;&lt;br /&gt;Everyone knows the bad things about Maven, myself included. XML based project models are a nightmare. Plugin creation is way harder than it should be, thanks to Plexus. Project creation requires verbose command line arguments. The entire Internet must be downloaded the first time you build a project. There are plenty of less obvious ones, but I'll spare you, dear non-believers. But believe you me, I know Maven can be painful.&lt;br /&gt;&lt;br /&gt;Despite this pain, there are some redeeming ideas which I think can be salvaged and used toward the betterment of Javascript development. The key ideas, I believe, are: the build lifecycle with plugins and project archetypes, and transitive dependency management with version ranges and a distributed repository architecture.&lt;br /&gt;&lt;br /&gt;Over the coming weeks I will post a series of articles covering these ideas in more depth, and exploring what I see as a good solution to some of the woes of Javascript development. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17924780-1804866894202178160?l=blog.devspan.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/B2K896e6lfc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/B2K896e6lfc/engineering-better-javascript.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.devspan.com/2010/08/engineering-better-javascript.html</feedburner:origLink></item><item><title>Links for 2010-08-03 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/SkkIMb0Zwts/harlanji</link><pubDate>Wed, 04 Aug 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2010-08-03</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/"&gt;Versions Maven Plugin - Introduction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/SkkIMb0Zwts" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2010-08-03</feedburner:origLink></item><item><title>Links for 2010-08-02 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/gYVMNxw7EMI/harlanji</link><pubDate>Tue, 03 Aug 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2010-08-02</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sitepen.com/blog/2010/07/16/asynchronous-commonjs-modules-for-the-browser-and-introducing-transporter/"&gt;Asynchronous CommonJS Modules for the Browser (and Introducing Transporter) | SitePen Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/gYVMNxw7EMI" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2010-08-02</feedburner:origLink></item><item><title>Links for 2010-07-28 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/g5zxgI8X6VA/harlanji</link><pubDate>Thu, 29 Jul 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2010-07-28</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lookingformylife.com/home/2010/3/16/night-owls-vs-early-birds-who-will-win-morning-or-night-peop.html"&gt;Night Owls vs. Early Birds: Who Will Win? Morning or Night&amp;nbsp;People? - Home - Looking For My Life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/g5zxgI8X6VA" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2010-07-28</feedburner:origLink></item><item><title>Links for 2010-07-15 [del.icio.us]</title><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/Q-Q17jK6goQ/harlanji</link><pubDate>Fri, 16 Jul 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/harlanji#2010-07-15</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lifehacker.com/5585217/what-caffeine-actually-does-to-your-brain"&gt;What Caffeine Actually Does to Your Brain&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/Q-Q17jK6goQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/harlanji#2010-07-15</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/GPa_1rDzAS8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/GPa_1rDzAS8/more-thoughts-on-maven-loader.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2008/07/more-thoughts-on-maven-loader.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/mTw7DmudqJI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/mTw7DmudqJI/javascript-dependency-system-using.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.devspan.com/2008/06/javascript-dependency-system-using.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/Z3CpVQuWJsc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/Z3CpVQuWJsc/observations-of-doxia-menu-inheritance.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2008/05/observations-of-doxia-menu-inheritance.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/omfTKf_hxZw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/omfTKf_hxZw/internet-identity-workshop-iiw-thoughts.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2008/05/internet-identity-workshop-iiw-thoughts.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/g6HJ-xHdZnM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/g6HJ-xHdZnM/xmpp-on-web-soashable-upcoming-minnebar.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.devspan.com/2008/04/xmpp-on-web-soashable-upcoming-minnebar.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/xPXYFzRGypk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/xPXYFzRGypk/twitter.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2008/04/twitter.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/OmW1FvKjPe8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/OmW1FvKjPe8/what-ive-been-up-to.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.devspan.com/2008/04/what-ive-been-up-to.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/AkvOtN_hlrk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/AkvOtN_hlrk/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>6</thr:total><feedburner:origLink>http://blog.devspan.com/2008/02/soashable-01-beta-released.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/Ph1fjat4SvA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/Ph1fjat4SvA/creating-distributable-war-project-with.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.devspan.com/2008/02/creating-distributable-war-project-with.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/FpQq2fVQ5Rs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/FpQq2fVQ5Rs/xmpp4js-initial-release.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.devspan.com/2008/02/xmpp4js-initial-release.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/SoYU84ki28Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/SoYU84ki28Q/midwest-meets-southwest.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2008/02/midwest-meets-southwest.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/LFsIyrdgW4c" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/LFsIyrdgW4c/tokbox-api-servlet.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2008/01/tokbox-api-servlet.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/P54QO8yNzA4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/P54QO8yNzA4/how-logic-and-truth-tables-can-apply-to.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2007/12/how-logic-and-truth-tables-can-apply-to.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/-DTIp7ZLO2Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/-DTIp7ZLO2Q/bayeux-jabber-and-xep-0124.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2007/11/bayeux-jabber-and-xep-0124.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/sW73n3gXOso" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/sW73n3gXOso/future-of-js-dev-tools-is-parse-tree.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.devspan.com/2007/10/future-of-js-dev-tools-is-parse-tree.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/iQbMfmVNag4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/iQbMfmVNag4/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>1</thr:total><feedburner:origLink>http://blog.devspan.com/2007/10/admitted-to-u-of-mn.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/-AzpQhQY0LU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/-AzpQhQY0LU/speedier-maven2-webapp-development.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2007/10/speedier-maven2-webapp-development.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/EX2C68COgF8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/EX2C68COgF8/maven-javascript-plugin.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2007/10/maven-javascript-plugin.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/I-5OhyEJrUM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/I-5OhyEJrUM/another-js-maven2-thread.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2007/09/another-js-maven2-thread.html</feedburner:origLink></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;&lt;img src="http://feeds.feedburner.com/~r/HarlansDevelopmentJournal/~4/fuq-Dihx1YE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/HarlansDevelopmentJournal/~3/fuq-Dihx1YE/more-on-jslibbuilder-to-maven2.html</link><author>noreply@blogger.com (Harlan Iverson)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.devspan.com/2007/09/more-on-jslibbuilder-to-maven2.html</feedburner:origLink></item></channel></rss>

