Adam Howitt's Blog

Sep 27
2007

Adam's Rough Guide to Chicago for MAX attendees

Getting downtown from the Airport
Save your pennies for beer and take the blue line CTA train from O'Hare or the Orange line from Midway towards towards the loop.  At $2 it's far cheaper than your $40 cab ride.  Heck, depending on the time of the day it may be faster too.

McCormick Place - the venue
It's located in the south loop area which isn't exactly central or near the fun.  If you run at all, it is located right on the lake front path so you can head out North along the 17 mile running path over lunch without hitting traffic.

Getting around
The city has hundreds, maybe thousands of cabs but if you want to save some money, the "El" and the bus network can get you all over the city for $2 per trip.  To find your way to a resource below you can use the CTA's tripsweb site.

Touristy Fun Things to do
Rent a Segway for $70 for 2 hours
Chicago River architecture tour 1 hour leaving from Michigan and Wacker
Sears Tower (tallest US building)
Sunset booze cruise
Wrigley Field is at Addison red line el stop.  The Cubs are done until maybe the post season but to visit the neighborhood wait until night and skip to the bars section.
Open top / double decker bus tour of Chicago downtown

Touristy things I'm less fond of
Navy pier.  Long walk. Lots of tourists, lots of cheezy restaurants and a ferris wheel.  Your choice.
Michigan Avenue.  Lots more tourists, lots of shops and a few over-priced restaurants.  See the section on eating if you are hungry.

Restaurants
Brauhaus - 4732 N Lincoln Ave - Located in the old German neighborhood you can swing steins to the sounds of Polka while you enjoy an authentic bratwurst
Signature Room - Michigan Avenue - On the 95th floor of the John Hancock tower you can watch the sun go down and sip martinis to wash down expensive food with an amazing view
Adobo - 1610 N Wells - Best upscale mexican I've ever had.  They prepare Guacamole at the table and I heartily recommend their marguerita with a mescale floater (a smoky taste).  Located in a trendy neighbohood with bars nearby.
Parthenon - 314 S Halsted - Greek restaurant with fantastic authentic food (I was in Greece last year so I feel comfortable making that statement)

Bars
South Loop Club - 1 E Balbo - closest to the south loop hotels and host to a good array of locals, TVs and Old Style.
Mullens - 3527 N Clark St - Foosball and good beer specials.  Close to the Addison red line el stop.
Fado - 100 W Grand - Irish pub in the styling of many others but showing English Premier League games.  
Hopleaf - 5148 N Clark St - Further north but a VAST selection of beers of every style.  Located in a neighborhood called Andersonville which is also home to some great restaurants.  Probably a taxi ride but worth it for the beer.
Blue Frog - 676 N La Salle Drive - Karaoke on Tuesday, Thursday, Friday and Saturday, board games and a tiny bar. Excellent fun.
Bad Dog Tavern - 4535 N Lincoln Ave - Located in Lincoln Square, an old German neighborhood (See brauhaus).  Take the brown line from downtown to Western for $2 or a cab for more like $20

Overall neighborhood notes:
Lincoln Park is home to Chicago's yuppies and plenty of great bars, restaurants and late night dancing if that's your interest.
Wrigleyville is just north of Lincoln Park and home to some of the crazier bars, sports fans and people falling over drunk.
Lincoln Square is a more mature offering (think thirty somethings)
The loop is pretty deserted except for tourists and people attending the theatre after 5pm on weekdays
River North has an upscale feel to all the bars
West Loop has great restaurants and leads into Greek Town - definitely worth a trip
Wicker Park is home to some great music venues and a more "grungey" atmosphere, but slowly become more of a scene
Andersonville is an old Swedish neighborhood and although a little further north it's worth the effort
Rush Street is known as the Vi*gra triangle and is packed with rich men with Harleys trying to pick-up women half their age.  

Sep 26
2007

AdamHowitt.com launched

I know, two launch posts in one month but this one is THE most significant for me in that it marks the launch of my solo career as a consultant.  The beautiful design of Adam Howitt Consulting is the handywork of my former colleague and good buddy Jeff Kenny. He always amazes me when he pulls this stuff together.

