2009 Subaru Impreza for Sale

My Beloved Impreza is For Sale

I have to sell my beloved 2009 Subaru Impreza, which is really too bad. See the AutoTrader ad here:

http://www.autotrader.ca/a/Subaru/Impreza/OTTAWA/Ontario/19_7931115_/

 

It has a lot going for it, including:

  • Horizontally-opposed, 4-cylinder, 2.5L, SUBARU BOXER engine with
  • i-Active Valve Lift System
  • 170 horsepower and 170 lb-ft of torque
  • 5-speed manual transmission (5MT) with Hill Holder system or optional 4-speed electronic direct control automatic transmission with SPORTSHIFTTM (4EAT SS)
  • Standard open type rear differential
  • Vehicle Dynamics Control system and Traction Control System
  • Anti-lock Braking System, Electronic Brake-Force Distribution (EBD) and Brake Assist
  • Brakes (front): Ventilated discs (277 x 24 mm), dual piston calipers Brakes (rear): Solid discs (286 x 10 mm), single piston calipers
  • Driver and front passenger front and side-impact airbags; side curtain airbags
  • Height adjustable, anti-whiplash front head restraints Engine immobilizer system and anti-theft security system
  • 16 ̋ steel wheels with wheel covers and Bridgestone Potenza All-Season tires
  • Power adjustable, foldable, heated, body colour door mirrors
  • Body colour door handles
  • AM/FM/CD/MP3/WMA audio system with 4 speakers, Radio Data System, Vehicle Speed Sensitive Volume and SIRIUS® Satellite Radio compatible (dealer accessory required)
  • Auxiliary audio input
  • Air conditioning with air filtration
  • Tilt adjustable steering wheel with integrated cruise controls Soft-grip controls
  • 60/40-split, flat folding rear seats
  • Ebony cloth upholstery

Sad to see it go, but I hope someone enjoys it as much as I have.

 

Automated Releases with Maven and Google App Engine

Google App Engine LogoVersature has been building our applications using Java and deploying them on Google App Engine for some time. It has been a very effective solution for us.

Recently, I wanted to improve our release process by making it more formal and automated. After the usual battle with Maven, I managed to win. :)

Our current build automates the following:

  • Remove the trailing -SNAPSHOT from the version number in the POM
  • Tag the release in Subversion
  • Filter the appengine-web.xml to contain the version number
  • Build and deploy to GAE
  • Increment version number in the POM and add the trailing -SNAPSHOT

All of the above is achieved with two Maven commands: release:prepare and release:perform.

