ClickOnChris is Web 2.0!
have implemented AJAX style comments system. If you click on the ‘Add Comment’ button below you can see it. The difference is that now you are presented with a comments form appears within the existing page instead of a comments form being on a new page, as was the previous behavior. This is AJAX, and it is the technology that people are calling Web 2.0.
What’s the big deal you ask? By having the ability to only update parts of a web page instead of updating the whole page every time you invoke some function, it makes the browser act more like a desktop application than a web page. The end result is more robust applications served over the web. Think google maps or facebook.

Chris Johnson Highlights
In case you didn’t hear, I was drafted by the Tennessee Titans in the ’08 draft. I wanted to share my college highlight reel with you:
Ok, for anyone who doesn’t know me, I’m not that Chris Johnson; its just a coincidence. I like to think I’m fast, but not that fast.
I am Linked In
I have created a linkedin profile. At first I thought linkedin was going to be a facebook or myspace ripoff, but I see now that it’s really a great tool for professional networking. In fact, given that I’m studying business administration and that I have a passion for web applications, I think that linkedin is pretty awesome.
![]()
www.linkedin.com/in/johnsonchristopherg
Java Project Versioning with perforce+ant
I recently developed a useful ANT task to automatically increment a version number on your Java project when using perforce as your source control application. This task is intended to be run as part of an automated build (via cruisecontrol). It checks out version.properties and checks it back in after incrementing.
Notes:
- The task will look for the following files in the same directory as your build.xml. You should be able to figure out what parameters belong in each file by looking at the task. files: version.properties, buildnumber.properties, p4.properties
- In the lines where I print the full version number I have broken it up into two lines for display purposes. In practice you will want to keep it on one line.
<span style="color: #000080;"><target name="create-label" depends="compile-src">
<copy todir="${ant.library.dir}"
file="medremote_dev/tools/jakarta-oro-2.0.8.jar"
overwrite="false"/>
<property name="p4.properties"
value="p4.local.properties" />
<property file="${p4.properties}" />
<property name="p4.port" value="${p4.port}"/>
<property name="p4.client" value="${p4.client}"/>
<property name="p4.user" value="${p4.user}"/>
<!-- must supply password in globalopts when the perforce server uses sessions -->
<property name="p4.globalopts" value="-P ${p4.password}"/>
<property name="p4.path" value="{p4.path}"/>
<echo>p4.path is ${p4.path}</echo>
<!-- sync buildnumber.properties and version.properties for edit -->
<p4sync view="${p4.path}/source/buildnumber.properties"
force="true"
globalopts="${p4.globalopts}"/>
<p4sync view="${p4.path}/source/version.properties"
force="true"
globalopts="${p4.globalopts}"/>
<!-- increment buildnumber.properties -->
<chmod file="buildnumber.properties" perm="ugo+w"/>
<attrib file="buildnumber.properties" readonly="false"/>
<buildnumber file="buildnumber.properties"/>
<tstamp/>
<!-- Updates the version.properties file -->
<property prefix="label" file="version.properties"/>
<property name="new.version.major" value="${label.version.major}"/>
<property name="new.version.minor" value="${label.version.minor}"/>
<property name="new.version.iteration" value="${label.version.iteration}"/>
<property name="new.version.build" value="${build.number}"/>
<property name="new.version.drop" value="${label.version.drop}"/>
<!-- update version.properties -->
<chmod file="version.properties" perm="ugo+w"/>
<attrib file="version.properties" readonly="false"/>
<propertyfile file="version.properties">
<entry key="version.major" value="${new.version.major}"/>
<entry key="version.minor" value="${new.version.minor}"/>
<entry key="version.iteration" value="${new.version.iteration}"/>
<entry key="version.drop" value="${new.version.drop}"/>
<entry key="version.build" value="${new.version.build}"/>
<entry key="version.date" value="${DSTAMP}${TSTAMP}"/>
</propertyfile>
<echo>Creating Label: ${new.version.major}.${new.version.minor}.
${new.version.iteration}.${new.version.build}"</echo>
<p4change description="Increment build number via automatic build"
globalopts="${p4.globalopts}"/>
<!-- open buildnumber.properties and version.properties for edit
(even though we already incremented it)-->
<p4edit view="${p4.path}/source/buildnumber.properties"
change="${p4.change}"
globalopts="${p4.globalopts}"/>
<p4edit view="${p4.path}/source/version.properties"
change="${p4.change}"
globalopts="${p4.globalopts}"/>
<!-- submit properties files to source control after incrementing build -->
<p4submit change="${p4.change}"
globalopts="${p4.globalopts}"/>
<!-- label the project -->
<p4label
name="FX${new.version.major}.${new.version.minor}.
${new.version.iteration}.${new.version.build}"
desc="label created during automatic project build"
view="${p4.path}/..."
globalopts="${p4.globalopts}"/>
</target></span>
Class Project Collaboration with a Wiki
In the Operations Management course I just finished, a group project accounted for a third of the grade. My group was given the topic “Toyota Production System / Lean Manufacturing”. I suggested to the group that we use a Wiki to collaborate on the project.
I installed MediaWiki (the same one used by Wikipedia) on my site and off we were. The wiki did not necessarily determine the outcome of the project(which was a success), but it certainly helped streamline the process. In fact, I think I found a new application for Lean principals – Lean Group Project Collaboration!
You can find the results here: OMIS505 Group Project Wiki
Upsides of Wiki Collaboration
-mobile, accessible repository for keeping research (links and notes)
-gives you the ability to instantly see the latest version of your project (or the outline in our case)
-you can review what changes were made when and by whom, which introduces some accountability into the project
Downsides of Wiki Collaboration
-no mechanism for uploading files (like a powerpoint presentation)
In case you are interested, the final version of our powerpoint is available here:
Group Project Presentation (5MB)
Words of a Hawaiian King
Implementing reCaptcha in Your Rails Application
Recently I started noticing a lot of spam posts on my website. It must be those internet hacker bots! I wondered if I could put one of those fancy image verification things into my site to stave them off. They’re called ‘captchas’ and it turns out that its simple and easy to implement such a thing in Ruby on Rails using the reCaptcha plugin. Here are the instructions I wish I had when I started:
- install the reCaptcha gem. I’m using Aptana/RadRails IDE which has a nice interface to install gems, but I hear you can install it via the command line with something like ‘gem install reCaptcha’
- Register for public and private keys at recaptcha.net .This is also a good tutorial of how a captchas and reCaptcha works. You will have to add your public and private keys to your config/environment.rb file.
- insert the reCaptcha function calls into your code:
recaptcha_tags() – put this into your®html form to generate the challenge image.
verify_recaptcha() – when inserted into the controller, checks the data passed from the form to make sure that the correct ‘answer’ was given. returns boolean
Thats it! Add a comment to test it out!
Are You Ready For Some Football?! (Because I am!)
Training Camps are finished. Madden has been released. Exhibition games are done. Fantasy Drafts have closed…
The NFL season is upon us. The action kicks off in just two days and I CAN’T WAIT!
Go Bears
Web host switch
have switched web hosts as of today from Axishost to Dreamhost. Axishost was very good, but their spamassasin has been broken for about a month and I couldn’t take it anymore!
I’ve also lowered my yearly hosting costs from $72 to $23(Dreamhost promo code: DOIT). We shall see how Dreamhost measures up.
Update: The switch went pretty smooth, although this was the most complicated one yet due to the fact that I’m using Ruby on Rails and running a photo gallery. The procedure was basically:
- Copy Data
- spoof new DNS by modifying ‘hosts’ file. This was required to access phpmysql and to test out the site.
- Export/Import Mysql databases.
- redeploy website.
I can tell the difference with Dreamhost using fastCGI. The site usually loads a lot faster. My only complaint so far is that Dreamhosts spam filtering solution isn’t as good as axishosts. Supposedly I can install a better one but I haven’t gotten around to it yet.
Slate Floor Installation
Dayna and I just finished installing Slate flooring in our Kitchen.
You can see the rest of the pictures in the photo gallery