The site features

  • Hcard integration on the contact page through technorati's hcard to vcard converter
  • CSS layouts including a print style sheet for the printable scoop
  • Google Analytics with Goal Configuration to track conversions, referers, vcard downloads and page effectiveness

My elevator pitch is that I'm offering website management, not website development.  I feel like the market for web developers is saturated and the price of a truly skilled developer has become commoditized.  Instead I'll be focussing on two separate angles targetted at marketers and developers:

  1. Campaign management - tracking and optimizing both online and offline ad campaigns
  2. Content management - tracking, optimizing and tuning your website content
  3. Traffic management - load testing, application troubleshooting and performance tuning
So if you have a problem, if no one else can help and if you can find him, maybe you can hire the a-team.

Sep 14
2007

Glo-Brite Heavy Duty Section Launched

It's always a big relief to see a client really embrace a CMS and throw resources at it to get the website moving.  Glo-Brite is a client I've been working with for the last year and we launched their site about six months ago.  We stalled for a while but finally got back on track as Paul dedicated a resource to load all his heavy duty truck parts, uploading images, creating page titles and descriptions from their catalog.

The site is driven by my home grown CMS "Ham" (an anagram of my initials).  It is driven by an xml configuration file and includes rollback, file and image uploads and allows you to relate one object class to another.  It runs on MySQL and BlueDragon.  Image uploads are resized using the native java AWT image library.

<cffunction name="scaleImage" access="private" output="false" returntype="boolean" description="Scales an image by a factor or to fit within a max width/max height or both with configurable quality settings">
    <cfargument name="inFile" type="string" required="true">
    <cfargument name="outFile" type="string" required="true">
    <cfargument name="scale" type="numeric" required="false" default="0">
    <cfargument name="intMaxWidth" type="numeric" required="false" default="0">
    <cfargument name="intMaxHeight" type="numeric" required="false" default="0">
    <cfargument name="quality" type="numeric" default="0.30" required="false">
    <cfscript>
        fs = createObject("java","java.io.FileInputStream").init(arguments.inFile);
        jpegCodec=createObject("java","com.sun.image.codec.jpeg.JPEGCodec");
        decoder = jpegCodec.createJPEGDecoder(fs);
        srcImg = decoder.decodeAsBufferedImage();
        fs.close();
        if (arguments.scale neq 0 OR (arguments.intMaxWidth eq 0 AND arguments.intMaxHeight eq 0)) {
            variables.scale = arguments.scale;
        } else {
            w=srcImg.getWidth();
            h=srcImg.getHeight();
            if (arguments.intMaxWidth neq 0 AND arguments.intMaxHeight eq 0) {
                variables.scale = arguments.intMaxWidth / w;
            } else if (arguments.intMaxWidth eq 0 AND arguments.intMaxHeight neq 0) {
                variables.scale = arguments.intMaxHeight / h;
            } else if (h lt w) {
                variables.scale = arguments.intMaxWidth /w;
            } else {
                variables.scale = arguments.intMaxHeight / h;
            }
        }
        </cfscript>
        <cfscript>
        af = createObject("java","java.awt.geom.AffineTransform").getScaleInstance(variables.scale, variables.scale);
        hints = createObject("java","java.util.HashMap").init();
        rh = createObject("java","java.awt.RenderingHints").init(hints);
        transform = createObject("java","java.awt.image.AffineTransformOp").init(af,rh);
        destImg = transform.createCompatibleDestImage(srcImg, srcImg.getColorModel());
        transform.filter(srcImg, destImg);
        out = createObject("java","java.io.FileOutputStream").init(outFile);
        encoder = jpegCodec.createJPEGEncoder(out, jpegCodec.getDefaultJPEGEncodeParam(destImg));
        par = encoder.getDefaultJPEGEncodeParam(destImg);
        par.setQuality(JavaCast("float",arguments.quality), true); // set jpeg quality to 30 percent
        encoder.setJPEGEncodeParam(par);
        encoder.encode(destImg);
        out.close();
        return true;
    </cfscript>

</cffunction>