Here is the POM with most of the irrelevant parts removed:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>0-9-0-SNAPSHOT</version>
    <packaging>war</packaging>
 
    <name>Versature Dashboard</name>
 
    <scm>
        <connection>scm:svn:https://REMOVED/trunk</connection>
    </scm>
 
    <repositories>
        <repository>
            <id>google-maven-repo</id>
            <name>Maven Google App Engine Repository</name>
            <url>http://maven-gae-plugin.googlecode.com/svn/repository/</url>
        </repository>
        <repository>
            <id>codehaus</id>
            <name>codehaus</name>
            <url>http://repository.codehaus.org/org/codehaus/groovy/</url>
        </repository>
    </repositories>
 
    <pluginRepositories>
        <pluginRepository>
            <id>maven-gae-plugin-repo</id>
            <name>Maven Google App Engine Repository</name>
            <url>http://maven-gae-plugin.googlecode.com/svn/repository/</url>
        </pluginRepository>
    </pluginRepositories>
 
    <dependencies>
        REMOVED
    </dependencies>
 
    <build>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <outputDirectory>${webappDirectory}/WEB-INF/classes</outputDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
 
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>exploded</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <webResources>
                      <resource>
                        <directory>src/main/webapp</directory>
                        <filtering>true</filtering>
                        <includes>
                          <include>**/appengine-web.xml</include>
                        </includes>
                      </resource>
                    </webResources>
                    <webappDirectory>${webappDirectory}</webappDirectory>
                </configuration>
            </plugin>
 
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>gwt-maven-plugin</artifactId>
                <version>${gwt-plugin.version}</version>
                <configuration>
                    <logLevel>INFO</logLevel>
                    <port>${gae.port}</port>
                    <server>com.google.appengine.tools.development.gwt.AppEngineLauncher</server>
                    <runTarget>/REMOVED</runTarget>
                    <style>OBF</style>
                </configuration>
                <executions>
                    <execution>
                        <configuration>
                            <extraJvmArgs>-Xmx1024m -Xms512m</extraJvmArgs>
                            <module>com.versature.dashboard.Dashboard</module>
                        </configuration>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
 
            <plugin>
                <groupId>net.kindleit</groupId>
                <artifactId>maven-gae-plugin</artifactId>
                <version>0.9.2</version>
                <configuration>
                    <unpackVersion>${gae.version}</unpackVersion>
                    <serverId>appengine.google.com</serverId>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>net.kindleit</groupId>
                        <artifactId>gae-runtime</artifactId>
                        <version>${gae.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
            </plugin>
 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                    <scmCommentPrefix>[RELEASE] </scmCommentPrefix>
                    <goals>gae:deploy</goals>
                </configuration>
            </plugin>
 
            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <version>${gmaven.version}</version>
                <executions>
                    <execution>
                        <id>sources</id>
                        <goals>
                            <goal>generateStubs</goal>
                            <goal>compile</goal>
                            <goal>generateTestStubs</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>properties</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <source>
                                project.properties["gae-application.version"] = project.version.toLowerCase()
                            </source>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
 
    <!-- Specify hard-coded project properties here -->
    <properties>
        <gmaven.version>1.3</gmaven.version>
        <gae.version>1.6.2.1</gae.version>
        <gae.port>9090</gae.port>
 
        <webappDirectory>${project.build.directory}/${project.build.finalName}</webappDirectory>
    </properties>
 
    <profiles>
        <profile>
            <id>release-build</id>
            <activation>
                <property>
                    <name>performRelease</name>
                    <value>true</value>
                </property>
            </activation>
 
            <properties>
                <gwt.style>OBF</gwt.style>
            </properties>
        </profile>
    </profiles>
    <groupId>com.versature.dashboard</groupId>
    <artifactId>dashboard</artifactId>
</project>

If you run into an error similar to this one:

com.google.appengine.tools.admin.AdminException: Unable to update app: Error posting to URL: https://appengine.google.com/api/appversion/create?app_id=versature-dashboardhr&version=0-8-1-SNAPSHOT&
400 Bad Request
Error when loading application configuration:
Unable to assign value '0-8-1-SNAPSHOT' to attribute 'version':
Value '0-8-1-SNAPSHOT' for version does not match expression '^(?!-)[a-z\d-]{1,100}$'

It is because GAE only accepts lowercase letters, digits and hyphens in version names. (Because those version names become URLs.) I solved this by using a snippet of Groovy (Using the GMaven plugin.) code to automatically create a property with all lowercase letters before filtering it into the appengine-web.xml. So version 0-8-0-SNAPSHOT becomes 0-8-0-snapshot:

1
project.properties["gae-application.version"] = project.version.toLowerCase()

And that’s it, it Just Works™. Gotta love Maven!

xkcd: Password Strength

As always, xkcd makes a great point through a comic with “Password Strength”.

Password Strength

Password Strength

I do not know if the point he is making is actually valid, some research will be required.

Update: Ben Rockwood comments on the webcomic with “Password Myths”.

I believe that Mr. Rockwood is correct in his appraisal that we should all start using the term pass phrase.

Google App Engine’s Python Exception Syntax

Remember, Python 2.5 has this exception syntax:

try:
    raise FooException("Darn!")
except FooException, e
    print("Error: %s" % e)
The newer syntax is:
try:
    raise FooException("Darn!")
except FooException as e
    print("Error: %s" % e)
I ran into this when uploading an application to Google App Engine, which then produced this cryptic error:
<type 'exceptions.SyntaxError'>: invalid syntax (main.py, line 64)
Where line 64 is the line containing the not-yet-implemented as keyword.

Mac OS X 10.7 “Lion” Seems to Have a Broken Python easy_install

One of the first things I needed after upgrading to Mac OS X 10.7 (Lion) was to make some Python scripts work. However easy_install seemed to be broken:

$ easy_install psycopg2
Traceback (most recent call last):
  File "/usr/local/bin/easy_install", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 2607, in <module>
    parse_requirements(requires), Environment()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 565, in resolve
    raise DistributionNotFound(req)  # XXX put more info here
pkg_resources.DistributionNotFound: setuptools==0.6c12dev-r88795
I fixed this by installing Distribute and then the new Mac OS X Developer Tools.

 

Rands In Repose: Lost in Translation

As always, Rands has something interesting to say about becoming a manager for the first time:

Your confidence is going to be artificially high. This new job, hobby, or sport is going to appear magically easy. You’re going to feel gifted. Those watching your miraculous aptitude keep saying, “beginner’s luck”, but that’s neither what you’re hearing nor what they’re saying. What you’re hearing them say is, “We are jealous that you are gifted at this thing you totally don’t understand”, but what they’re actually saying is, “We understand it’s intoxicating to instantly feel like an expert and we will most certainly bite our tongues when you painfully discover how much you have to learn.”

via Rands In Repose: Lost in Translation.

Versature is Hiring

I am really proud to be a part of Versature’s terrific growth. This weekend, we made our first acquisition: Octopus IP Communication Ltd‘s phone service business, which is really exciting:

  1. Official press release
  2. Picked up by the Ottawa Business Journal (on the front page!)
  3. VoIP Monitor
  4. TMCnet picked it up as well

We’ve been up to lots of other stuff as well. All in all it means some long days (and nights), but I’m having fun.

Versature Corp

Versature is Hiring

Thought I’d leave a note here that Versature is hiring. Notably, I’m looking for a developer with fresh user interface design ideas:

Versature is looking for a developer with experience designing and building awesome user interfaces for complex problem domains. Visual analytics tools, integration with Google Apps, Mobile Safari support, real-time user interaction are all topics we cover. Knowledge of the Java platform and experience using remote service APIs a must. Send your cover letter to the email address listed in the TXT record of hr.versature.net.

I’m hoping we can leverage the Google Web Toolkit (GWT) for this.

Maha Powerex Batteries and Chargers

Update: Maha has new higher capacity 2400 mAh IMEDION AA batteries available from Paul’s Finest.

I have been quite satisfied ordering batteries and chargers from PSS Enterprises in Montreal.

I use the Maha 2100mAh 4-Pack AA IMEDION Ultra Low Discharge Batteries to power my flashlights, headlamps and GPS units. (PaulsFinest.com Link)

It is quite important to avoid the classic NiMH batteries as they show poor performance in cold temperatures and discharge extremely quickly while sitting in your pack waiting. “Low Discharge” or “LSD” NiMH batteries are a much better investment in my experience.

Re: Light Sources?

I recently received this question by email:

What headlamp and flashlights do you use? I noticed when we were in (…) that your lights were far superior to anything anyone else had.

So here are my current lights and some thoughts on where to go next.

Headlamps

I have two headlamps…

Petzl MYO RXP (Primary)

This is a programmable regulated version of the MYO XP. (I believe it is slightly brighter than the XP.) Although the “programmable” seems pretty useless at first, it allows you to program the lowest setting to be the first click–usually it is the last. Key feature: AA batteries.

Petzl Tikka (Secondary)

This is “secondary” as in I don’t even carry spare batteries (AAA) for it. It really only gets used if I’m needing a reading light while in command. It has a built-in red filter.

Flashlights

I also have two flashlights… both are very bright, the difference is mostly in the colour of the light.

Fenix TK20

This is a very cool looking light that has a very warm yellow light, which apparently is better for finding evidence. It is also very narrow beam, which allows it to throw light extremely far. 2 AA batteries.

EagleTac P10A2

This one has a wider beam and is the classic LED bright white colour.

What Next

Also, if you were going to replace them…is there better out there that you know of?

Petzl has one called ULTRA which is insanely bright but is probably way too expensive and uses a proprietary battery pack.

EagleTac has a new light, the P20A2. It is a touch brighter than the P10A2. According to the website, both the P10A2 and the P20A2 are available with a “Neutral White” LED. You might like that better.

You can usually find these on eBay or elsewhere on the ‘net.

For the next time I have extra money burning a hole in my pocket, I want to get a bigger searchlight, something like the Fenix TK40.

Update: see my other post for how to power these toys.