tag:blogger.com,1999:blog-92136439887314783742024-03-19T03:25:27.936-04:00Peter LynchPeter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-9213643988731478374.post-43545745540153958542010-09-15T23:56:00.000-04:002010-09-15T23:56:17.240-04:00Java application launched from PPC or bad stubIf you see this in your OSX Console log after trying to launch a Java application, the problem is obvious - you've been given an application with a Java stub launcher that cannot be run on your version of OSX.<br />
<br />
The solution is a little less obvious.<br />
<br />
<pre class="brush: txt" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;">
$cp /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub
/Applications/<APPNAME>.app/Contents/MacOS
</pre><br />
Some nasty log messages from trying to log an install4j based app that suffered this problem<br />
<br />
<pre class="brush: txt" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;">Notice 2010-09-15 11:29:16 PM [0x0-0x80080].com.install4j.5517-2803-0637-4585.7502[2585] [JavaAppLauncher Warning] Java application launched from PPC or bad stub. Relaunching in 32-bit, and tagging sub-processes to prefer 32-bit with $JAVA_ARCH=i386.
Notice 2010-09-15 11:29:16 PM [0x0-0x80080].com.install4j.5517-2803-0637-4585.7502[2585] [JavaAppLauncher Warning] Java application launched from PPC or bad stub. Relaunching in 32-bit, and tagging sub-processes to prefer 32-bit with $JAVA_ARCH=i386.
Notice 2010-09-15 11:29:16 PM [0x0-0x80080].com.install4j.5517-2803-0637-4585.7502[2585] [JavaAppLauncher Error] This process is [i386] and was re-exec'd from [i386], but for some reason we are trying re-exec to [].
Notice 2010-09-15 11:29:16 PM [0x0-0x80080].com.install4j.5517-2803-0637-4585.7502[2585] [JavaAppLauncher Error] unable to find a version of Java to launch
Notice 2010-09-15 11:29:16 PM [0x0-0x80080].com.install4j.5517-2803-0637-4585.7502[2585] [JavaAppLauncher Error] unable to find a version of Java to launch
Warning 2010-09-15 11:29:16 PM com.apple.launchd[1556] ([0x0-0x80080].com.install4j.5517-2803-0637-4585.7502[2585]) Exited with exit code: 1
</pre>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com80tag:blogger.com,1999:blog-9213643988731478374.post-88461735938492951712010-06-13T22:07:00.000-04:002010-06-13T22:07:31.659-04:00How to fix the Apple Magic Mouse JittersI just bought a new Apple Wireless Keyboard and an Apple Magic Mouse for my 2008 model Mac Pro. I am anticipating a future MacBook Pro purchase so wanted to get used to the new keyboard size and have a mouse for the road.<br />
<br />
For the first few hours of use I noticed the mouse movement very jittery. This is a very common problem as I found out. I tried several things first such as:<br />
<br />
<ul><li>uninstall USB Overdrive</li>
<li>install Apple Magic Mouse drivers</li>
<li>change the wireless router channel to avoid possible interference</li>
<li>tweak mouse track speed settings using MouseZoom preferences</li>
<li>restart, restart, restart....</li>
</ul><div>Finally I decided to try the solution suggested in <a href="http://discussions.info.apple.com/thread.jspa?threadID=2216828&start=45&tstart=0">this thread</a>, using <a href="http://www.thelocale.org/files/howtos/mac-pro-bluetooth-howto.pdf">this pdf</a> as a guide. Basically it is a hardware hack to make the bluetooth module antenna longer. Proud to say it worked perfect when all else failed - this despite having my mouse less than 3 feet from the box on the floor. Pfff....</div><div><br />
</div><div><br />
</div>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com10tag:blogger.com,1999:blog-9213643988731478374.post-51038833693349849722010-05-15T00:37:00.000-04:002010-05-15T00:37:32.567-04:00Building Nexus behind NexusWhile building <a href="http://nexus.sonatype.org">Nexus</a> I got a failure because <code>org.sonatype.spice.inject:guice-plexus:pom:1.1.0-SNAPSHOT</code> was missing.<br />
<br />
Like any sane Maven user, I use a local repository manager (Nexus) and I knew I had the <a href="http://repository.sonatype.org/content/groups/forge/">Sonatype Forge Repo</a> proxied in my local Nexus install so ... strange I thought.<br />
<br />
However searching for the artifact at <a href="http://repository.sonatype.org">http://repository.sonatype.org</a> revealed it's direct path was under <a href="http://repository.sonatype.org/service/local/repositories/snapshots/content">http://repository.sonatype.org/service/local/repositories/snapshots/content</a>.<br />
<br />
After adding a proxy to that repo, I was able to build Nexus no problem. Folks on <a href="irc://irc.codehaus.org:6667/%23nexus">IRC</a> confirmed this is the way to go when building behind Nexus.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com1tag:blogger.com,1999:blog-9213643988731478374.post-13174759317868016552010-05-14T10:51:00.004-04:002012-10-02T14:28:42.040-04:00Maven: How to prevent generate-sources phase executing twice<h3>
The Problem</h3>
So, you've been using Maven to build your project. You require to generate some sources, so you've figured out how to attach a plugin goal to the <code>generate-sources</code> lifecycle phase. This looks like it works great for a while running <code>mvn package</code> ....<br />
<br />
When you decide to finally release your project using the <a href="http://maven.apache.org/plugins/maven-release-plugin/">maven-release-plugin</a>, you notice that your source generation plugin executes twice, slowing your build and possibly even breaking it. You are now trying to figure out why your sources are being generated twice, or more specifically why the <code>generate-sources</code> lifecycle phase is being executed twice.<br />
<br />
You predictably do a google search and scan the Maven issues. You find several <a href="http://jira.codehaus.org/browse/MSOURCES-8">complaints</a> and <a href="http://jira.codehaus.org/browse/MSOURCES-13">reports</a> open that mention a <a href="http://jira.codehaus.org/browse/MSOURCES-31">similar</a> <a href="http://jira.codehaus.org/browse/MSOURCES-37">problem</a> related to the maven-sources-plugin sources:jar goal causing the generate-sources phase to execute twice. Suprisingly these issues are marked fix or mention what looks like a workaround and no matter what you do, the plugin goals you have attached to the <code>generate-sources</code> phase are still being executed twice.<br />
<br />
Here I attempt to explain what is really going on and provide you a real workaround for it. <br />
<br />
<h3>
History</h3>
An old relic of the maven-release-plugin is that in <a href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Super_POM">Maven's Super POM</a> there is defined a profile with id of <code>release-profile</code>. It can be activated by the <code>releaseProfile</code> property being set, in this case to <code>true</code>. This was/is a way for the release plugin to activate the creation of source and javadoc jars for a release by default. The profile defines a <a href="http://maven.apache.org/plugins/maven-source-plugin/">maven-source-plugin</a> and <a href="http://maven.apache.org/plugins/maven-javadoc-plugin/">maven-javadoc-plugin</a> configuration that attaches the <code>jar</code> goals of those plugins to the <code>package</code> phase.<br />
<br />
So what this means is that when using the <a href="http://maven.apache.org/plugins/maven-release-plugin/">maven-release-plugin</a> or activating the <code>release-profile</code> manually by setting the <code>releaseProfile</code> property, <code>source:jar</code> goal gets called during the build, which will trigger the execution of <code>generate-sources</code> lifecycle phase to run, even if it already did in the same build.<br />
<br />
Changing the Maven Super POM to instead call <code>source:jar-no-fork</code> would fix this issue, yet changing the Super POM is not something taken lightly, and in fact may have never been proposed for this case. <br />
<br />
Until the problem is permanently addressed, here I outline a workaround that prevents the duplicate generate-sources phase from running.<br />
<br />
<h3>
Workaround</h3>
I've tested the following instructions with Maven 2.0.11, 2.2.1 and 3.0-beta-1. The version of maven-source-plugin used was 2.1.1.<br />
<br />
<ol>
<li>First lets reproduce the problem on a sample project. Using the maven-archetype-plugin is the simplest way.<br />
<pre class="brush: xml" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;">mvn archetype:generate
</pre>
</li>
<li>Next since the problem is that <code>generate-sources</code> phase gets run twice, we need a visual cue when this occurs. A simple solution is attach a message to this phase with the <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">maven-antrun-plugin</a>.<br />
<br />
Add the following to your test project pom.xml:<br />
<pre class="brush: xml" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>generate-sources-flag</id>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>GENERATE SOURCES IS EXECUTING</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</pre>
</li>
<li>Next lets verify that the generate-sources phase is getting executed twice when activating the release-profile. The release profile defined in the super pom gets activated by setting the <code>performRelease</code> property on the cmd line.<br />
<br />
<pre class="brush: txt" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;">$mvn clean install -DperformRelease=true
Using Java version: 1.6
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building nofork 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.4:clean (default-clean) @ nofork ---
[INFO] Deleting /Users/plynch/dev/plynch/trial/nofork/target
[INFO]
[INFO] --- maven-antrun-plugin:1.3:run (generate-sources-flag) @ nofork ---
[INFO] Executing tasks
[echo] GENERATE SOURCES IS EXECUTING
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.4.2:resources (default-resources) @ nofork ---
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3:compile (default-compile) @ nofork ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.4.2:testResources (default-testResources) @ nofork ---
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3:testCompile (default-testCompile) @ nofork ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.5:test (default-test) @ nofork ---
[INFO] Surefire report directory: /Users/plynch/dev/plynch/trial/nofork/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.company.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.3:jar (default-jar) @ nofork ---
[INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar
[INFO]
[INFO] >>> maven-source-plugin:2.1.1:jar (attach-sources) @ nofork >>>
[INFO]
[INFO] --- maven-antrun-plugin:1.3:run (generate-sources-flag) @ nofork ---
[INFO] Executing tasks
[echo] GENERATE SOURCES IS EXECUTING
[INFO] Executed tasks
[INFO]
[INFO] <<< maven-source-plugin:2.1.1:jar (attach-sources) @ nofork <<<
[INFO]
[INFO] --- maven-source-plugin:2.1.1:jar (attach-sources) @ nofork ---
[INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar
[INFO]
[INFO] --- maven-javadoc-plugin:2.5:jar (attach-javadocs) @ nofork ---
[WARNING] Source files encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
Loading source files for package com.company...
Constructing Javadoc information...
Standard Doclet version 1.6.0_17
Building tree for all the packages and classes...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//App.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-frame.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-summary.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-tree.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/constant-values.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//class-use/App.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-use.html...
Building index for all the packages and classes...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/overview-tree.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index-all.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/deprecated-list.html...
Building index for all classes...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-frame.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-noframe.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/help-doc.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/stylesheet.css...
[INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar
[INFO]
[INFO] --- maven-install-plugin:2.3:install (default-install) @ nofork ---
[INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT.jar
[INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-sources.jar
[INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-javadoc.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.162s
[INFO] Finished at: Thu May 13 10:39:58 EDT 2010
[INFO] Final Memory: 13M/264M
[INFO] ------------------------------------------------------------------------
</pre>
<br />
Notice our message gets printed twice, verifying the double execution. So lets proceed to fix the problem.<br />
</li>
<li>Make the following additions to your pom.xml.<br />
<ol>
<li>First we override the super-pom maven-sources-plugin execution with id of <code>attach-sources</code>. This excution is what calls the <code>source:jar</code> goal. The special trick used here binds this execution to a non-existent lifecycle phase of <code>DISABLE_FORKED_LIFECYCLE_MSOURCES-13</code> - a phase which will never be reached, thus essentially disabling this execution.<br />
<br />
<pre class="brush: xml" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><pluginManagement>
<plugins>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<!-- here we override the super-pom attach-sources executionid which
calls sources:jar goal. That goals forks the lifecycle, causing
the generate-sources phase to be called twice for the install goal.
This causes any other plugin bound to the generate-sources phase to
be called twice which usually has nasty side effects, let alone
creating duplicate processing and longer build times. -->
<execution>
<id>attach-sources</id>
<phase>DISABLE_FORKED_LIFECYCLE_MSOURCES-13</phase>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</pre>
</li>
<li>Next, since we would still like releases using the <code>release-profile</code> profile to include a sources jar file, we define a new profile with the same id as the one in the super POM. This time however we bind the execution to the <code>jar-no-fork</code> goal, which does not trigger the <code>generate-sources</code> phase to be called twice.<br />
<br />
<pre class="brush: xml" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><profiles>
<!-- MSOURCES-13 related workaround overriding super-pom -->
<profile>
<id>release-profile</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources-no-fork</id>
<inherited>true</inherited>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</pre>
</li>
</ol>
</li>
<li>Now we run the same command and verify that our solution worked.<br />
<pre class="brush: txt" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;">$mvn clean install -DperformRelease=true
Using Java version: 1.6
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building nofork 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.4:clean (default-clean) @ nofork ---
[INFO] Deleting /Users/plynch/dev/plynch/trial/nofork/target
[INFO]
[INFO] --- maven-antrun-plugin:1.3:run (generate-sources-flag) @ nofork ---
[INFO] Executing tasks
[echo] GENERATE SOURCES IS EXECUTING
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.4.2:resources (default-resources) @ nofork ---
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3:compile (default-compile) @ nofork ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.4.2:testResources (default-testResources) @ nofork ---
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3:testCompile (default-testCompile) @ nofork ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.5:test (default-test) @ nofork ---
[INFO] Surefire report directory: /Users/plynch/dev/plynch/trial/nofork/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.company.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.026 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.3:jar (default-jar) @ nofork ---
[INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources-no-fork) @ nofork ---
[INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar
[INFO]
[INFO] --- maven-javadoc-plugin:2.5:jar (attach-javadocs) @ nofork ---
[WARNING] Source files encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
Loading source files for package com.company...
Constructing Javadoc information...
Standard Doclet version 1.6.0_17
Building tree for all the packages and classes...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//App.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-frame.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-summary.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-tree.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/constant-values.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//class-use/App.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-use.html...
Building index for all the packages and classes...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/overview-tree.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index-all.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/deprecated-list.html...
Building index for all classes...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-frame.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-noframe.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/help-doc.html...
Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/stylesheet.css...
[INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar
[INFO]
[INFO] --- maven-install-plugin:2.3:install (default-install) @ nofork ---
[INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT.jar
[INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-sources.jar
[INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-javadoc.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 24.278s
[INFO] Finished at: Fri May 14 07:56:39 EDT 2010
[INFO] Final Memory: 13M/264M
[INFO] ------------------------------------------------------------------------
</pre>
As you can see, our verification message prints only once, yet we still get the sources jar - a good thing!<br />
</li>
</ol>
<br />
I recommend the above config be considered for adding to your organization's root pom. I also suggest the permanent solution to this issue is changing the Maven super pom release-profile to rely on jar-no-fork instead of jar goal.
<br />
<br />
<h3>
<span style="color: #cc0000;">Update</span></h3>
<div>
I'm occasionally asked how to make sure you still get a sources jar for your SNAPSHOT artifacts. Simple!</div>
<div>
<br />
<div>
Just add the following to your normal <build> section of your pom, in addition to all of the above instructions:</div>
<br />
<pre class="brush: xml" style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace; font-size: 12px; height: auto; line-height: 14px; overflow: auto; padding: 0px; text-align: left; width: 99%;"> <plugins>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources-no-fork</id>
<inherited>true</inherited>
<phase>generate-sources</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pre>
</div>
Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com230tag:blogger.com,1999:blog-9213643988731478374.post-59395639850424783122010-04-03T21:44:00.001-04:002010-04-03T22:36:46.654-04:00Markdown jEdit modeI was writing a few docs in <a href="http://daringfireball.net/projects/markdown/syntax#link">Markdown</a> syntax. I wanted a Markdown mode file for jEdit. The best I could find was by <a href="http://hasseg.org/">Ali Rantakari</a> on his <a href="http://hasseg.org/blog/?p=302">blog</a>. It was a good start but I thought I could make a few improvements. I got a chance to write my own Markdown mode file for jEdit, using his as inspiration. Compared to his I think I made the following improvements:<br />
<br />
<ul><li>better blockquote handling.</li>
<li>more intuitive link highlighting</li>
<li>better block html handling and general html highlighting</li>
</ul><br />
I found jEdit mode files a bit limiting and harder to write than I thought it would be. I spent a bunch of time trying to work around the limitations of regexs' not spanning multiple lines and span capturing not ending where it should.<br />
<br />
My <a href="http://github.com/peterlynch/jEdit-modes/blob/master/markdown.xml">Markdown mode file</a> is on <a href="http://github.com/peterlynch/jEdit-modes">github.com</a> and was tested using <a href="http://jedit.org/">jEdit 4.3.1</a> .<br />
<br />
Hope it helps someone out.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com2tag:blogger.com,1999:blog-9213643988731478374.post-7973006510211185292010-02-05T15:14:00.003-05:002010-02-19T13:35:46.472-05:00Setting up visual diff and merge for Git on OSXThey are mentions around the web about the best visual diff and merge tools to use for Git on OSX - for example <a href="http://stackoverflow.com/questions/187064/graphical-diff-for-mac-os-x">this question</a> on <a href="http://stackoverflow.com">StackOverflow</a>.<br />
<br />
However I decided to go with the suggestion inside of <a href="http://progit.org/book/">Pro Git</a>. The following is a summary of what I did, extracted more or less <a href="http://progit.org/book/ch7-1.html">from the book</a>.<br />
<br />
<pre>#!/bin/sh
# This script is a summary of the advice provided by the book Pro Git (Thanks to author).
# to create visual merge and diff scripts to be used from cmd line git
# Script by Peter Lynch (http://blog.peterlynch.ca)
# 1. Download p4merge from perforce
# http://www.perforce.com/perforce/downloads/macintoshlist.html#macosx104u ( summary )
# Download the "P4V: Visual Client", mount the the DMG, copy p4merge to /Applications
# 2. Create wrapper scripts
sudo cat > /usr/local/bin/extMerge <<extMerge
#!/bin/sh
/Application/p4merge.app/Contents/MacOS/p4merge \$*
extMerge
sudo cat > /usr/local/bin/extDiff <<extDiff
#!/bin/sh
[ \$# -eq 7 ] && /usr/local/bin/extMerge "\$2" "\$5"
extDiff
# 3. Set owner and perms
sudo chown root /usr/local/bin/extMerge
sudo chown root /usr/local/bin/extDiff
sudo chmod ugo+x /usr/local/bin/extMerge
sudo chmod ugo+x /usr/local/bin/extDiff
# 4. Configure Git to use our new scripts
git config --global merge.tool extMerge
git config --global mergetool.extMerge.cmd \
'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
git config --global mergetool.trustExitCode false
git config --global diff.external extDiff
# 5. confirm
git config -l
echo ----------
ls -la /usr/local/bin/ext*
</pre><br />
Remember to execute the script using sudo or else you'll get permission denied errors.<br />
<br />
Also, to bypass the external diff don't forget you can use <pre>git diff --no-ext-diff</pre>.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-37611100384076665032010-01-28T11:12:00.000-05:002010-01-28T11:12:32.389-05:00iPad?I watched <a href="http://www.discoverychannel.ca/Showpage.aspx?sid=13287">Daily Planet</a> yesterday. First report was on the iPad launch. Second report was on a <a href="http://www.fogscreen.com/en/home/index.html">fog screen</a> display.<br />
<br />
I was more impressed by the fog screen display.<br />
<br />
I didn't watch the keynote. I didn't even really read about it yet.<br />
<br />
But I already think the iPad will fail. Apple how could you...Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com2tag:blogger.com,1999:blog-9213643988731478374.post-12971257245331400272010-01-27T11:15:00.000-05:002010-01-27T11:15:59.692-05:00How to setup Google Apps SPF recordThe Google Apps configuration pages recommend you set up SPF in your DNS but do not tell you what to set it to. <br />
<br />
You would think they would just include the directions found <a href="http://www.google.com/support/a/bin/answer.py?answer=33786">here</a>.<br />
<br />
"<i>To set your domain's SPF record, publish the following TXT record on the DNS resource: v=spf1 include:aspmx.googlemail.com ~all</i>"Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-22254410046373502172010-01-26T00:26:00.000-05:002010-01-26T00:26:27.786-05:00Blacklist creation error on boot - Google App Engine for Java | Google GroupsAs documented <a href="http://groups.google.com/group/google-appengine-java/browse_thread/thread/5e34079b5b3d58a1/fdc438b220a49f3d?lnk=raot">elsewhere</a>, if you see this:<br /><br /><pre><br />Jan 26, 2010 5:09:32 AM com.google.appengine.tools.development.agent.impl.BlackList initBlackList<br />SEVERE: Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/plugin.jar<br /></pre><br /><br />...then do this<br /><br /><pre><br />cd /System/Library/Frameworks/JavaVM.framework/Resources/Deploy.bundle/Contents/Home/lib<br />sudo ln -s plugin.jar plugin2.jar<br /></pre><br /><br />and all will be well.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-50248627225629669402010-01-13T23:16:00.002-05:002010-01-13T23:19:39.765-05:00OSX X11 defaultsHere are some changes to the <a href="http://xquartz.macosforge.org/trac/wiki">X11</a> defaults I made on my Mac OSX.<br />
<br />
<b>X11 2.4.0</b> - <a href="http://xquartz.macosforge.org/trac/wiki/X112.4.0">2.4.0 release notes</a><br />
Close X11 if no other X11 apps are running<br />
<pre>defaults write org.x.X11 wm_auto_quit -bool true
defaults write org.x.X11 wm_auto_quit_timeout -int 3
</pre><br />
<br />
<b>X11 < 2.4.0</b><br />
Focus Follows mouse when multiple X windows are open. This avoids two clicks to activate a window:<br />
<pre>defaults write org.x.X11 wm_ffm true
defaults write org.x.X11 click_through -bool true
</pre>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com1tag:blogger.com,1999:blog-9213643988731478374.post-71188608253090056782009-12-11T15:17:00.015-05:002009-12-11T15:35:47.813-05:00New Apache.org artifact repositories for Maven you should be aware ofI recently tried creating a Maven core integration test using <a href="https://repository.apache.org/index.html#nexus-search;quick%7Emaven-it-sample-archetype">the archetype</a> that the team kindly created. However when I tried to use it I got <code>Unable to find resource 'org.apache.maven.its:maven-it-sample-archetype:jar:1.0-SNAPSHOT'</code>.<br />
<br />
Turns out this artifact does not live in <a href="http://people.apache.org/repo/m2-snapshot-repository">http://people.apache.org/repo/m2-snapshot-repository</a> - instead I've learned that Apache has new Maven repositories set up now that projects there are slowly adopting.<br />
<br />
Wondering why I never heard about it before....<br />
<br />
Anyways I added a proxy for <a href="https://repository.apache.org/content/groups/snapshots-group/">https://repository.apache.org/content/groups/snapshots-group/</a> to my local Nexus install. Then I disabled my old proxy for <a href="http://people.apache.org/repo/m2-snapshot-repository">http://people.apache.org/repo/m2-snapshot-repository</a> since the snapshots-group includes the PAO repo. Finally I added the new repo to my 'All Repositories' and 'Public Snapshot Repositories' group in Nexus so that my Maven build will pick it up.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_79rdJUkKtUk/SyKrN-LikzI/AAAAAAAAAlA/pCpCnUsQBQI/s1600-h/Picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_79rdJUkKtUk/SyKrN-LikzI/AAAAAAAAAlA/pCpCnUsQBQI/s640/Picture+2.png" /></a><br />
</div><br />
<br />
Here is some information I found out about the new repos.<br />
<a href="http://www.blogger.com/%20http://www.apache.org/dev/repository-faq.html"><br />
http://www.apache.org/dev/repository-faq.html</a><br />
<a href="https://issues.apache.org/jira/browse/INFRA-1896">https://issues.apache.org/jira/browse/INFRA-1896</a><br />
<br />
The <a href="https://repository.apache.org/">new Apache.org artifact repositories</a> - use em' or else.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-66836358348306106252009-12-10T02:41:00.000-05:002009-12-10T02:41:26.224-05:00Robustly enforcing a minimum Maven version for your projectMaven user's quickly realize that it is a good idea to force a fixed (or at least minimum) version of Maven to be used to build their Maven project. Initially one may gravitate towards using the following pom snippet:<br />
<br />
<pre class="brush: xml" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;"><prerequisites>
<maven>2.0.10</maven>
</prerequisites>
</pre><br />
Looks good, except there are a couple gotchas<br />
1. Typos. If you make one then you will get no warning or complaints from maven. You might as well have this.<br />
<br />
<pre class="brush: xml" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;"><prerequisites>
<maven>Maven treats this string as older than any Maven version you might use</maven>
</prerequisites>
</pre><br />
A bug is even more likely if you do this:<br />
<br />
<pre class="brush: xml" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;"><prerequisites>
<maven>${maven.min-version}</maven>
</prerequisites>
</pre><br />
Let's say that property can't be resolved for whatever reason - typos? - again Maven will treat that 'version' as older than any valid Maven version you could be executing the POM with. This is actually not a bug but by design since Maven does not force project's ( in this case Maven itself) to a strict version number specification.<br />
<br />
2. Another problem is that <prerequisites> section is not even used at all by the next major version of Maven 3.x as of today. So even if you did have it right, it is not future proof. <br />
<br />
3. Finally maven considers versions like "1.0-alpha-2" to be newer than "1.0-alpha-15" as of Maven 2.x series at least. A bug indeed in the version compare logic - <a href="http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java?revision=792679&view=markup">the failing test cases being commented out in the source code</a>. <i> Although Maven 3.x ignores prerequisites in pom, at least the version comparison noted here <a href="http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-compat/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java?view=markup">is fixed</a>.</i><br />
<br />
4. Lastly the <maven> element does not handle version ranges. So when it sees [2.0.6,2.0.8], we are just back to problem 1. <br />
<br />
So what to do?<br />
<br />
Use the <a href="http://maven.apache.org/plugins/maven-enforcer-plugin/index.html">maven-enforcer-plugin</a> instead. The benefits are:<br />
<br />
1. Many different rules supported, not just Maven version.<br />
2. Write your own rules.<br />
3. Version ranges are supported.<br />
4. Version comparisons are more robust.<br />
5. Bind the version check to Maven lifecycle phases or profiles.<br />
<br />
Below is an example configuration for the plugin to require a minimum Maven version 2.0.9 and above. The unique thing about this example is that there are three executions, one for each pre-defined Maven build lifecycle. Usually you just see the first execution only, which is bound to the validate phase of the default lifecycle. However if one were to do <pre>mvn clean</pre>or <pre>mvn site</pre>then the version validation would not be enforced since those goals do not have a validate phase. Having all three executions covers all the bases. <br />
<br />
The other best practice is define a property to hold the Maven versions so that it can be changed in one place only or manipulated on the cmd line.<br />
<br />
<pre class="brush: xml" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;"><properties>
<maven.min-version>2.0.9</maven.min-version>
</properties>
</pre><br />
<pre class="brush: xml" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;"><plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-default</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[${maven.min-version},)</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
<execution>
<id>enforce-clean</id>
<phase>pre-clean</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[${maven.min-version},)</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
<execution>
<id>enforce-site</id>
<phase>pre-site</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[${maven.min-version},)</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</pre>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com3tag:blogger.com,1999:blog-9213643988731478374.post-63838690042492706612009-11-29T01:36:00.001-05:002009-11-30T13:47:24.325-05:00Maven plugin groupId org.codehaus.mojo not searched by default??I got interested in removing all my explicit <groupid>org.codehaus.mojo</groupId> declarations on my plugin dependencies since now Maven supports searching that groupId for a plugin's artifactId. This feature was added a while ago I guess.<br />
<br />
Just came across a nasty little bug in Maven 2.2.1 which has been reported since 2.0.9.<br />
<br />
<a href="http://jira.codehaus.org/browse/MNG-4001">[#MNG-4001] Unable to resolve Dashboard mojo from Central - jira.codehaus.org</a><br />
<br />
The summary above is very misleading. In fact I consider myself lucky to find it since it more has to do with any org.codehaus.mojo based plugin.<br />
<br />
When I did try to remove my plugin's groupIds I got the classic "Unable to find resource 'org.apache.maven.plugins:buildnumber-maven-plugin:pom:1.0-beta-4' in repository central".<br />
<br />
Turns out this may be related to maven metadata in my local repo and/or the remote repos being randomly deleting version info???? See the bug followups for more info.<br />
<br />
In fact this bug is nasty because<br />
1. there is no mention in the error that is what could be wrong.<br />
2. Adding a pluginGroups section to your ~/.m2/settings.xml file with that group changes nothing, even in the error output. Plus using -X shows that maven does not even try to locate org.codehaus.mojo version of that plugin or any other groupId specified in your pluginGroups settings. It may have looked at the metadata, but we would never know.<br />
3. Deleting your local maven metadata may only fix the error temporarily or not at all.<br />
4. Try this: Define your plugin configuration in pluginManagement <i>without</i> the groupId. Next, define the same plugin in a profile <i>with</i> the groupId. Run a mvn cmd that activates the profile and you will notice that none of your plugin settings inside plguinManagement gets picked up - and of course there is no warning or messages in the debug output that complain. Add the group id to the pluginManagement section and it all of a sudden works as expected.<br />
<br />
<b>So the rule of thumb is leave well enough alone and always explicitly specify the groupId for all plugins except <i>org.apache.maven.plugins groupId which still work.</i></b>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-73729786120525001782009-11-28T00:52:00.121-05:002009-11-30T00:23:56.322-05:00Blogger: Awesome code syntax highlighting made easyThis post represents my to-date findings on the best way to paste source code into a Blogger based blog post. The goal is to have something with enough sugar for reading the post in the browser and also having it RSS reader compatible.<br />
<br />
Several poor man solutions are out there. Examples are <a href="http://formatmysourcecode.blogspot.com/">here</a> and <a href="http://codeformatter.blogspot.com/2009/06/about-code-formatter.html">here</a>.<br />
Basically these are javascript based apps which take your code and apply some html escaping and wrap it with a <pre> tag and inline styles.<br />
<br />
I remembered liking what <a href="http://developer.yahoo.com/yui/">YUI</a> uses on their site. It is a syntax highlighter written by Alex Gorbatchev and can be found <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter">here</a>. A summary of how to add it to your Blogger posts is <a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html">here</a>. This is more advanced in terms of display and user options.<br />
<br />
While 'pretty', the Gorbatchev highlighter has the caveat that all the sugar goes away in RSS readers. I mean it works, however the result is just monospaced font. <br />
<br />
By combining the Gorbatchev highlighter with the simplified source code formatters approach, I can have the best of both. Code that looks good in the browser and also when read with an RSS reader.<br />
<br />
1. Edit your blogger template following the instructions outlined <a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html">here</a> to activate the Gorbatchev SyntaxHighlighter.<br />
<br />
2. (Optional) Install this Firefox add-on <a href="https://addons.mozilla.org/en-US/firefox/addon/1347">Clippings</a> to make pasting the required html into the blogger editor easy.<br />
<br />
3. Use the following html to wrap your source code you paste into the editor. Remember that any source code must be <a href="http://accessify.com/tools-and-wizards/developer-tools/quick-escape/default.php">html escaped</a> ( < brackets must be escaped!) <br />
<br />
<pre class="brush: xml;" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;"><pre class="brush: xml;" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;">
<!-- your code goes here -->
</pre>
</pre><br />
The "brush: xml" part indicates what type of source code you are formatting. I suggest making a new clipping in the Clippings add-on (step 2) for each type source code you typically are pasting into your blog. See this <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes">page</a> for more info on brushes and this <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Configuration">page</a> on how to specify additional parameters to the source code formatter.<br />
<br />
Make sure to use the pre element version of the code block and not the script element version since script tags are removed in rss feeds.<br />
<br />
4. Test it out. Create a new blog post, click the 'Edit Html' tab of the blogger editor. Make sure the Post Options include "Show HTML Literally" checked. Right click inside the editor textbox and select a clipping from the Clippings menu to paste a preconfigured pre block. Add some source code and publish your post.<br />
Note: To see the full effect remember to publish your post since the popup preview window in Blogger editor only shows the simplified version of the formatting.<br />
<br />
Here is an example of what code will look like when viewed in a browser.<br />
<br />
<pre class="brush: js" style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;">/**
* SyntaxHighlighter
*/
function foo()
{
// it works!
}
</pre><br />
Here is an example of what RSS readers typically display. The class attribute will have no effect.<br />
<br />
<pre style="font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:14px;">/**
* SyntaxHighlighter
*/
function foo()
{
// it works!
}
</pre><br />
<br />
<b>Caveats:</b><br />
1. The flash based toolbar will not show up on some mobile platforms for obvious reasons. Not a big deal as that is just sugar.<br />
2. The described solution I use depends on using the Clippings add-on in Firefox and therefore the Firefox browser. Other browsers may have some similar plugins available - I dunno. Either way it is not critical.<br />
<br />
If anyone has found a better solution please let me know.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com2tag:blogger.com,1999:blog-9213643988731478374.post-73309303253940641162009-11-28T00:19:00.000-05:002009-11-28T00:19:37.698-05:00buildnumber-maven-plugin helpful improvementsI've used the <a href="http://mojo.codehaus.org/buildnumber-maven-plugin/">buildnumber-maven-plugin</a> to include revision ids and timestamps in my builds for many years. Today I upgraded to the most recent version and that helped get rid of a few workarounds I had in place.<br />
<br />
Using a previous version of the plugin, if there was no svn on your path, or your project was not checked in yet to subversion, the plugin failed the build due to svn checks. The workaround I had was to add it to a profile that only got executed when .svn file existed and/or the <a href="http://maven.apache.org/plugins/maven-release-plugin/perform-mojo.html#useReleaseProfile">useReleaseProfile property</a> was 'true'.<br />
<br />
Now I am relieved to see I don't need to do that anymore.<br />
<br />
For one, there is a 'revisionOnScmFailure' property you can set in the configuration that will be used if there is any type of scm exception - a byproduct of which disables further scm communication.<br />
<br />
Second you can specify the plugin to use the javasvn scm provider implementation in case there is no 'svn' executable on your PATH. At first pass it might seem unlikely that when dealing with a subversion based project a developer would not have svn on the path, and that is likely true. Consider though that the svn version may be wrong (in which case svn may complain about not being new enough and fail the build) or you are building in a continuous integration env like hudson and you want reproducible use of the same svn tool. In those cases it makes good sense to configure the plugin with "javasvn". See below example:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code><plugin>
<groupid>org.codehaus.mojo</groupid>
<artifactid>buildnumber-maven-plugin</artifactid>
<version>1.0-beta-4</version>
<configuration>
<revisiononscmfailure>UNKNOWN_REVISION</revisiononscmfailure>
<providerimplementations>
<svn>javasvn</svn>
</providerimplementations>
</configuration>
<executions>
<execution>
<id>buildnumber-one</id>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
<execution>
<id>buildnumber-two</id>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
<configuration>
<format>r${buildNumber} {0,date,yyyy-MM-dd'T'HH:mm:ss.SSSZ}</format>
<items>
<item>timestamp</item>
</items>
</configuration>
</execution>
</executions>
</plugin>
</code></pre><br />
The two executions is so that I can give some context to the ${buildNumber} by prefixing it with 'r' and adding a timestamp formatted along with it.<br />
<br />
There are a bunch of other useful properties in this latest release. Thanks to open source.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com4tag:blogger.com,1999:blog-9213643988731478374.post-11650536081637333642009-11-27T22:40:00.002-05:002010-02-04T23:38:03.738-05:00Mac OS X environment variables + Netbeans + MavenApplications that are not launched through your terminal in OS X do not read environment variables from ~/.profile, ~/.bash_profile and similar. These applications that launch directly can get their environment from each user's ~/.MacOSX/environment.plist file. ( You have to create it!)<br />
<br />
I heard of this before, but I wanted to make note of a quick way to ease the maintaining of that file and finally had a need because of <a href="http://netbeans.org/">Netbeans</a>.<br />
<ol><li>Downloaded Brian D Foy's <a href="http://sourceforge.net/projects/brian-d-foy/files/Mac-PropertyList/Mac-PropertyList-1.30/Mac-PropertyList-1.30.tar.gz/download">Perl plist lib</a> and installed it.</li>
<li>Used a 3 line script to generate the ~/.MacOSX/environment.plist file from my terminal's ENV variable <a href="http://use.perl.org/%7Ebrian_d_foy/journal/8915">as he suggested</a>.</li>
<li> Log out and log in for the file to take effect.<br />
</li>
</ol>Now I can be sure the PATH that Netbeans sees is the same thing that mvn and other tools are seeing when I execute them on the cmd line. Also I don't really have to worry about maintaining my env in two places as one is derived from the other.<br />
<br />
<b>References</b><br />
<a href="http://developer.apple.com/mac/library/qa/qa2001/qa1067.html">Technical Q&A QA1067: Setting environment variables for user processes</a><br />
<a href="http://www.peter.com.au/macosx/index.html#environment">Helpful Summary of other ways to set env variables in OS X</a><br />
Brian D Foy's Perl <a href="http://sourceforge.net/projects/brian-d-foy/files/Mac-PropertyList/Mac-PropertyList-1.30/Mac-PropertyList-1.30.tar.gz/download">plist reader lib</a> and <a href="http://use.perl.org/%7Ebrian_d_foy/journal/8915">blog post</a><br />
<a href="http://wiki.netbeans.org/MacOSXEnvForApp">Netbeans documentation on working with OS X Environment variables </a><br />
<br />
<b>Update</b><br />
Another method is setting environment variables inside your <pre>/etc/launchd.conf</pre>file as described <a href="http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x">here</a> - there are clear benefits to this for apps launched outside your personal login.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-10088759772349616872009-11-26T21:08:00.001-05:002009-11-26T21:09:27.863-05:00Maven Special Character Encoding Properties for Sites and ReportsThanks to the post on the Sonatype blog I've got two other global properties to set in my global parent pom that sets the encoding for Maven reports - most of them anyways.<br />
<br />
<a href="http://www.sonatype.com/people/2009/11/special-character-encoding-properties/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+sonatype+%28Sonatype+Blogs%29&utm_content=Google+Reader">Sonatype Blog: Special Character Encoding Properties</a><br />
<br />
<blockquote><blockquote><code>project.build.sourceEncoding</code><br />
<code>project.reporting.outputEncoding</code><br />
</blockquote><br />
</blockquote>Thanks for the summary Anders Hammar.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com2tag:blogger.com,1999:blog-9213643988731478374.post-39194733029161352382009-11-14T23:25:00.000-05:002009-11-14T23:25:26.119-05:00Slipstream Service Pack 3 into Your Windows XP Installation CD<div>So I finally got bored of installing Windows XP a few times during some cross platform testing, setting it up with all my options and service packs etc.<br />
</div><br />
<div>I've got a Windows XP SP1a CD, but I wanted an SP3 install out-of-box. I had slipstreamed before, but somehow lost the CD during some moves. The good folks at lifehacker set me straight.<br />
</div><div><br />
</div><a href="http://lifehacker.com/386526/slipstream-service-pack-3-into-your-windows-xp-installation-cd">Slipstream Service Pack 3 into Your Windows XP Installation CD - Customization - Lifehacker</a><br />
<div><br />
</div><div><a href="http://lifehacker.com/386526/slipstream-service-pack-3-into-your-windows-xp-installation-cd"></a>What I like about this solution the most is the use of <a href="http://www.nliteos.com/">nLite</a> to create the whole package, which worked great! No cmd line work at all. It couldn't be easier I suppose.<br />
</div><div><br />
</div><div>Lastly since I was burning it from Windows XP running in VMWare Fusion, I had to enable DMA on the IDE channel my Mac Pro's CD drive was attached with. <br />
</div><div>Else nLite was throwing a burning error. Simple workaround below courtesy of this <a href="http://www.microsoft.com/whdc/device/storage/IDE-DMA.mspx">link</a> here as a reminder.<br />
</div><div><br />
<div>To enable DMA mode using the Device Manager<br />
</div></div><ol><li>Open Device Manager.</li>
<li>Double-click IDE ATA/ATAPI Controllers to display the list of controllers and channels.</li>
<li>Right-click the icon for the channel to which the device is connected, select Properties, and then click the Advanced Settings tab.</li>
<li>In the Current Transfer Mode drop-down box, select DMA if Available if the current setting is "PIO Only."<br />
If the drop-down box already shows "DMA if Available" but the current transfer mode is PIO, then the user must toggle the settings. That is:<br />
<br />
<ul><li>Change the selection from "DMA if available" to PIO only, and click OK.</li>
<li>Then repeat the steps above to change the selection to DMA if Available.</li>
</ul><br />
<br />
</li>
</ol>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-76268424347268805602009-10-30T23:17:00.002-04:002009-10-30T23:31:11.868-04:00Will I be saved by The Energy Detective (TED)?So long story short...<div><br /></div><div>I was living in the dark ages with a low power bill and a 13" TV. We decide to get a new TV. Want good picture, large screen and low price. Can't have it all. So I buy a soon to be dinosaur Panasonic Plasma 40". Return it if I don't like up until 30 days. Sounds fine.</div><div><br /></div><div>Meanwhile at day 32 I happen to get the latest power bill. MORE THAN DOUBLED!!!! Too late - can't return it.</div><div><br /></div><div>Decide immediate course of action is use power bar on TV and peripherals suspecting phantom power ( let alone regular use of this beast). Decide to order one of the <a href="http://www.theenergydetective.com/ted-5000-overview.html">Energy Detective ( TED 5000-C )</a> devices and look for other ways to reduce power. So popular of course I may have to wait 3-6 weeks before it arrives.</div><div><br /></div><div>Preparing for the worse - may end of selling the plasma to save hundreds of dollars each month.</div><div><br /></div>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com2tag:blogger.com,1999:blog-9213643988731478374.post-53416660260098463832009-08-22T22:52:00.007-04:002009-12-04T23:55:33.392-05:00Patching Office 2000 with SR1I recently needed to install Microsoft Office 2000 fully patched from an old CD I had lying around. After installing the original release, I started down the patch trail, because it looked like the Excel file I was trying to read wasn't going to display properly in the Excel viewer app that M offers.<br />
<br />
After trying the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=AF6C8D03-7633-45B4-AB96-795EE656F2A2&displaylang=en">SR-1 patch from the Microsoft website</a>, it failed with a error in the log of<br />
<br />
<span style="font-size: 85%;"><span style="font-family: courier new;"></span></span><br />
<blockquote><span style="font-size: 85%;"><span style="font-family: courier new;">Starting execution.</span><br />
<span style="font-family: courier new;">Command line: /c /L2</span><br />
<span style="font-family: courier new;">Opening the patch source file, C:\DOCUME~1\plynch\LOCALS~1\Temp\IXP001.TMP\source.ini.</span><br />
<span style="font-family: courier new;">Searching installed products.</span><br />
<span style="font-family: courier new;">Detected the following products for patching:</span><br />
<span style="font-family: courier new;"> Microsoft Office 2000 Premium (9.0.2720), {00000409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is patchable.</span><br />
<span style="font-family: courier new;"> {00010409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00020409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00030409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00100409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00110409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00120409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00130409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00160409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00170409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00180409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00040409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00140409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {004A0409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {00150409-78E1-11D2-B60F-006097C998E7}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;"> {3C5E0FF2-BE09-11D1-998E-00A0C90A43B3}</span><br />
<span style="font-family: courier new;"> Product is not installed.</span><br />
<span style="font-family: courier new;">The following patches are applicable:</span><br />
<span style="font-family: courier new;"> Office 2000 SR-1 Core Update, {0DC0F122-1B1C-11D4-AED6-00C04F022C53}</span><br />
<span style="font-family: courier new;"> Location: http://download.microsoft.com/download/office2000prem/Update/3821h/WIN98/EN-US/data1.msp</span><br />
<span style="font-family: courier new;">The version of IE installed on the computer is 8.0.6001.18702</span><br />
<span style="font-family: courier new;">IE has already been updated to the level of Office 2000 SR-1 or above</span><br />
<span style="font-family: courier new;">Error: The file, C:\DOCUME~1\plynch\LOCALS~1\Temp\sr1patch\{0DC0F122-1B1C-11D4-AED6-00C04F022C53}, has an invalid size.</span><br />
<span style="font-family: courier new;">Beginning download of http://download.microsoft.com/download/office2000prem/Update/3821h/WIN98/EN-US/data1.msp.</span><br />
<span style="font-family: courier new;">Finished downloading http://download.microsoft.com/download/office2000prem/Update/3821h/WIN98/EN-US/data1.msp.</span><br />
<span style="font-family: courier new;">Error: The file, C:\DOCUME~1\plynch\LOCALS~1\Temp\sr1patch\{0DC0F122-1B1C-11D4-AED6-00C04F022C53}, has an invalid size.</span></span><br />
</blockquote>Well that was fun....<br />
<br />
Apparently the fully standalone SR-1 update was no longer available from Microsoft. The office update site just offers the 166k setup installer <span style="color: #3366ff;">o2ksr1a.exe</span> which has to contact the Microsoft website to download the real guts.<br />
<br />
So I had to resort to patching the original office setup files with the administrators patch file. Since I never did that before I thought I would make note of it here:<br />
<br />
<ol><li> Copy the entire administrative share or <a href="http://office.microsoft.com/en-us/ork2000/HA011380221033.aspx">create a new administrative share</a> of the Office installation to a directory ( <span style="font-style: italic;">Example c:/sr1</span> ).</li>
<li>Download the <a href="http://download.microsoft.com/download/office2000pro/Patch/4.71.1015.sr1/WIN98MeXP/EN-US/data1.exe">Data1.exe</a> file found <a href="http://www.microsoft.com/office/orkarchive/2000ddl.htm">here</a>. (<i> Edit: As noted <a href="http://blog.peterlynch.ca/2009/08/patching-office-2000-with-sr1.html?showComment=1258867425290#c8134073386495941658">here</a> use the direct link to Data1.exe because since I wrote this post it no longer appears listed on the download page</i>). Then run the exe and extract the contents to <span style="font-style: italic;">c:/sr1</span></li>
<li> Open a cmd prompt, cd c:/sr1 and type the following to update the original release of office to be sr1 in your administrative share. More info <a href="http://office.microsoft.com/en-us/ork2000/HA011524901033.aspx">here</a>. <span style="color: #666666; font-family: courier new;">C:\sr1>msiexec /p DATA1.MSP /a data1.msi SHORTFILENAMES=TRUE /qb /L* log.log</span></li>
<li>Now run the office setup again and sr1 should get installed.</li>
<li>Continue on with the rest of the updates to office, which can be found <a href="http://www.microsoft.com/office/orkarchive/2000ddl.htm">here</a>.<br />
</li>
</ol>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com17tag:blogger.com,1999:blog-9213643988731478374.post-79971463773005942882009-06-09T16:12:00.003-04:002009-06-10T12:29:17.565-04:00IPhone 3GS is coming June 19I've been strategizing how and when I will get an IPhone ever since I bought one for my wife back in February. Now that the <a href="http://apple.com/iphone">latest hardware</a> is due out June 19, I expect to be taking action soon.<br /><br /><a href="http://rogers.ca/">Rogers</a> seems to be missing any mention of the launch on its homepage. Who ever is in charge of marketing there appears to be missing the boat. <a href="http://www.fido.ca/">Fido</a> at least has one banner ad, although it just points to the apple home page. Curious...and typical Canadian...<br /><br /><a position="1" href="http://www.apple.com/quicktime/qtv/keynote/" title="Watch the Keynote."><img src="http://images.apple.com/home/images/promo-wwdckeynote-20090608.jpg" alt="Watch the Keynote." height="155" width="236" /></a><br /><br />If you haven't checked out the <a href="http://www.apple.com/quicktime/qtv/keynote/">WWDC Keynote</a> mentioning all the latest Apple goodies, I recommend it.<br /><br /><span style="color: rgb(255, 153, 0);">Update<br /><span style="color: rgb(0, 0, 0);">Fido at least now has a <a href="https://www.fido.ca/web/content/faq/iphone_qa09#q1">FAQ</a>. Good news is the prices appear to be the same as the US prices.</span><br /></span>Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-12104912375535375362009-06-07T23:21:00.004-04:002009-06-07T23:52:59.015-04:00Ebooks on the IPhoneMy previous solution to reading documents on the IPod Touch was emailing myself the document as an attachment and opening it up in the email reader on the device. Inspired by the many ebooks offered at Pragmatic Bookshelf, I tried to find a better way today.<br /><br />It seems I have just found a pretty good solution thanks to <a href="http://www.mobileread.com/forums/showthread.php?t=42023">this post</a>. The parts are:<br /><ol><li><a href="http://calibre.kovidgoyal.net/">Calibre </a>-"a complete e-library solution and thus includes library management, format conversion, news feeds to ebook conversion, as well as e-book reader sync features and an integrated e-book viewer."</li><li><a href="http://www.lexcycle.com/">Stanza</a> for IPhone - The most popular IPhone ereader.</li></ol>There are limitations with converting a pdf for example and displaying that on the device. For example, I took an Apple developer library PDF file, converted it to epub format with Calibre and synced it too my touch. Opened it in Stanza and most of the text was missing. The same book opened in Stanza desktop opened and showed words just fine, however lacked the images.<br />I also tried the Stanza desktop app for converting the pdf and syncing it to my device. It couldn't open the PDF file and display it correctly for some reason.<br /><br />I guess converting pdfs is still a fine art. It appears that for books targetted as ebooks, the Stanza reader will work out just fine and Calibre will do its job helping to keep it all organized.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com1tag:blogger.com,1999:blog-9213643988731478374.post-92188542195235346562009-06-07T21:58:00.006-04:002009-06-07T23:14:57.550-04:00Learning Objective-C BeginsSo I've primarily been a Java and Web Application Developer for the past ten years. Seeing how it was always easy to find new technologies/strategies/methodologies to learn in the Java world, I never gave serious thoughts on trying to focus on other languages. I still think I could work in Java for the next 10 years and still not get bored or run out of things to learn.<br /><br />However the realities of my situation have motivated me to at least explore learning Objective-C and developing <span style="font-style: italic;">something</span> for the Apple platforms.<br /><ol><li>I own a very powerful Mac Pro and an IPod Touch. I love them both and don't see me switching to a Windows or any other OS ever again. Aside from my day to day hacking, I seem to be squandering an opportunity to really make use of this hardware at my disposal.</li><li>I am currently not employed. Most likely I have the entire summer to try anything else other than what an employer needs from me.</li></ol>So I've waded into the shallow end and it is not bad at all. First up were the <a href="http://books.pragprog.com/screencasts/v-bdobjc/coding-in-objective-c-2-0">Coding in Objective-C</a> screencasts by <a href="http://bill.dudney.net/roller/objc/">Bill Dudney</a> over at <a href="http://pragprog.com">Pragmatic Bookshelf</a>. Bill does a good job with these and I breezed through without any problem. Next I picked up <a href="http://www.amazon.ca/gp/product/0321566157?ie=UTF8&tag=petlyn-20&linkCode=as2&camp=15121&creative=330641&creativeASIN=0321566157">Programming in Objective-C 2.0</a><img src="http://www.assoc-amazon.ca/e/ir?t=petlyn-20&l=as2&o=15&a=0321566157" alt="" style="border: medium none ! important; margin: 0px ! important;" border="0" height="1" width="1" /> by Stephan Kochan. It's always nice to have a reference like this on hand in hard copy. I've gone through the first couple chapters and the book is showing me exactly what I need to know.<br /><br />First impressions are Objective-C is not that difficult to get started in. I am really impressed with the power of Apple's XCode IDE as well. I regret not making the time to start playing with it sooner. This looks like it is going to be fun.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com0tag:blogger.com,1999:blog-9213643988731478374.post-13164919851850904032009-06-06T02:51:00.006-04:002009-06-06T04:06:20.837-04:00Latest Greatest Google Invention: Google WaveDespite what one may think of Google, I think it is nice that there are companies that can afford to have very smart people dream up new technologies for the rest of us. I took 1h 20m to watch and listen to the <a href="http://wave.google.com/">Google Wave</a> presentation at Google I/O and was glad I did.<br /><br /><object height="295" width="410"><param name="movie" value="http://www.youtube.com/v/v_UyVmITiYQ&hl=en&fs=1&rel=0"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/v_UyVmITiYQ&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="295" width="410"></embed></object><br /><br />I can't help admit the demos were pretty cool. The real time translation at the end was a showstopper. What do you think?Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com1tag:blogger.com,1999:blog-9213643988731478374.post-77959412317552251442009-06-06T02:45:00.003-04:002009-06-06T02:50:39.838-04:00Sorting Account List in ThunderbirdIt has always annoyed me that sorting the account list in the left pane of Thunderbird was not a built in option. I finally broke down and did something about it - I found a great Thunderbird add-on called<a href="http://www.chuonthis.com/extensions/folderpane.php"> Folderpane Tools 0.0.5.1</a> that does just this and now I can put all my old email accounts at the bottom of the list.<br /><br />Problem solved. Thanks to the author.Peter Lynchhttp://www.blogger.com/profile/04046554712717941917noreply@blogger.com2