I'll post a follow up to this to explain how I arrived at this code as this was my first experiment at leveraging Java objects within my applications and once you get it, the process is actually really straightforward.

The site is configured with Google Analytics and we are tracking the goal that clients are submitting the contact form as the way to evaluate the performance of the content on the site and ad campaigns they are going to run.  Some areas are still a little rough but the client was willing to work on a "more content online is better than none while we wait for final sign off on every piece" basis.  There will be a few more design tweaks, plenty of content updates and the car and light duty AJAX driven part browser will be the last piece to launch.

Sep 13
2007

Tracking customers beyond domain boundaries

When a user clicks a link on your site, taking them to a new domain or sub-domain, your Google Analytics reports show an abandonment from the first domain and a referral on the second.  This poses problems if you are trying to track things like a sales funnel because you get artificially high abandonment rates.

You can install the Google script on both domains but because the cookie is tied to the first domain it is recorded as an abandonment for one and a referral for the second site you go to. 

To get around this Google has instructions about tracking domain changes as your customers navigate from one domain to another and back again.

The intent of this approach is for things like third party shopping carts where you may have control over the layout to be able to show your script but the domain name is that of the provider. 

Sep 10
2007

Profitable Online Marketing with Google Analytics

After 9 years of working for other people I've decided to go solo and start my own consulting business.  The site is rudimentary right now as I only handed in my notice today.  As regular readers may be aware, I've evolved from an entry level programmer to a Senior Application Architect in my current role since getting my Masters in Software Engineering and developed an interest in implementing Google technologies.  In my spare time I've been fostering a worldwide smash-hit, WalkJogRun.net, with over 4,000 visitors per day and 100,000 routes worldwide.  I'm addicted to Google Analytics and have a white paper due out under my current employers, Duo Consulting, explaining how to monitor the effectiveness of your marketing campaigns and tune the content on your website.

The last three years at Duo has been a fantastic experience for me giving me the freedom to explore exciting new technologies and all under billable hours because our clients are willing to try new things.  I've load tested and refined the Chicago Park District programs website to support as many as 3,000 transactions in the first 3 minutes of registration every quarter, debugged and load tested third-party ColdFusion CMS tools and built a Cicada Emergence Google Mashup in the last year alone.  I've implemented Google Analytics for many of our clients resulting in important business changing results.  Clients have paused underperforming ad campaigns, monitored the performance of redesign work, reallocated advertising dollars and even redesigned their shopping cart checkout process on the strength of tell-tale numbers through my analysis.

The primary focus of my new business will be helping clients to install Google Analytics, establish their goals for the websites and then monitor the effectiveness of their sites and the advertising campaigns they create.  I'll help them identify areas of their sites underperforming and evaluate their ad campaigns to get the most out of every dollar.  I have colleagues who can help with content development, Duo will be my first referral as far as deeper restructuring work and I can do development work too.  

The secondary focus for my business will be to load test web applications and either help developers benchmark the sites or discover the bottlenecks and resolve them.  I see this as a huge opportunity as the web continues to grow and web applications surpass the lowly traffic expectations they were initially conceived to handle.  In some cases the trouble will be at the database level, sometimes it is the JVM, sometimes it's an innocuous ColdFusion funciton like createUUID that hit the OS behind the scenes and crash JRun every 10 concurrent visitors.  
If you have read any of my posts in the past and value the expertise you have found, or if you have read this description and think you or someone you know would value from this kind of service, please pass on the link or get in touch.  I can be reached by email at adamhowitt@gmail.com or by phone at +1 (312) 714 9229.  Thanks for reading and stay tuned for more of the same tips, tricks and commentary.

Sep 08
2007

How Amazon Saved My Marriage

I moved all my websites from a hosting company in Georgia to hosting them myself after learning Ubuntu nearly two years ago.  Little did I know that the huge P3s with whining fans would take up so much closet space and cause so much trouble.

I'm talking at CFUnited Express on September 30th in Chicago about how Amazon's webservices, specifically S3 and EC2, have enabled me to migrate my applications onto dedicated high end hardware for a low monthly rate.  I'll talk about the benefits, the drawbacks and some of the challenges you will face getting up and running including some tools you may want to use.