Wednesday, September 15, 2010

Java application launched from PPC or bad stub

If 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.

The solution is a little less obvious.

$cp /System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub 
 /Applications/<APPNAME>.app/Contents/MacOS


Some nasty log messages from trying to log an install4j based app that suffered this problem

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 

Sunday, June 13, 2010

How to fix the Apple Magic Mouse Jitters

I 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.

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:

  • uninstall USB Overdrive
  • install Apple Magic Mouse drivers
  • change the wireless router channel to avoid possible interference
  • tweak mouse track speed settings using MouseZoom preferences
  • restart, restart, restart....
Finally I decided to try the solution suggested in this thread, using this pdf 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....


Saturday, May 15, 2010

Building Nexus behind Nexus

While building Nexus I got a failure because org.sonatype.spice.inject:guice-plexus:pom:1.1.0-SNAPSHOT was missing.

Like any sane Maven user, I use a local repository manager (Nexus) and I knew I had the Sonatype Forge Repo proxied in my local Nexus install so ... strange I thought.

However searching for the artifact at http://repository.sonatype.org revealed it's direct path was under http://repository.sonatype.org/service/local/repositories/snapshots/content.

After adding a proxy to that repo, I was able to build Nexus no problem. Folks on IRC confirmed this is the way to go when building behind Nexus.

Friday, May 14, 2010

Maven: How to prevent generate-sources phase executing twice

The Problem

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 generate-sources lifecycle phase. This looks like it works great for a while running mvn package ....

When you decide to finally release your project using the maven-release-plugin, 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 generate-sources lifecycle phase is being executed twice.

You predictably do a google search and scan the Maven issues. You find several complaints and reports open that mention a similar problem 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 generate-sources phase are still being executed twice.

Here I attempt to explain what is really going on and provide you a real workaround for it.

History

An old relic of the maven-release-plugin is that in Maven's Super POM there is defined a profile with id of release-profile. It can be activated by the releaseProfile property being set, in this case to true. 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 maven-source-plugin and maven-javadoc-plugin configuration that attaches the jar goals of those plugins to the package phase.

So what this means is that when using the maven-release-plugin or activating the release-profile manually by setting the releaseProfile property, source:jar goal gets called during the build, which will trigger the execution of generate-sources lifecycle phase to run, even if it already did in the same build.

Changing the Maven Super POM to instead call source:jar-no-fork 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.

Until the problem is permanently addressed, here I outline a workaround that prevents the duplicate generate-sources phase from running.

Workaround

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.

  1. First lets reproduce the problem on a sample project. Using the maven-archetype-plugin is the simplest way.
    mvn archetype:generate
    
  2. Next since the problem is that generate-sources phase gets run twice, we need a visual cue when this occurs. A simple solution is attach a message to this phase with the maven-antrun-plugin.

    Add the following to your test project pom.xml:
    <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>
    
  3. 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 performRelease property on the cmd line.

    $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] ------------------------------------------------------------------------
    

    Notice our message gets printed twice, verifying the double execution. So lets proceed to fix the problem.
  4. Make the following additions to your pom.xml.
    1. First we override the super-pom maven-sources-plugin execution with id of attach-sources. This excution is what calls the source:jar goal. The special trick used here binds this execution to a non-existent lifecycle phase of DISABLE_FORKED_LIFECYCLE_MSOURCES-13 - a phase which will never be reached, thus essentially disabling this execution.

      <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>
      
    2. Next, since we would still like releases using the release-profile 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 jar-no-fork goal, which does not trigger the generate-sources phase to be called twice.

      <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>
      
  5. Now we run the same command and verify that our solution worked.
    $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] ------------------------------------------------------------------------
    
    As you can see, our verification message prints only once, yet we still get the sources jar - a good thing!

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.

Update

I'm occasionally asked how to make sure you still get a sources jar for your SNAPSHOT artifacts. Simple!

Just add the following to your normal <build> section of your pom, in addition to all of the above instructions:

  <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>

Saturday, April 3, 2010

Markdown jEdit mode

I was writing a few docs in Markdown syntax. I wanted a Markdown mode file for jEdit. The best I could find was by Ali Rantakari on his blog. 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:

  • better blockquote handling.
  • more intuitive link highlighting
  • better block html handling and general html highlighting

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.

My Markdown mode file is on github.com and was tested using jEdit 4.3.1 .

Hope it helps someone out.

Friday, February 5, 2010

Setting up visual diff and merge for Git on OSX

They are mentions around the web about the best visual diff and merge tools to use for Git on OSX - for example this question on StackOverflow.

However I decided to go with the suggestion inside of Pro Git. The following is a summary of what I did, extracted more or less from the book.

#!/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*

Remember to execute the script using sudo or else you'll get permission denied errors.

Also, to bypass the external diff don't forget you can use
git diff --no-ext-diff
.

Thursday, January 28, 2010

iPad?

I watched Daily Planet yesterday. First report was on the iPad launch. Second report was on a fog screen display.

I was more impressed by the fog screen display.

I didn't watch the keynote. I didn't even really read about it yet.

But I already think the iPad will fail. Apple how could you...

Wednesday, January 27, 2010

How to setup Google Apps SPF record

The Google Apps configuration pages recommend you set up SPF in your DNS but do not tell you what to set it to.

You would think they would just include the directions found here.

"To set your domain's SPF record, publish the following TXT record on the DNS resource: v=spf1 include:aspmx.googlemail.com ~all"

Tuesday, January 26, 2010

Blacklist creation error on boot - Google App Engine for Java | Google Groups

As documented elsewhere, if you see this:


Jan 26, 2010 5:09:32 AM com.google.appengine.tools.development.agent.impl.BlackList initBlackList
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


...then do this


cd /System/Library/Frameworks/JavaVM.framework/Resources/Deploy.bundle/Contents/Home/lib
sudo ln -s plugin.jar plugin2.jar


and all will be well.

Wednesday, January 13, 2010

OSX X11 defaults

Here are some changes to the X11 defaults I made on my Mac OSX.

X11 2.4.0 - 2.4.0 release notes
Close X11 if no other X11 apps are running
defaults write org.x.X11 wm_auto_quit -bool true
defaults write org.x.X11 wm_auto_quit_timeout -int 3


X11 < 2.4.0
Focus Follows mouse when multiple X windows are open. This avoids two clicks to activate a window:
defaults write org.x.X11 wm_ffm true
defaults write org.x.X11 click_through -bool true