<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>CoovTech</title>
 <link href="http://coovtech.com/feed/" rel="self"/>
 <link href="http://coovtech.com/"/>
 <updated>2016-06-24T01:31:55+00:00</updated>
 <id>http://coovtech.com/</id>
 <author>
   <name>Billy Coover</name>
   <email>billycoover@gmail.com</email>
 </author>

 
 <entry>
   <title>Queue Visibility</title>
   
     <link href="http://coovtech.com/posts/queue-visibility/" />
   
   <updated>2013-11-19T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/queue-visibility</id>
   <content type="html">&lt;p&gt;Nearby Now has been using &lt;a href=&quot;http://sidekiq.org/&quot;&gt;SideKiq&lt;/a&gt; for 120 days now in
production. That’s odd, we are a .NET shop…&lt;/p&gt;

&lt;h2 id=&quot;sql-queuing&quot;&gt;SQL Queuing&lt;/h2&gt;
&lt;p&gt;Up until around 120 days ago, we were using SQL Server Message Broker. SSMB is appealing because it enables you to send asynchronous messages directly from your database code. You can target your own database, another db on the same server, or a remote server. There’s a ton of features around transactions, locking, and security.&lt;/p&gt;

&lt;p&gt;If you’ve never used it or seen in action I’d describe it as powerful, robust, and very complicated. Complicated to setup, complicated to maintain, complicated to change.&lt;/p&gt;

&lt;p&gt;My two biggest problems with it has been the lack of tooling and monitoring, and cost. SSMB does not come with a turn-key monitoring solution or simple interface for creating new queues and messages. SSMB does not completely leave us in the dark. Everything in the message broker is queryable; we’ve rolled our own web interface to give us real-time stats.&lt;/p&gt;

&lt;p&gt;The cost can be prohibitive if you want to run it on AWS; we’d be forced to run SQL Standard as Service Broker messaging is not available for the web version.&lt;/p&gt;

&lt;p&gt;Also, I’ve struggled trying to come up with an efficient automated testing solution.&lt;/p&gt;

&lt;h2 id=&quot;sidekiq&quot;&gt;SideKiq&lt;/h2&gt;
&lt;p&gt;While working at &lt;a href=&quot;www.preact.io&quot;&gt;Preact&lt;/a&gt; I got my first exposure to SideKiq and fell in love with it immediately.&lt;/p&gt;

&lt;p&gt;SideKiq is powerful in a much different way than SSMB. As a small company we are always trying to find the most cost effective solutions as well as the most efficient use of our precious programming time. With SideKiq you build ruby scripts called Workers that accept simple messages (usually database object ids), then “queue” them asynchronously.&lt;/p&gt;

&lt;p&gt;SideKiq uses multithreading so it can process on ton of message and is memory efficient. You have to really think multithreading through. Over in the service broker land, we get locking on conversation groups until the transaction commits. Taking messaging outside of the database means you have to take the lack of locking into consideration when designing your solution.&lt;/p&gt;

&lt;h2 id=&quot;talking-to-sidekiq-from-sql-server&quot;&gt;Talking to SideKiq from SQL Server&lt;/h2&gt;
&lt;p&gt;Pushing our messages from the Service Broker over to SideKiq is actually simple. We’ve been building SQL CLR’s for years and one of the generic CLR’s we have let’s you make an external web request with a payload.&lt;/p&gt;

&lt;p&gt;So we setup a simple Sinatra app that acts as proxy between our SideKiq queue and the outside world. When we want to queue something, we just call our sp_external_post proc, which makes an encrypted HTTP POST to our proxy server, with a small non-data sensitive payload that includes worker instructions.&lt;/p&gt;

&lt;p&gt;The Workers do various things. They can hit our database with a query, call our API server, talk to another external service like Twilio or Stripe, etc. The point is that we can do almost anything with it.&lt;/p&gt;

&lt;p&gt;SideKiq comes with a slick real-time monitoring app built-in as well as a robust api that you can use if you want to hook it up to some type of dashboard like DucksBoard.&lt;/p&gt;

&lt;p&gt;It’s dirt cheap to run SideKiq.&lt;/p&gt;

&lt;h2 id=&quot;plan-to-fail-over&quot;&gt;Plan to fail over&lt;/h2&gt;
&lt;p&gt;SideKiq has been stable but servers will be servers so I wanted to make sure we had a backup plan. The worst case scenario for us is a queue that stops accepting new messages.&lt;/p&gt;

&lt;p&gt;To give us an alternative queue solution, I built the SQL CLR that posts external queue messages in a way that uses a common json payload format that allows us to utilize both SideKiq and &lt;a href=&quot;http://www.iron.io/&quot;&gt;IronMQ&lt;/a&gt;. IronMQ has some redundancy features that turn it into about 4 additional external queue options for us. Our SideKiq Sinatra app understands the same json structure so the two are capable of processing the same types of payloads.&lt;/p&gt;

&lt;p&gt;Our database has a table of external queue endpoints and a master control table that tells all calling programs which queue is active, as well as how to fail over. Any server that utilizes our queues gets this same information.&lt;/p&gt;

&lt;p&gt;This new setup gives us the added benefit that we can now queue things from outside of the database. We have mobile apps out in the wild that are constantly hitting our API server. We leverage SideKiq/IronMQ to queue things up that might be a little slow and return fast so that our mobile apps stay snappy. This is a huge improvement in performance from where our mobile apps where a year ago.&lt;/p&gt;

&lt;p&gt;I added a little extra monitoring around our setup. In addition to real-time alerts when things go wrong with all the various parts of the system, I built an iOS app that lets us see the status of our queues and switch the queue providers in real-time. In the rare occasion that our SideKiq queue seems to be running slower than normal, I can quickly send the workload to another provider and then dig in to find whats wrong.&lt;/p&gt;

&lt;p&gt;As we continue to grow, this solution will probably have to change. It works really well for us today and it’s been an order of magnitude easier for us to maintain and trouble shoot. Much easier than SSMB. Also, we’ve now positioned ourselves to move our SQL Database to AWS on SQL Web rather than SQL Standard. A huge cost savings for us.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Stripe Gross Volume with d3.js</title>
   
     <link href="http://coovtech.com/posts/stripe-d3/" />
   
   <updated>2013-02-14T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/stripe-d3</id>
   <content type="html">&lt;p&gt;Over the past two weeks I’ve been working with a data-driven visualization library called &lt;a href=&quot;http://d3js.org/&quot;&gt;D3.js&lt;/a&gt;.
My primary goal was to get familiar with SVG, and to discover new ways to visually represent data in a useful way.&lt;/p&gt;

&lt;p&gt;While I was building visualizations for &lt;a href=&quot;http://www.lessneglect.com&quot;&gt;Less Neglect&lt;/a&gt; I remembered reading that the &lt;a href=&quot;http://www.stripe.com&quot;&gt;Stripe&lt;/a&gt;
graphs, while custom made by Stripe, were built on top of the &lt;a href=&quot;http://raphaeljs.com/&quot;&gt;Raphaël&lt;/a&gt; Javascript library because it makes working with SVG easier.
So I figured I’d give it give it a spin with d3 because, you guessed it, it makes working with SVG easier.&lt;/p&gt;

&lt;h2 id=&quot;the-data&quot;&gt;The Data&lt;/h2&gt;

&lt;p&gt;Stripe has an internal API for fetching aggregate data for the purpose of building the charts you see on the dashboard. Please, before you read any more, hop on to their &lt;a href=&quot;https://support.stripe.com/&quot;&gt;support forum&lt;/a&gt; and request that they make that API public. There is so much more awesome that can be built if we had access to that API. Specifically, I really want access to that API endpoint so that I can build a nice real-time dashboard inside of &lt;a href=&quot;http://www.pay-pad.com&quot;&gt;Pay Pad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The backbone of D3 is its datasource. You can see &lt;a href=&quot;https://github.com/mbostock/d3/wiki/Gallery&quot;&gt;tons of examples&lt;/a&gt; on the d3 page on GitHub. &lt;a href=&quot;http://bost.ocks.org/mike/&quot;&gt;Mike Bostock&lt;/a&gt; has created a &lt;a href=&quot;http://bl.ocks.org/&quot;&gt;nifty tool&lt;/a&gt; that allows you to view d3 code snippets hosted in Gist’s, on the bl.ocks.org site. It has great support for supplying external data sources like .tsv files that are embedded directly into a gist. For my example, I’m just hard-coding a datasource.&lt;/p&gt;

&lt;p&gt;Here’s an example dataset for the month of January:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;var data = [
  {&quot;end_time&quot;:&quot;2013-01-01&quot;,&quot;value&quot;:25.00},
  {&quot;end_time&quot;:&quot;2013-01-02&quot;,&quot;value&quot;:0.00},
  {&quot;end_time&quot;:&quot;2013-01-03&quot;,&quot;value&quot;:25.00},
  {&quot;end_time&quot;:&quot;2013-01-04&quot;,&quot;value&quot;:159.00},
  ...
  {&quot;end_time&quot;:&quot;2013-01-31&quot;,&quot;value&quot;:0.00}
]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here’s the working recreation of the Stripe Gross Volume area-chart:&lt;/p&gt;

&lt;iframe style=&quot;width: 100%; height: 300px&quot; src=&quot;http://jsfiddle.net/azcoov/V4qEX/1/embedded/result,js/&quot; allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Here’s the actual Stripe chart based on the same data:
&lt;img src=&quot;http://f.cl.ly/items/3J031R223h3L1r1r2P44/Screen%20Shot%202013-02-14%20at%209.18.27%20PM.png&quot; alt=&quot;Stripe Gross Volume&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;room-for-improvement&quot;&gt;Room for improvement&lt;/h2&gt;

&lt;p&gt;To make this better, we could add some &lt;a href=&quot;http://onehackoranother.com/projects/jquery/tipsy/&quot;&gt;Tipsy’s&lt;/a&gt; to the circle’s that would display the value of each circle as you hover over them. Another alternative to binding the tipsy to the circle’s is to draw a transparent bar-chart on top of the area-chart, then bind the tipsy to the rect’s created by the bar-chart. This lets you hover anywhere on the chart, not just on a circle, to reveal the underlying value.&lt;/p&gt;

&lt;h2 id=&quot;give-d3-a-spin&quot;&gt;Give d3 a spin&lt;/h2&gt;

&lt;p&gt;Kudos to Mike and everyone else that has &lt;a href=&quot;https://github.com/mbostock/d3/wiki/Gallery&quot;&gt;contributed examples&lt;/a&gt;. It significantly reduced the learning curve and I was able to knock out some really interesting charts in no time at all.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Joining Less Neglect</title>
   
     <link href="http://coovtech.com/posts/joining-less-neglect/" />
   
   <updated>2013-01-27T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/joining-less-neglect</id>
   <content type="html">&lt;p&gt;It’s official, I’m now part of the &lt;a href=&quot;http://www.lessneglect.com&quot;&gt;Less Neglect&lt;/a&gt; team.
This marks the first job I got over a tweet. I’ve actually been part of the Less Neglect
team for a while but Monday starts my official first “full-time” day.&lt;/p&gt;

&lt;p&gt;I really like they way we came together. A conversation over Twitter, a couple of small contracts, and drinks with
&lt;a href=&quot;http://watilo.com/&quot;&gt;Cory&lt;/a&gt; (one of the two co-founders) while on vacation with my family in San Diego.
When we first casually talked about me joining the team, I was nervous about jumping back into normal employment
again. However, there is nothing normal about Less Neglect, or any startup for that matter. I dated Less Neglect
for a while (contracting) and truly believe in their mission; it made sense to join the team and I’m
really excited about what we are building.&lt;/p&gt;

&lt;p&gt;I’ll be working remote here in sunny Mesa, Arizona but I’ll be traveling to Santa Monica every couple of weeks.&lt;/p&gt;

&lt;h3 id=&quot;a-career-change-sort-of&quot;&gt;A Career Change, Sort of…&lt;/h3&gt;

&lt;p&gt;One thing I’m really excited about is that I’ll be able to continue my mission of being programming language agnostic.
I love C# and .NET; that’s where my career started. However there are so many new and exciting things out there that
I’d never know about had I continued down my .NET career path. I look at a programming language as a tool to do a job and no two
jobs are the same so having multiple tools to do various types of jobs makes a lot of sense. Sure you could
specialize in something but I get bored by that. I’m a Do’er; don’t really care how, and never want to be limited
by a programing language or framework.&lt;/p&gt;

&lt;p&gt;Over the last month I’ve worked with Rails, RSpec, MongoDB, Redis, Web Sockets,
Angular.js, Node.js, Python, PHP, Objective-C, C#, SQL Server, PostgreSQL, JavaScript, JQuery, Mocha, Sinon.js,
Jasmine, SVG, D3.js, Lua and a couple more that I’m probably missing. I have experience in some of these but it has been
awesome to bounce around these various tools because your job needs you to. It’s also nice to venture out beyond the
Windows box.&lt;/p&gt;

&lt;h2 id=&quot;the-future-of-pay-pad&quot;&gt;The Future of Pay Pad&lt;/h2&gt;

&lt;p&gt;So what about &lt;a href=&quot;http://www.pay-pad.com&quot;&gt;Pay Pad&lt;/a&gt; for &lt;a href=&quot;http://www.pay-pad.com&quot;&gt;Stripe&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Ever had a baby? I’ve had 3 and Pay Pad is my 4th.
Since August of 2012, I’ve watched Pad Pad grow to be an awesome app with almost 1,000 users. When I first
built Pay Pad, I figured I’d be lucky with 50 or so downloads. I’m humbled by how well Pay Pad has done.&lt;/p&gt;

&lt;p&gt;I’ll continue to add new features, like I have been. Pay Pad users have been really kind and have thrown great
suggestions my way. I have plenty to work on between keeping up with Stripe’s new features, and adding new useful
features that people want. Things like multi-account support and [redacted] are coming soon so keep an eye out.&lt;/p&gt;

&lt;h2 id=&quot;nearby-nowsidebox&quot;&gt;Nearby Now/SideBox&lt;/h2&gt;

&lt;p&gt;Both still exist and are alive and well. Every week, we keep adding new customers. The product is amazing. It’s proven
 to help businesses. The customers that are on it, love it. It generates revenue. Google should buy it from us!&lt;/p&gt;

&lt;h2 id=&quot;keep-in-touch&quot;&gt;Keep in Touch&lt;/h2&gt;

&lt;p&gt;I’m still around. My home office is &lt;a href=&quot;http://goo.gl/maps/74GYN&quot;&gt;here&lt;/a&gt;. I say silly things &lt;a href=&quot;http://www.twitter.com/billycoover&quot;&gt;here&lt;/a&gt;,
and you can email me any time.&lt;/p&gt;

&lt;p&gt;Psst..&lt;/p&gt;

&lt;p&gt;Not sure what Less Neglect is? I’ve written about it plenty. Said simply, Less Neglect is the
customer analytics platform that you wish you had the time and money to build yourself.
It’s addicting to watch your customer data in real-time and see how users are
navigating inside of your app. The possibilities are endless. You are going to be able to provide customer service
that your competition cannot. You need this.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Make your favorite web API cross platform</title>
   
     <link href="http://coovtech.com/posts/webscript-lessneglect/" />
   
   <updated>2012-11-21T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/webscript-lessneglect</id>
   <content type="html">&lt;p&gt;I’ve built many applications that require a server, a database, and deployments, just to pass a few bits of data around. Also, when I want to integrate with API’s like &lt;a href=&quot;http://www.twilio.com&quot;&gt;Twilio&lt;/a&gt; and &lt;a href=&quot;http://www.stripe.com&quot;&gt;Stripe&lt;/a&gt;, I have to pull down gems, and nugets, and libraries, and their dependencies, oh my. It’s completely overkill if you ask me; there has to be an easier way…&lt;/p&gt;

&lt;h2 id=&quot;turn-that-api-into-a-cross-platform-endpoint&quot;&gt;Turn that API into a cross-platform endpoint&lt;/h2&gt;

&lt;p&gt;I’m going to dig into the &lt;a href=&quot;http://www.lessneglect.com&quot;&gt;Less Neglect&lt;/a&gt; API a little because it’s my favorite right now. We could all do customer service better and that’s what these guys aim to do so I’ve been integrating my apps with Less Neglect one-by-one.&lt;/p&gt;

&lt;h3 id=&quot;why-less-neglect&quot;&gt;Why Less Neglect?&lt;/h3&gt;

&lt;p&gt;Let’s say that you’ve built an iOS or Android app. This app communicates with your backend server to grab a few small bits of data. Perhaps you also use &lt;a href=&quot;http://www.testflightapp.com&quot;&gt;Test Flight&lt;/a&gt; to capture a user passing a checkpoint, or the user encountering an error. Perhaps you also send data back to your own server when the user changes something, like updating their profile. That’s great, but what do you do with that information? Do you have a relationship between the user saving their profile information, and the various checkpoints that lead up to it? Is support integrated? If so, how integrated?&lt;/p&gt;

&lt;p&gt;What if you need to communicate with that user? What if there is an actionable trend on that users recent behavior? What kind of insight do you have about that customer other than a link to their Twitter feed and past tickets they may have entered? You probably use &lt;a href=&quot;http://www.zendesk.com&quot;&gt;Zendesk&lt;/a&gt;, or a similar service, but help desk ticket systems are great for reactive support, not proactive support…&lt;/p&gt;

&lt;p&gt;Less Neglect focuses on enabling you to build more context around your customers and how they are interacting with your product or service. A good example how they make your customer service better is their Stripe integration. How do you track failed payments now? Does your current helpdesk solution do this for you? I bet you had to roll your own or pay a contractor like me a bunch of money to deliver a custom solution because you didn’t know there was a service that makes this super simple. If you are using Stripe, you connect your Stripe account to your Less Neglect account and BOOM, instant proactive alerts and prioritization of your customers. Now you can reach out to that customer early and proactively get to the bottom of the failed payment. You know you want this insight but you don’t have the time or budget to integrate this type of analysis. Well, Less Neglect built their product for you. Go &lt;a href=&quot;http://www.lessneglect.com&quot;&gt;sign up&lt;/a&gt;!&lt;/p&gt;

&lt;h3 id=&quot;ok-enough-less-neglect-pitch-lets-talk-integration&quot;&gt;Ok, enough Less Neglect pitch, lets talk integration.&lt;/h3&gt;

&lt;p&gt;For Less Neglect, there is already an iOS library that makes integration simple. But what if you have apps for iOS, Android, Windows Phone, and Blackberry? What if you also have web apps for your product and they all work together? So you have to pull down the Less Neglect iOS library, Ruby gem, the C# library, and hope someone gets cracking on the libraries for Blackberry and Android that don’t exist yet so that you can &lt;strong&gt;Less Neglect all the things&lt;/strong&gt;. That’s a lot of libraries to maintain and that’s overkill for such a simple thing we are trying to do!&lt;/p&gt;

&lt;p&gt;What if you could consolidate all of these libraries into a single web request that was cross platform and reqired no gems, or libs, or nugets, or anything? I know what you are thinking… “I’ll just build a rails app that integrates with Less Neglect and acts like the API for all my other apps. This gives me a single URI for all my entities.” Well, you are right! But what if you could have this consolidated web API without ever having to deploy and maintain a server?&lt;/p&gt;

&lt;h2 id=&quot;now-weres-talking&quot;&gt;Now Were’s Talking!&lt;/h2&gt;

&lt;p&gt;Enter &lt;a href=&quot;http://www.webscript.io&quot;&gt;Webscript.io&lt;/a&gt;. I talked about doing push notifications with Webscript &lt;a href=&quot;http://coovtech.com/posts/push-with-web-script/&quot;&gt;four days ago&lt;/a&gt; (yes, I’m obsessed). Now that I’ve had more time to kick the tires I’m really beginning to appreciate the power this service provides.&lt;/p&gt;

&lt;p&gt;The best part of Webscript.io, in my opinion, is their &lt;a href=&quot;https://www.webscript.io/documentation#modules&quot;&gt;modules&lt;/a&gt; feature that lets you build reusable Lua scripts that are hosted on GitHub. Since making Outbound HTTP requests with a webscript is super simple, I decided to &lt;a href=&quot;https://github.com/azcoov/webscript-lessneglect&quot;&gt;make a module&lt;/a&gt; specifically for Less Neglect. Here’s what the webscript.io module looks like:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;local HOST = &#39;https://lessneglect.com/api/v2/%s&#39;
local log_event = function (PROJECT_CODE, PROJECT_SECRET, name, email, event)
    local event = {
        [&#39;person[name]&#39;] = name,
        [&#39;person[email]&#39;] = email,
        [&#39;event[name]&#39;] = event,
        [&#39;event[klass]&#39;] = &#39;actionevent&#39;
    }
    return  http.request({
        method = &quot;post&quot;,
        url = string.format(HOST, &#39;events&#39;),
        auth = {PROJECT_CODE, PROJECT_SECRET},
        data = event
    })
end
return { log_event = log_event }
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now you can include this module in any webscript by simply requiring it. So back to our apps… Our iOS, Android, Blackberry, Windows Phone, and web app all provide the user with the ability to update their profile. So I created a webscript specifically for that purpose. Here’s what that looks like:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;local ln = require(&#39;azcoov/webscript-lessneglect/ln.lua&#39;)
local PROJECT_CODE = &#39;less neglect project code&#39;
local PROJECT_SECRET = &#39;less neglect project secret&#39;
ln.log_event(PROJECT_CODE, PROJECT_SECRET, request.form.email, request.form.name, request.form.action);
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So now, when I want to capture the user updating their profile form all the various apps I have, I have a single URI endpoint to hit with an HTTP POST, rather than many different gems and libraries and whatever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No dependencies&lt;/strong&gt; to keep track of. &lt;strong&gt;No changing versions&lt;/strong&gt; because I control the endpoint. &lt;strong&gt;No deploying code&lt;/strong&gt;. &lt;strong&gt;No downtime&lt;/strong&gt;. In the example above, the credentials to Less Neglect don’t reside in my various apps but rather in the webscript that I maintain (Yes, you can secure your webscript). If I need to make a change, I only have a single place to make it and all my apps are instantly using the new change.&lt;/p&gt;

&lt;p&gt;So there you go!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;disclaimer: No animals were harmed in the making of this blog post, but a few dynos were killed while I freed myself from unnecessary servers.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Server-less Stripe push notifications with webscript.io</title>
   
     <link href="http://coovtech.com/posts/push-with-web-script/" />
   
   <updated>2012-11-17T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/push-with-web-script</id>
   <content type="html">&lt;p&gt;If you haven’t heard of &lt;a href=&quot;http://webscript.io&quot;&gt;webscript.io&lt;/a&gt; yet, it’s an interesting new service that lets you write &lt;a href=&quot;http://www.lua.org/about.html&quot;&gt;Lua&lt;/a&gt; scripts that respond web requests, and you gives you a URL endpoint to execute the script.&lt;/p&gt;

&lt;p&gt;I recently launched iOS push notifications for &lt;a href=&quot;http://www.pay-pad.com&quot;&gt;Pay Pad for Stripe&lt;/a&gt;. To do that, I had to spin up a new rails on app Heroku that processes &lt;a href=&quot;http://www.stripe.com&quot;&gt;Stripe&lt;/a&gt; Webhooks. Not that big of a deal because Heroku deployment is really simple. However, running a full-blown rails app on Heroku feels like over-kill when all I’m really doing is acting as proxy between Stripe and &lt;a href=&quot;http://urbanairship.com/&quot;&gt;UrbanAirship&lt;/a&gt;. Sure you could make a sinatra app, or whatever thin app you favor, but still, you are going to &lt;code class=&quot;highlighter-rouge&quot;&gt;git push heroku master&lt;/code&gt; every time you want to make a change.&lt;/p&gt;

&lt;p&gt;After watching the intro video on &lt;a href=&quot;http://webscript.io&quot;&gt;webscript.io&lt;/a&gt; I realized a webscript could do everything I needed to push notifications from Stripe webhooks. So lets build it shall we?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(This assumes that you already have a &lt;a href=&quot;http://www.stripe.com&quot;&gt;Stripe&lt;/a&gt; account and an &lt;a href=&quot;http://urbanairship.com/&quot;&gt;UrbanAirship&lt;/a&gt; account, and that you know how to setup iOS APN’s (&lt;a href=&quot;http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html&quot;&gt;Apple Push Notifications&lt;/a&gt;) in Objective-C)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-push-notification-script&quot;&gt;The Push Notification Script&lt;/h2&gt;
&lt;p&gt;I think you’ll be blown away by how simple this script is.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4101151.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;Ok so here’s what this code does. First, it parses the incoming Stripe webhook. It then takes the event id from the webhook and calls back to the Stripe events API to get the full event details. This is a best practice for processing Stripe webhooks. Next, we parse the response from Stripe and specifically look for the &lt;code class=&quot;highlighter-rouge&quot;&gt;charge.succeeded&lt;/code&gt; event in the response body. Next we build a Lua table called &lt;code class=&quot;highlighter-rouge&quot;&gt;payload&lt;/code&gt; that represents the parameters we are going to POST to UrbanSirship &lt;a href=&quot;https://docs.urbanairship.com/display/DOCS/Server:+iOS+Push+API&quot;&gt;iOS Push API&lt;/a&gt;. For the alert, we are going to push a friendly message with the amount of the charge. Finally we convert our &lt;code class=&quot;highlighter-rouge&quot;&gt;payload&lt;/code&gt; table to a JSON-encoded string and POST it to UrbanAirship.&lt;/p&gt;

&lt;p&gt;Once you have the script ready, you can point your Stripe app to your webscript.io url endpoint which look like this: &lt;code class=&quot;highlighter-rouge&quot;&gt;http://demo-{code}.webscript.io/{script-name}&lt;/code&gt;. When you are ready, create some charge.succedded transactions on your Stripe test account and poof, you’ve got push notifications!&lt;/p&gt;

&lt;h2 id=&quot;gotchas&quot;&gt;Gotchas&lt;/h2&gt;
&lt;p&gt;One of the things that I struggled with was setting the header Content-Type to application/json, which is required by UrbanAirship. It took me a while to realize that the format needed to be passed into the headers table as &lt;code class=&quot;highlighter-rouge&quot;&gt;[&#39;Content-Type&#39;]&lt;/code&gt;. I tried &lt;code class=&quot;highlighter-rouge&quot;&gt;Content-Type&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;content_type&lt;/code&gt;, and &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;Content-Type&quot;&lt;/code&gt; before I figured it out. The Content-Type is set to application/x-www-form-urlencoded by default.&lt;/p&gt;

&lt;h2 id=&quot;is-this-production-ready&quot;&gt;Is this production ready?&lt;/h2&gt;
&lt;p&gt;Surprisingly, I’d say yes, though with a guarded tone. I’ve done zero due diligence regarding security or scalibility for webscript.io, but I trust &lt;a href=&quot;https://twitter.com/smarx&quot;&gt;Steve Marx&lt;/a&gt;, so there you go!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;
&lt;em&gt;Please note that in this above Stripe example, it is assumed that the Stripe event is coming from your account. This was done for brevity. If your users connect to your app via Stripe connect, and you want to process their webhooks, you either need to skip the call back to Stripe to get the event data (I do not recommend you do this), or you’ll need to use that users api key, not yours.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Apple Reaper</title>
   
     <link href="http://coovtech.com/posts/the-apple-reaper/" />
   
   <updated>2012-09-18T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/the-apple-reaper</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;UPDATE 2&lt;/em&gt;&lt;/strong&gt;
I spoke with Apple by phone this morning. The person I spoke with was very kind and sympathetic to what happened. He had seen my blog post last night and immediately escalated action on their end. He acknowledged that it was a mistake for Apple to have rejected the app and apologized for the unfortunate app review experience I had. They took a look at the app again and confirmed that it does not violate 11.2 and approved the app.&lt;/p&gt;

&lt;p&gt;I also asked for clarification on the cross-platform exemption that the reviewer talked about. He said that was incorrect and would seek clarification from the reviewer on that. Any app rejection is based on the iOS platform, regardless of any other platform.&lt;/p&gt;

&lt;p&gt;Overall I’m happy that we were able to work this out. Kudos for Apple for escalating and solving this for me!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;UPDATE 1&lt;/em&gt;&lt;/strong&gt;
Apple reached out to me this evening. They have &lt;a href=&quot;http://itunes.apple.com/us/app/pay-pad-for-stripe-for-iphone/id558387939?ls=1&quot;&gt;approved the app&lt;/a&gt;! I’ll update the blog post with more details tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Original Post&lt;/em&gt;&lt;/strong&gt;
I’ve been patiently waiting for Apple to approve the iPhone version of &lt;a href=&quot;https://www.pay-pad.com/&quot;&gt;Pay Pad for Stripe&lt;/a&gt;. I released the iPhone version, and updates to the iPad versions, the same day back on September 2nd. The iPad apps were approved about eight days later, but the iPhone app stayed in review. I figured that the reason this happened was that reviews on an existing app go through a different QA process.&lt;/p&gt;

&lt;p&gt;About four days later (13 days after I submitted the app), I received an email from Apple’s review team that my app required more time to review. I’ve been in the financial industry for a long time and I know this term well… “Manual Underwriting”. So I knew something was up, I just didn’t know what. I was guessing that it might be a problem with me not bundling the application as a universal app. I was wrong.&lt;/p&gt;

&lt;h2 id=&quot;meet-the-reaper&quot;&gt;Meet The Reaper&lt;/h2&gt;
&lt;p&gt;Today I received an email from Apple that said they’d like to discuss my app with me. In the email, they referenced section 11.2 of the &lt;a href=&quot;https://developer.apple.com/appstore/resources/approval/guidelines.html&quot;&gt;Apple Approval Guidelines&lt;/a&gt;. For those without access to the guidelines, here’s what 11.2 says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Apps utilizing a system other than the In App Purchase API (IAP) to purchase content, functionality, or services in an app will be rejected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m very confused with this email because Pay Pad for Stripe is not an app that takes money from it’s users. It’s an app to manage your Stripe account and also allows users to charge their own customers. So my app facilitates B2C transactions where Pay Pad for Stripe users are the “Business” and the people who would be charged by a Pay Pad for Stripe users are the “Customers”. Sadly, no cash comes my way. So what’s the problem?&lt;/p&gt;

&lt;p&gt;Apparently the problem is that Apple sees my Stripe app as a directly violation of section 11.2 and feels that they are entitled to collect 30% of the transactions that would be processed from the app.&lt;/p&gt;

&lt;h2 id=&quot;bat-shit-crazy&quot;&gt;Bat Shit Crazy!&lt;/h2&gt;
&lt;p&gt;Could you imagine, charging customers 30% to accept a payment? I thought it was a joke. I mean it seems obvious to me what my app does and that it does not apply to 11.2, but I’m biased.&lt;/p&gt;

&lt;p&gt;I’m annoyed, so for the sake of my own amusement, and to complete my little temper tantrum, I’ve listed how our phone conversation went:&lt;/p&gt;

&lt;p&gt;I told him my name and why I was calling. He gave me a brief rundown of 11.2 and why my app violated it. I tried to explain to him what my apps does. No real response. Then this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; “Do you know what Stripe is? Have you ever heard of them? They are based in SF”&lt;br /&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; “No, never heard of them”&lt;br /&gt;
&lt;strong&gt;Me:&lt;/strong&gt; “Ok, have you heard of Square or PayPal, my app has similar features”&lt;br /&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; “No, never heard of them”&lt;br /&gt;
&lt;strong&gt;Me:&lt;/strong&gt; “Seriously, you’ve never heard of Square or PayPal?”&lt;br /&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; “There are over 700,000 apps in the app store. I just go through them one at a time”&lt;/p&gt;

&lt;p&gt;At this point I realize that I’m talking to a robot. Someone who’s job is mechanical. There is no empathy. No desire to learn the details of my app. His decision has already been made before he emailed me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; “So what are my options?”&lt;br /&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; “You’ll need to comply with 11.2 by implementing In App Purchases, or remove the feature”&lt;br /&gt;
&lt;strong&gt;Me:&lt;/strong&gt; “Wow, that’s unbelievable. I can’t understand how my app is related to 11.2 at all.”&lt;/p&gt;

&lt;p&gt;He recites 11.2 to me. I again attempt to explain in detail how the app works, how Stripe works, and how we use Stripe with the various apps and products we have. He stands firm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple:&lt;/strong&gt; “Is your app cross-platform?”&lt;br /&gt;
&lt;strong&gt;Me:&lt;/strong&gt; “What do you mean?”&lt;/p&gt;

&lt;p&gt;I’m afraid to answer this question. I’m not sure where he’s going with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple:&lt;/strong&gt; “If your app is cross-platform, then 11.2 does not apply and this problem goes away”&lt;br /&gt;
&lt;strong&gt;Me:&lt;/strong&gt; “Really, so if I build an Android version and launch it, I’m good?”&lt;br /&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; “Yes”&lt;/p&gt;

&lt;p&gt;Still shocked I again explain how I think it’s crazy that this situation is happening and that there is no way 11.2 applies to my app. I’m not selling a product, a service, NOTHING! That went on for a couple of minutes longer until I give up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt; “So my two options are to release and Android version, or update my apps to remove this feature?”&lt;br /&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; “Sounds like you have a plan”&lt;/p&gt;

&lt;p&gt;I’ve since sent two more emails requesting further clarification but I have not yet received a response. I did a Google search for this guy and it turns out I’ve been touched by the Apple Reaper. It’s a sad day.&lt;/p&gt;

&lt;h1 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h1&gt;
&lt;p&gt;I’m going to climb whatever ladder I need to climb to squash this bullshit! Apple picked on a little guy; we can’t stand for this!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m kidding&lt;/strong&gt;. I don’t have the time or energy to argue about it; I’ve wasted enough already. Writing this blog post satisfies my need to complain about it. It will take me 20 minutes to update the three apps and get them re-submitted. I don’t have millions of users; no one will care.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Onward!”&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>An iOS library for Less Neglect</title>
   
     <link href="http://coovtech.com/posts/less-neglect/" />
   
   <updated>2012-09-17T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/less-neglect</id>
   <content type="html">&lt;p&gt;Building a fluid communication channel between your app, and your customers, is difficult and time consuming. That’s why I really like what &lt;a href=&quot;http://lessneglect.com/&quot;&gt;Less Neglect&lt;/a&gt; has done with their new Customer Analytics &amp;amp; Support API.&lt;/p&gt;

&lt;p&gt;##How I Typically do Support&lt;/p&gt;

&lt;p&gt;In the past, I’ve hooked up apps like &lt;a href=&quot;http://www.desk.com&quot;&gt;Desk.com&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://getsatisfaction.com/&quot;&gt;Get Satisfaction&lt;/a&gt; for customer support, in combination with &lt;a href=&quot;https://testflightapp.com/sdk/live/&quot;&gt;TestFlight Live&lt;/a&gt;, to provide a way for customers to reach me, and to also monitor user engagement inside my iOS apps.&lt;/p&gt;

&lt;p&gt;While both of these apps are very nice, they don’t really fit a customer relationship model. Desk.com is a very nice help-desk app, and TestFlight is great for tracking events and ad revenue inside your app. But how do you tie the two together? How do you build a relationship with your customers, not just provide a helpdesk, and how do you track important events that happen with your customers and keep both event data, and customer interaction data in the same place?&lt;/p&gt;

&lt;p&gt;##Proactive Support, the Better Alternative
&lt;a href=&quot;http://lessneglect.com/&quot;&gt;Less Neglect&lt;/a&gt; makes this type of customer engagement easy with a super-simple API. Less Neglect is less about being a reactive help-desk and more about real-time pro-active customer engagement.&lt;/p&gt;

&lt;p&gt;Less Neglect suggests you begin with a list of &lt;a href=&quot;http://lessneglect.com/api/quickstart#&quot;&gt;fifteen events&lt;/a&gt; which include account events, user events, and customer activity. For example, an account event might be a new customer registration, or a customer deleting their account. A user event, which is more along the lines of what you might use TestFlight for, might be user loggedin, user updated profile, user ran into an error on the site.&lt;/p&gt;

&lt;p&gt;Every application is different so you’ll probably have many of your own events you’ll want to track. I’ve been using &lt;a href=&quot;http://www.twilio.com&quot;&gt;Twilio&lt;/a&gt; and &lt;a href=&quot;http://www.stripe.com&quot;&gt;Stripe&lt;/a&gt; in just about every application I’ve built over the last year. It makes sense for me to want to send an event message to Less Neglect for things that touch Stripe such as plan upgrades or failed payments that come back via Stripe web-hooks.&lt;/p&gt;

&lt;p&gt;A good use-case example is the Twilio integration that I did with &lt;a href=&quot;http://www.pay-pad.com/alerts&quot;&gt;Alerts for Stripe&lt;/a&gt;. There is a magic number of SMS messages that a customer can receive each month that would have me breaking even. When a customer hits the break-even threshold, I’d fire off an event to Less Neglect with the customer record. I might consider upping the customer’s account_level as well. Boom! automatic tracking of my highly engaged customers!&lt;/p&gt;

&lt;p&gt;##The iOS Library
I have &lt;a href=&quot;http://www.pay-pad.com&quot;&gt;an app&lt;/a&gt; that I wanted to trigger events and messages directly, rather than from my backend server. So I &lt;a href=&quot;https://github.com/azcoov/lessneglect-ios&quot;&gt;built a simple iOS Library&lt;/a&gt; that makes this process easy.&lt;/p&gt;

&lt;p&gt;Simply &lt;a href=&quot;https://github.com/azcoov/lessneglect-ios/downloads&quot;&gt;download&lt;/a&gt; the Library, drag the LessNeglect folder into your project and start sending events and messages.&lt;/p&gt;

&lt;p&gt;Here is an example of sending a new customer registered event:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;LessNeglectConnection *con = [LessNeglectConnection connectionWithCode:kProjectCode key:kAPISecret];
Person *person = [[Person alloc] init];
person.email = @&quot;name@example.com&quot;;
Event *event = [[Event alloc] init];
event.name = @&quot;registered&quot;;
event.note = @&quot;customer signed up from xyz campaign&quot;;
event.person = person;
[con createActionEvent:event success:^(NSDictionary *response) {
    NSLog(@&quot;Winnning!&quot;);
} error:^(NSError *error) {
    NSLog(@&quot;Not Winnning.&quot;);
}];
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Check out the &lt;a href=&quot;https://github.com/azcoov/lessneglect-ios/blob/master/README.md&quot;&gt;README&lt;/a&gt; for more information on how to integrate. Also, please feel-free to add to the library!&lt;/p&gt;

&lt;p&gt;Less Neglect also has two client libraries for &lt;a href=&quot;https://github.com/lessneglect/lessneglect-ruby&quot;&gt;Ruby&lt;/a&gt; and &lt;a href=&quot;https://github.com/lessneglect/lessneglect-dotnet&quot;&gt;.NET&lt;/a&gt; that you should checkout if you want to communicate server-side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;update&lt;/strong&gt; The iOS client library is now featured on the &lt;a href=&quot;http://www.preact.io/api/ios&quot;&gt;Preact API Site&lt;/a&gt;. Winning!&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Design process at Stack Exchange</title>
   
     <link href="http://www.8164.org/stack-exchange/" />
   
   <updated>2012-08-09T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/link-jin</id>
   <content type="html">&lt;p&gt;I’ve been following &lt;a href=&quot;http://www.8164.org/about/&quot;&gt;Jin Yang’s&lt;/a&gt; work for years. He’s an amazing designer and I was excited when he went to lead design over at Stack Exchange. In this post he talks about the design process he takes for each site in the Stack Exchange network. I’m not a designer at all so it’s interesting to get into the brain of one of the best. Check it out!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Problem with Two-Factor Authentication</title>
   
     <link href="http://coovtech.com/posts/two-factor/" />
   
   <updated>2012-08-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/two-factor</id>
   <content type="html">&lt;p&gt;I was following along with John Sheehan’s thoughts on &lt;a href=&quot;http://john-sheehan.com/post/28437774039/is-it-time-for-password-less-login&quot;&gt;password-less authentication&lt;/a&gt; and two-factor authentication came up today with a &lt;a href=&quot;http://techcrunch.com/2012/08/02/y-combinator-backed-startup-authy-wants-to-help-you-prevent-a-dropbox-style-security-snafu/&quot;&gt;post by TechCrunch&lt;/a&gt; about &lt;a href=&quot;https://www.authy.com/&quot;&gt;Authy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Two-Factor authentication is a great security model. There are various flavors of two-factor authentication but the Authy concept specifically relates to sending a short token to you via an Authy app, or SMS.&lt;/p&gt;

&lt;p&gt;I use a two-factor authentication system every day for some contracting work I do. It’s a combination of VPN and two-factor auth. When I want to connect to the remote network, I start by connecting VPN. I’m prompted with a required token. To get that token, I have to open an iPhone app which will render a new token. I manually type that token into the VPN token dialog, then I’m prompted for my password with another dialog. When I supply that, I’m authenticated!&lt;/p&gt;

&lt;p&gt;##THIS SUCKS!!!
As an IT professional who is concerned with security, I like this model. It makes it much more difficult for unauthorized users to access the system/network/app, etc and that’s what I want.&lt;/p&gt;

&lt;p&gt;As a user, I hate this model. It’s a bit of a pain in the ass to do this. What happens if I forgot my phone (it’s rare, but it happens). What happens when the token system is down? What if I don’t have a smart phone, or a cell phone (yeah, there are still a couple of people in the world that don’t carry these things with them). I don’t want to fumble around with multiple apps. I just want to sit down and work. The less hoops I have to jump through to start my day, the better.&lt;/p&gt;

&lt;p&gt;The organization that I work with solved the mobile problem by also offering an installed cross-platform desktop token app, which is great, but it’s not perfect.&lt;/p&gt;

&lt;p&gt;You can interchange “email” with “app” and “sms” but there are still roadblocks with that. I work with some clients who do not allow any third-party apps at all. Some clients won’t use email. I was joking with some friends the other day about two-factor auth with a client that is locked down so tight that we figured we’d have to physically call them with their token. Or snail-mail it to them :)&lt;/p&gt;

&lt;p&gt;##Is There Something Better?
Not currently. I think what Authy is doing is great. Especially if your app’s target audience is technically savvy and/or understands the importance of security.&lt;/p&gt;

&lt;p&gt;I hate to say this but we need a way to force our high security standards on our users without annoying them. As an industry we are moving in the right direction but we need to continue to improve it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>It&#39;s not what you read, it&#39;s what you ignore</title>
   
     <link href="http://www.hanselman.com/blog/ItsNotWhatYouReadItsWhatYouIgnoreVideoOfScottHanselmansPersonalProductivityTips.aspx" />
   
   <updated>2012-08-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/link-dont-waste-energy</id>
   <content type="html">&lt;p&gt;A great talk from &lt;a href=&quot;http://twitter.com/shanselman&quot;&gt;Scott Hanselman&lt;/a&gt; about keys to being more productive. I really appreciate the conversation about inbox processing. Not just your email inbox, but your life inbox. My favorite part of the talk is around 22:30 into the video where Scott quotes &lt;a href=&quot;https://twitter.com/GTDGuy&quot;&gt;David Allen&lt;/a&gt;: “Don’t put energy into things you don’t want more of”. I always find it interesting to get insight from the minds of people who are way busier than I am.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Clean up your workspace</title>
   
     <link href="http://coovtech.com/posts/unclutter/" />
   
   <updated>2012-07-30T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/unclutter</id>
   <content type="html">&lt;p&gt;For the past few months I’ve been working all over town. A friends office some days, a coffee-shop on other days, pubs, bookstores, collaborative workspaces, or anywhere with decent wifi. This has caused a little neglect with the home office. It’s easy to throw things on your desk when you aren’t using it and living out of a laptop bag.&lt;/p&gt;

&lt;p&gt;Some things have changed recently that has me working from home more, and starting next week, I’ll be working from home full-time. During this time I’ve been trying to get back into the swing of coding on giant monitors and not a little 13” MackBook Air. Something about my office was really bothering me. I felt claustrophobic. Disorganized. Constantly annoyed.&lt;/p&gt;

&lt;p&gt;I kept telling my wife that I needed to make a change but I wasn’t sure what. I’ve been eyeing this &lt;a href=&quot;http://www.dwr.com/product/tavola-table-large.do?sortby=ourPicks&quot;&gt;Travola Table&lt;/a&gt; desk for a while now and figured maybe now’s the time (Shhh, she doesn’t know). I really like this desk, mostly because it’s incredibly sturdy and you can write on it with dry-erase markers. I also have the exact amount of space needed for it if I got rid of my wife’s desk and moved her to my current one. It’s not cheep though so I’ve been putting it off. Low &lt;a href=&quot;http://en.wikipedia.org/wiki/Wife_acceptance_factor&quot;&gt;WAF&lt;/a&gt; if you know what I mean.&lt;/p&gt;

&lt;p&gt;My wife and I decided instead to clean. Yeah, just clean, what a strange concept…&lt;/p&gt;

&lt;p&gt;##Before/After pics of the office&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;before:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/office-before.png&quot; alt=&quot;Office before&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I’m sure this is probably an average looking home office, but really there is clutter everywhere. The wires under my wife’s desk really bother me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;after:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/office-after.png&quot; alt=&quot;Office after&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hunh, so what changed?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I got rid of all paper except my &lt;a href=&quot;http://fieldnotesbrand.com&quot;&gt;field notes&lt;/a&gt; and a single sticky pad. This means everything was either &lt;a href=&quot;http://evernote.com/partner/fujitsu/&quot;&gt;scanned into Evernote&lt;/a&gt; and shredded, or just thrown out.&lt;/li&gt;
  &lt;li&gt;Nothing is allowed on my desk unless it’s used at least once a day &lt;em&gt;(Exception is the Mac Classic, and the Windows Home Media Center. I haven’t found a place to stick those)&lt;/em&gt;. Even the MacBook Pro is gone. All that remains is my desktop machine, a Blue Yetti microphone, an AirPort Extreme, an iPad, and a &lt;a href=&quot;http://www.amazon.com/Bose-SoundDock-Series-Digital-System/dp/B001DLTDQC/ref=pd_cp_e_0&quot;&gt;Bose Sound Dock&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;My wife cleaned up her desk as well. Filed things away, hide things in drawers. Very nice of her considering she’s knee-deep in planning a baby shower for her sister.&lt;/li&gt;
  &lt;li&gt;Foot space. I think a large part of my problem was a box of books that was at my feet. I moved that to the garage and instantly felt a sense of openness when I sit down (sorry, the original pic doesn’t show the box under my desk).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;#I’m not done yet.&lt;/p&gt;

&lt;p&gt;I need to find a place for the Media Center and the old mac. I also want to get rid of the junk at the top of my desk hutch. It’s a graveyard of toys that we are hiding from our kids and old gadgets I don’t use anymore. From these pictures I can see a remote control car, a soccer ball, a model rocket, a TiVo, and a Microsoft ergo keyboard 4000.&lt;/p&gt;

&lt;p&gt;I’d like to move the printer as well because it comes out maybe twice a year for special projects (a.k.a. someone in our family is getting married or having a baby).&lt;/p&gt;

&lt;p&gt;I still think I’m going to get a new desk that is longer and move my wife to my desk. I want the additional room for the monitors and I really want the table-top space so that I can use it as a dry-erase scratch pad.&lt;/p&gt;

&lt;p&gt;We’ll see how I feel next week when I start working from home full time again. Just sitting in my desk tonight while I write this has felt great without the clutter.&lt;/p&gt;

&lt;p&gt;I’m obsessed with home workspaces. I really enjoy LifeHackers’s &lt;a href=&quot;http://lifehacker.com/featured-workspace/&quot;&gt;featured workspace series&lt;/a&gt;. The amazing home offices always put mine to shame. Do you have an interesting home office? &lt;a href=&quot;http://www.twitter.com/billycoover&quot;&gt;Send me a link&lt;/a&gt; and I’ll show it here.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Thoughts on Crossfit and Startups</title>
   
     <link href="http://coovtech.com/posts/crossfit/" />
   
   <updated>2012-07-30T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/crossfit</id>
   <content type="html">&lt;p&gt;Today TechCrunch posted an &lt;a href=&quot;http://techcrunch.com/2012/07/30/the-best-gym-for-startups-crossfit/&quot;&gt;article about CrossFit&lt;/a&gt;. When I first saw the headline I was upset. The trendy tech news media is now blogging about my beloved Crossfit. Or as my friend said today “Crossfit has jumped the shark”. Oh No!&lt;/p&gt;

&lt;p&gt;The truth is this is probably a good thing for Crossfit. There are some good an bad things about it becoming main-stream. The bad that I see is that the more popular it gets, the more-and-more box’s open up (this problem already exists). Seems that anyone with $20k and a small warehouse can open up a new Crossfit gym. There is some inherent danger with that. The gym/box doesn’t matter, it’s not important. It’s the coaches that matter. You want veteran coaches at your gym. People that teach you proper lifting techniques. People that can spot injury prone mistakes a mile away. People that get to know your body and your scaling limitations. People well educated in nutrition. If you are interested in Crossfit, scope out the CrossFit gym before you go and do some research about the coaches. It’s the difference between a great experience and higher risk of injury. I hope that by CrossFit getting main-stream media coverage like this, it does noting but help these entrepreneurs grow their fitness businesses. One thing I’ve learned about CrossFit gyms is that you have to work your ass off to own one. At $130 a month, per member, on average, you need a lot of members, or a lot of personal training, to make a decent living. More power to them!&lt;/p&gt;

&lt;p&gt;##So what about startups
The article is actually interesting is that it suggests that CrossFit is great for startups. Startups are known for crazy hours and needing tons of energy to get off the ground. It’s mostly true. And in order to put tons of energy into a startup, you have to have tons of energy to begin with. This is where CrossFit helps.&lt;/p&gt;

&lt;p&gt;In April of 2011, I left my full-time job to work on my startup. I was 70lbs heaver back then. While I thought I had a lot of energy, I really didn’t. Sure, I was knocking out a lot of code but everything else around me suffered, namely family. It wasn’t until a fat comment that someone made about me at a softball game that finally made me do something about it.&lt;/p&gt;

&lt;p&gt;I hired a personal trainer (&lt;a href=&quot;http://girlsjustwannahavebuns.blogspot.com&quot;&gt;Elyse Miller&lt;/a&gt;), and started on a diet and exercise program (&lt;a href=&quot;http://www.thefitmenu.com&quot;&gt;The Fit Menu&lt;/a&gt;). Over a nine month period or so I lost 60 lbs. It was an amazing transformation of my body, and who I am. For the first time since I was a junior in high-school, I was healthy and fit. I was so happy and had so much energy that I wanted to take it to the next level. I wanted that Brad Pitt body from FightClub.&lt;/p&gt;

&lt;p&gt;A friend of mine had been doing CrossFit for a year and kept bugging me to try it. I kept putting it off and putting it off until one day he sent me a video of a really intense WOD. It light a fire inside me and I knew that I had to jump on the CrossFit bandwagon.&lt;/p&gt;

&lt;p&gt;It’s a perfect compliment to building a startup team. CrossFit is not just an individual thing. You push yourself, but you also push others (hence a team). Encouraging a team to push themselves to live a healthier lifestyle is probably going to yield the startup dividends, not the kind from paying customers.&lt;/p&gt;

&lt;p&gt;I used to kind of brag about the late-night hackathons we would do while drinking a bunch of beer or slamming a ton of RedBull. We always did really well but I always felt like crap. Slapping a keyboard while drinking soda and eating chicken wings helps, but not at making your code awesome. It helps shorten your life.&lt;/p&gt;

&lt;p&gt;##Crossfit feels like death, in the beginning
If you are out of shape (like I was), CrossFit is going to feel like death. Not just during your WOD’s, but for the whole hour. You are going to use muscles you’ve never used before even if you’ve been working out at a regular gym (do much overhead work there?). Even going through the workout motions with an empty bar is going to be difficult. If your WOD (Workout of the Day) includes any type of significant running (it will), then you are toast (especially in Arizona when it’s 115 out).&lt;/p&gt;

&lt;p&gt;Stick with it. I remember my first WOD. Three rounds for time of 15 kettle bell swings at 53lbs, 15 wall balls at 20lbs, a 400 meter run, and 15 burpees (not in that order). I literally thought I was going to die. I was planning escape routes as I was running my 400 meters. By the time it was over, I was spent. I just laid on the floor for what seemed like a half hour. My coach (Mike) said “good job Billy!”. Hunh? Good Job? I almost died, could have skipped out on the workout at any given time, almost threw-up, probably finished with a world record slowest time, and he told me good job? That’s CrossFit. Constant encouragement. No going backwards. You always do a good job because you are always improving.&lt;/p&gt;

&lt;p&gt;##It gets better, not easier
After four training classes (required at my box), I could already feel my body changing. Each workout, while not getting any easier, was not making me feel like death. Two, three, and four weeks went bye and I was a different person. I could hang with people during the cardio movements and could keep up, although scaled, during the lifting WOD’s.&lt;/p&gt;

&lt;p&gt;I’m now on month five of CrossFit. I’ve done just about every WOD at RX (that means doing the workout at the prescribed weight and or reps) over the past three weeks and I usually lead, or am near the top, in anything cardio related (rowing, running, burpees, box-jumps). I’ve lost about 10 more pounds wile gaining a lot of lean muscle mass. For the first time, since I was 17 years old, I can walk around without a shirt off and feel comfortable. I get comments from just about everyone I see who knows me as “fat Billy”. They are amazed.&lt;/p&gt;

&lt;p&gt;##The Energy
This seems to defy logic but after doing CrossFit, even in the beginning, I would always have more energy for the rest of my day. That’s right, kill yourself for an hour, and when you are done, you go through the rest of the day with tons of energy. I’ll take it.&lt;/p&gt;

&lt;p&gt;I’m more focused when I’m working. I’m more alert. I move faster in terms of code, testing, qa, designing, and everything else that goes into being an engineer. I can hang with my kids. They are crazy, they move fast, and I can keep up with them every step of the way now. In fact, I coached my son’s t-ball team with ease and got a lot of complements from parents on how well tempered I am and how patient I was with their kids. If I had done it a year before I’m sure the parents, and kids, would have hated me.&lt;/p&gt;

&lt;p&gt;Meetings still stuck but I can sit through them, usually multi-tasking, and can stay on point. I miss a whole lot less (meetings, honey-do’s, tasks); my memory has improved.&lt;/p&gt;

&lt;p&gt;This weekend I did about an hour of yard work, trimming bushes and trees for a party my wife is hosting this weekend. It was 100 outside and very humid. When I was done, I went inside and helped my wife clean the house. I wrestled with the kids, built things, made breakfast, and this was all before 9am. I was bouncing off the walls waiting for the next task, the next honey-do, the next thing to do with the kids. It’s pure energy and right now it seems endless. I’m addicted.&lt;/p&gt;

&lt;p&gt;##”I don’t have time to do CrossFit”
Bullshit. It’s an excuse and I had tons of them for the last 12 years.&lt;/p&gt;

&lt;p&gt;I have a busy life. I’m married with three kids under five. I work part-time on my startup, part-time contracting, and free-time building/learning new things. I gave every excuse in the book as to why I could not fit a gym schedule in my life. I had an L.A. Fitness Membership for two years and I never used it. It’s all mind games really.&lt;/p&gt;

&lt;p&gt;My biggest regret is waiting so long to start. Forget the money wasted. I lost years of my life because I chose to eat like shit and not be active. You can’t get that time back.&lt;/p&gt;

&lt;p&gt;##The Diet
The Article talks about Paleo. Here’s my brief take on it. Paleo food just happens to be the food I love. Meat, fish, seeds and nuts. For breakfast, everyday, I make eggs, bacon, and sausage. It’s my favorite food and you’re telling me that I can eat it and it’s part of the diet. I’m all in!&lt;/p&gt;

&lt;p&gt;My wife does Paleo with me and for the most part I have the kids on it. Lots of compromise there though.&lt;/p&gt;

&lt;p&gt;I had already lost 60 lbs before I started Paleo so I wasn’t expecting a lot of weight loss. I’ve been tracking my weight everyday since the first of this year. As soon as I started Paleo, my weight stopped fluctuating. It’s now nearly a flat line that slowly angles down. So, I’m eating the foods I love, getting leaner, stronger, and still dropping fat. Perfect!&lt;/p&gt;

&lt;p&gt;I read Rob Wolf’s book &lt;a href=&quot;http://robbwolf.com/shop/products/the-paleo-solution-the-original-human-diet/&quot;&gt;The Paleo Solution&lt;/a&gt; after I had started Paleo. If you want to learn a little more about the science and facts behind, give it a read. It’s short.&lt;/p&gt;

&lt;p&gt;After seeing my results, my aunt, grandmother, and brother-in-law have either started Paleo or Crossfit. It’s not a fad diet. The results are real. You can’t airbrush your friends who are standing in front of you.&lt;/p&gt;

&lt;p&gt;##Results you can’t see
I look in the mirror and I’m happy. Very happy. My wife, yeah, happy. But there is more to it than physical appearance. I recently changed life insurance and was required to do a full blood workup. The last time I had done this was late 2010 and I was not doing so well. High blood pressure, high cholesterol. I was obese and my health sucked. After getting my latest results back I was amazed at the change. Absolutely perfect results, for my age and weight. So not only did I feel and look great, but my body has responded positively to everything I’ve been doing. When you see the raw data, it validates everything.&lt;/p&gt;

&lt;p&gt;My grandmother, a type 2 diabetic, read The Paleo Solution after I nagged her about it for a while. Three weeks in and her sugar levels were at 90. She hasn’t seen 90 since she first discovered she had type 2 diabetes. I’m looking forward to the day when she tells my kids that she’s no longer a type 2 diabetic.&lt;/p&gt;

&lt;p&gt;##It’s about health and fitness
How you choose to be fit and eat healthy is less important than actually committing to a plan and sticking with it. CrossFit might not be for you. That’s fine. If you push yourself hard enough, stay off the machines, and do some high-intensity workouts at a local gym, that’s good. I suspect you’ll like the CrossFit atmosphere better though. Just remember, no matter what you do, track and measure everything. Numbers don’t lie. The mirror does. It’s important to have data and to analyze it. You might not feel like you are losing weight, getting faster or stronger, but the data might tell a different story. Don’t rely on other people telling you that you do or don’t look great. People are always going to say you look better. But how much better? Use the data. Chart it, graph it, make it your friend. Always know how well you did on a lift or a run, and then try to beat it the next time it comes up.&lt;/p&gt;

&lt;p&gt;##CrossFit, the Gist
CrossFit workouts vary a lot. You won’t repeat the exact same workout often and for the most part, each workout is just an intense as the last. You’ll find that you are better at some things than others but it’s all intense. For example, I hate kettlebell swings. When I see kettlebell swings on the board for the day I want to hide, yet it’s one of the most used movements in CrossFit. It’s just a weird thing with me. On the other hand, I like burpees and most people dread those. Since I’ve leaned up a lot, burpees are easy for me and I can knock out a lot in a short period of time. You’ll find these little quirks as you learn CrossFit.&lt;/p&gt;

&lt;p&gt;Here is the workout I did this morning:&lt;br /&gt;
&lt;em&gt;Strength&lt;/em&gt;:&lt;br /&gt;
Overhead Squat 3-3-3-3-3 reps - So 5 sets of three-rep overhead squats. Before getting into this heavy lifting, we spent about 10 minutes doing various active movement stretches, and then about a good 5 minutes working on perfecting the overhead squat movement with a pvc pipe.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Conditioning&lt;/em&gt;:&lt;br /&gt;
3 Rounds for time: &lt;em&gt;(this means as fast as you can)&lt;/em&gt;&lt;br /&gt;
10 Hang Snatch 95 lbs&lt;br /&gt;
5 Overhead squats&lt;br /&gt;
50 Double Unders: Jump rope where the rope goes around twice on a single jump.&lt;/p&gt;

&lt;p&gt;It’s important to note the relationship between the strength portion and the conditioning. In the strength portion we are warming up for the conditioning. Doing a 5 set overhead squat was also preparing us to do the Hang Snatches and Overhead Squats in the WOD.&lt;/p&gt;

&lt;p&gt;##Give it a try
Most places will let you drop-in on a class. Some charge a small fee. Give it a whirl. Get to know the coaches and the members. If you are in a start-up, or a small sized company, try to get your friends to take the plunge with you. If you are a small business owner, these gyms will typically work out a bulk discount for you to send your employees there. The guys at my box opened up a dedicated lunch hour specifically so that a small business owner could have his employees take a long lunch and get an intense workout in.&lt;/p&gt;

&lt;p&gt;There is only one thing about CrossFit I’m certain of. If you do it, and stick with it, and try to always improve, you WILL get results. It’s guaranteed or your money back (false claim).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Design is HARD when you&#39;re not a designer</title>
   
     <link href="http://coovtech.com/posts/designing-familiar/" />
   
   <updated>2012-06-21T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/designing-familiar</id>
   <content type="html">&lt;p&gt;I recently re-built &lt;a href=&quot;http://www.nearbynow.co/app&quot;&gt;Nearby Now&lt;/a&gt; from the ground up. I made the decision to not only re-write a lot of the code base, but to also add new features and an entirley new look-and-feel to the application. It’s my first attempt at &lt;code class=&quot;highlighter-rouge&quot;&gt;designing&lt;/code&gt; an iPhone app and not just &lt;code class=&quot;highlighter-rouge&quot;&gt;building&lt;/code&gt; one. My end-goal was simple; create a new version with more features but make it easier to use for our customers.&lt;/p&gt;

&lt;p&gt;Now, don’t let me fool you. This is not just about building a beautiful app. This is about resources. The easier to use and more intuitive the application is, the less support calls we take. For a two-man part-time team, time is everything!&lt;/p&gt;

&lt;p&gt;##”That was easy” - NOT!
As an Enterprise .NET Engineer for the last 8 years, giving applications thoughtful asthetics was never something I really focused on. I know that is a terrible thing to say but the truth is, in the corporate world that I worked in, design always came third; behind is it done yet? and why wasn’t it done last week? We rushed functionality and focused on design later. In other words, design went to the backlog. &lt;em&gt;The bottom of the backlog&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Some of the design challenges are actually simple to solve. Build an easier login screen. Make a button more obvious and use icons or colors. Consolidate fonts and colors into a simple style guide and stick to that throughout the app. Add intuitive alerts and warnings when things don’t go as planned instead of “Error, try again”.&lt;/p&gt;

&lt;p&gt;Not everything is that easy… I ran into some snags over things I’ve never really considered before. For example, there are two areas in the application that are similar in look-and-feel and functionality. Their data model is also similar with the exception of a couple of properties. One view is of a &lt;code class=&quot;highlighter-rouge&quot;&gt;job&lt;/code&gt;, which is a customer’s house or place of business if you are a plumber/exterminator/hvac tech, and the other view is of a technician’s location. Both views have geolocation data, render a map, and have similar actions represented by the same icons.&lt;/p&gt;

&lt;p&gt;I wanted to make sure there was a clear distinction between the two views. I don’t want the user to be confused by where they are in the app, however I wanted to keep some similarities so that the user is comfortable with the experience and is able to perform actions with ease. Remember, training must be minimal. I’ve already moved their cheese with this re-design and addition of new features.&lt;/p&gt;

&lt;p&gt;##Job View vs. Technician View - The Problem
The first thing you’ll notice is that both views have three cells in a table. The uper-cell has some metadata, the middle cell has a map, and the lower cell has a menu represented by icons. I really like the look of these views. I took some inspiration from the &lt;a href=&quot;https://twitter.com/download/iphone&quot;&gt;Twitter app&lt;/a&gt; when laying out this style. There was an obvious problem that I was getting frustrated with though. Aside from the metadata, these two views look the same. I’m lost:
&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/nbn-before.png&quot; alt=&quot;before&quot; /&gt;&lt;/p&gt;

&lt;p&gt;##Job View vs. Technician View - The Solution
To fix the views, I wanted to add something that made it obvious that they were either looking at the Job View or the Technician View. Something more obvious than a title. I decided to add more metadata to the Job View (via photos they can take while on the job), and update the Technician View with a larger hybrid map. The reason I chose a large hybrid map is because the Technician View context is all about where that Technician is currently located. I designed this view so that a team of service professionals could easily see where their team was on a map, and when drilling down into an actual technician, see where that tech is located down to the street level. The next logical action when looking at a Technician is to call or SMS that tech, or get driving directions to their current location. The Job View map is more for visual confirmation that we’ve locked-on to your current location. You know where you are and you’ll probably not be focusing on the map much. You’ll be focusing on taking before and after pictures of the work you are doing, taking notes about the problem, and sending the customer a request to review you when you leave.
&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/nbn-after.png&quot; alt=&quot;before&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I like the way this turned out. I think the look-and-feel will be familiar to the user but not too complicated. It should now have a clear distinction between the two views and hopefully make life easier. But at the end of the day, I’m not a designer, so who knows what will happen O_o.&lt;/p&gt;

&lt;p&gt;##What I’ve learned
My biggest takeaway after leaving the corporate world is that priorities are a little different when you call the shots and wear all the hats. We have customers paying us real money for a product that our two-man team built. What a great feeling! This makes me want to focus on building features in our apps that are beautiful and easy to use but also useful. We talk to customers all the time who are on XYZ software built in the mid-90’s and they hate it because &lt;code class=&quot;highlighter-rouge&quot;&gt;[enter some convoluted thing the software does here]&lt;/code&gt;. Rather than ship as much functionality as fast as possible (if you think that’s just “Agile Software Development”, well, you’d be wrong), &lt;strong&gt;I’m focusing on shipping the higest value as efficiently possible&lt;/strong&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Instapaper lives on</title>
   
     <link href="http://coovtech.com/posts/Instapaper/" />
   
   <updated>2012-06-11T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/Instapaper</id>
   <content type="html">&lt;p&gt;I read a couple tech blogs today talk about the new feature of mobile Safari that allows for off-line reading and how it’s an Instapaper killer. The comments are usually funny and range from “iOS sucks”, to “you should never develop a popular app because Apple will steal your idea”, to “that’s why I’m on Android”.&lt;/p&gt;

&lt;p&gt;Here’s the deal. You can’t kill Instapaper just by adding off-line reading support. How nieve.&lt;/p&gt;

&lt;p&gt;##Years of features are not replaced by one
Instapaper has been around for a while. Constantly iterating, constantly adding new features that users want. Think about that for a minute… The Instapaper user community has a voice and Instapaper seems to implement the most popular user requested features. Ever tweeted to Apple about something that bugs you, or a feature that you’d like to see in the next version, and had them respond? I’m not talking antenagate-level changes, but rather “hey, it would be cool if the app did this” kind of feature request. For example, it took 6 iterations for Apple to add pull-to-refresh to email because, well, who knows, but we all know it’s been an obvious missing feature for a while. It’s the so called white glove treatment that you get from developers of apps like Instapaper that is difficult to replace. Small, not a lot of resources, but loves the user and fan base. These developers stay lean because they have to. They add the features that count and are good about avoiding feature bloat. I love indy developers like this.&lt;/p&gt;

&lt;p&gt;There are so many good features baked into Instapaper, including my new favorite &lt;a href=&quot;http://blog.instapaper.com/post/24293729146&quot;&gt;Background Update Locations&lt;/a&gt; that adding a simple off-line reading feature to Mobile Safari is not the killer feature that crushes Instapaper.&lt;/p&gt;

&lt;p&gt;Instapaper has a decent fan base too. Have you ever built software that millions of people use? In my short programming career, I’ve mostly built enterprise software with hundreds, maybe a couple of thousand of users, that have touched features that I poured my heart into. I can’t begine to imagine what it’s like to have millions of people touch something I built from scratch. With those kinds of numbers you build relationships. You build fans. You build trust. It’s hard to replace all of that that with small features.&lt;/p&gt;

&lt;p&gt;##So what would it take?
Well, I’ve thought about the &lt;code class=&quot;highlighter-rouge&quot;&gt;killer&lt;/code&gt; features that would make me want to ditch Instapaper. Here they are:&lt;br /&gt;
- Background Update Locations&lt;br /&gt;
- Position syncing between devices&lt;br /&gt;
- Ability to email-in links and long text&lt;br /&gt;
- Kindle&lt;br /&gt;
- Ability to save pages to Instapaper from ANY browser&lt;br /&gt;
- Twitter’s iOS Read Later integration&lt;br /&gt;
- A Facebook-to-Safari Offline Reading integration&lt;br /&gt;
- Developers that were visible, talked on Twitter, had a voice. You know, someone that was &lt;code class=&quot;highlighter-rouge&quot;&gt;real&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or, Apple just needs to simply copy Instapaper, add everything I love about it, sync it up with iCloud, figure out a way for me to view everything from my Windows box too, and we’re good.&lt;/p&gt;

&lt;p&gt;Yeah, Instapaper lives on…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Business Builder</title>
   
     <link href="http://searchengineland.com/wsj-google-prepares-business-builder-for-small-business-marketers-123340" />
   
   <updated>2012-06-04T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/link-business-builder</id>
   <content type="html">&lt;p&gt;It’s great that Google is building tools for the small business, but enough sales and marketing tools already. How about tools to help small businesses run themselves. I know getting new business/customers is priority one, but if you don’t have the right tools to manage that awesome business, then…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A Hubot inspired notification service</title>
   
     <link href="http://coovtech.com/posts/hubot-service/" />
   
   <updated>2012-03-26T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/hubot-service</id>
   <content type="html">&lt;p&gt;I’m a big fan of &lt;a href=&quot;http://hubot.github.com/&quot;&gt;Hubot&lt;/a&gt;. If you have been interested in learning &lt;a href=&quot;http://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt;, or &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt;, I recommend getting your own Hubot and tinkering with the source code. Hubut does a few fun and interesting things. For example, you can ask Hubot to mustache someone and, assuming that person has an online presence, you’ll usually something good back like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/hubot5.png&quot; alt=&quot;Hubot mustache me billy coover&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note, hubot is not magically mustaching people. Hubot is using web api’s for most things, including &lt;a href=&quot;https://github.com/afeld/mustachio&quot;&gt;mustacheing people&lt;/a&gt;. Read the source code, it will make sense)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But this post is not about the fun things that Hubot can do. After all, you’ll never get your boss to approve of having your own Hubot if all Hubot does is mustache people. Unless you mustache someone your boss hates, then maybe you’ll have a strong case for it.&lt;/p&gt;

&lt;p&gt;This post is about turning this awesome robot into your own intuitive reporting engine by writing push and pull scripts that Hubot can react to.&lt;/p&gt;

&lt;p&gt;##Enterprise reporting sucks&lt;/p&gt;

&lt;p&gt;I dislike business reporting. I’ve been designing and building enterprise level business intelligence reports for the last seven years or so. I’ve never liked writing reports. Perhaps it is the formality of the report. Perhaps I wrote too many reports that I slaved over only to find out that the business folks either weren’t running them, or didn’t know why they needed them.&lt;/p&gt;

&lt;p&gt;I have a different take on reporting. One that takes the formality out of reporting and keeps you in the loop of what you need to know, when you need to know it. It’s reporting the 2012 way.&lt;/p&gt;

&lt;p&gt;##Data that you want, when you want it&lt;/p&gt;

&lt;p&gt;In my opinion, information is best served in two ways. The first, and most important, is by push notification. I want to be alerted by things that I define as interesting or important that requires my attention. The second is by manual query. I want to fire-off simple queries that pull back the information I want without the hastle of writing a full-fledged report, or opening up some database management utility to get it. So, important information is pushed to me, and everything is a command away for me to fetch, should I want to.&lt;/p&gt;

&lt;p&gt;Building the reports that I wanted ended up being incredibly easy. I started out by writing Hubot scripts to fetch the data I care about. I tell Hubot what to do from Campfire, and hubot will run the script that makes a call to my api server, parses the json response, and pastes a nicely formatted response back to Campfire:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/hubot3.png&quot; alt=&quot;Hubot report example&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The code to make this happen is CoffeeScript and was simple to write. Here is the base script that the majority of my scripts are built from. It’s a simple web request that parses the json result. In most cases, I just change the URL I’m pulling data from and either dump the response to Campfire, or parse the data in the response into something readable before I post to Campfire:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;query_url = &quot;http://api.example.com/action}&quot;

module.exports = (robot) -&amp;gt;
  robot.respond /command what/i, (message) -&amp;gt;
      message.http(query_url)
        .header(&#39;Content-Length&#39;, 0)
        .post() (err, res, body) -&amp;gt;
          console.log body
          json = JSON.parse(body)
          if json.success == true
            message.send(body)
          else
            message.send(body)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now this is great if you are inside Campfire all the time and you are actively thinking about your data. While I do have Campfire open all day, every day, I don’t always sit in the room chatting with people and I’m not always thinking about my data. I wanted Hubot to go fetch data on a schedule without me asking Hubot to do it, and alert me if anything interesting has happened by posting the data into a “status log” chat room I have:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/hubot1.png&quot; alt=&quot;Hubot report example&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Setting the alerts up was just as easy. While we aren’t using Hubot for the actual push alerts, we are using the same type of script and API calls by throwing a rake file on it, and having Heroku fire the rake commands on a schedule. All inspired by Hubot.&lt;/p&gt;

&lt;p&gt;Here is what a typical alert Rake file looks like. We make similar API calls, parse the data in a similar way, and post it to campfire using a Campfire Ruby Adapter. Nothing too fancy here. I’m using a MySQL database to keep track of my last API calls and only pull data that’s happened since the last call (I’m doing more with SQL but I’ve simplified the code for this example):&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;require &quot;rubygems&quot;
require &#39;mysql&#39;
require &quot;tinder&quot;
require &#39;net/http&#39;
require &#39;json&#39;
require &#39;uri&#39;

desc &quot;calls an API and posts the response data to Campfire&quot;
task :some_cool_action do
   #create db connection &amp;amp; fetch last timestamp &amp;amp; compare current date &amp;gt; last_ran_on
   db = Mysql.init
   db.options(Mysql::OPT_READ_TIMEOUT, 60)
   db.real_connect()
   schedule = db.query(&quot;select last_ran_on from schedule&quot;)
   row = schedule.fetch_hash
   last_ran_on = row[&quot;last_ran_on&quot;]
   db.close

   campfire = Tinder::Campfire.new &#39;username&#39;, :token =&amp;gt; &#39;CampfireApiKey&#39;
   room = campfire.find_room_by_id(CampFireRoomId)

   response = Net::HTTP.get_response(URI.parse(&#39;http://api.example.com?lastranon=&#39; + URI.escape(last_ran_on)))
   data = JSON.parse(response.body)
   data.each do |slug|
      room.speak &quot;slug data example #{slug[&#39;Column1&#39;]}, #{slug[&#39;Column2&#39;]}, [#{slug[&#39;YouGetTheIdea&#39;]}]&quot;
   end

   #stamp last_ran_on date
   db = Mysql.init
   db.options(Mysql::OPT_READ_TIMEOUT, 60)
   db.real_connect()
   statement = db.prepare(&quot;update schedule set last_ran_on = &#39;&quot; + DateTime.now.to_formatted_s(:db) +&quot;&#39;&quot;)
   statement.execute()
   statement.close

   db.close
end
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The scripts are easy to modify later as you begin to scale. For example, lets say that you are posting real-time activity to your campfire room based on a new product you just launched. When you don’t have a lot of activity going, it makes sense to post data as it comes in. Later on, when your user base and server activity grows, it probably will get annoying to have all that activity posted to Campfire. You can quickly change your scripts and API calls to provide a daily aggregate of useful information instead of real-time activity.&lt;/p&gt;

&lt;p&gt;##Conclusion&lt;/p&gt;

&lt;p&gt;Hubot is contagious. Once you start building things on top of the robot you can’t stop. There is no end to how far you can take it. If there is a Web API out there, chances are you can find a useful way to talk to that API with Hubot. The best part is the Hubot scripts are simple to write, even if you don’t know CoffeeScript. Just look at the first example above. Making an API call and posting the result to Campfire in a few lines of code. Fantastic. I built both the Hubot scripts and the Rake scripts in an hour or two and have been using them every day for the past six months.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Quick rant on Bootstrap</title>
   
     <link href="http://coovtech.com/posts/on-bootstrap/" />
   
   <updated>2012-03-06T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/on-bootstrap</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.tekfolio.me&quot;&gt;Tekfolio&lt;/a&gt; was built on bootstrap. What does that mean?&lt;/p&gt;

&lt;p&gt;Bootstrap is a highly polished set of UI templates, CSS, and components that help developers rapidly build great looking websites without having to spend a ton of time on UI design.&lt;/p&gt;

&lt;p&gt;This does not mean you should skip the UI part of web design. While bootstrap is great for prototyping ideas and mocking up living pages, UI design is not something that should be forgotten. In some cases, the application UI is the most important aspect of the entire website.&lt;/p&gt;

&lt;p&gt;I’m not a graphic designer and that’s why I “skipped” the UI design part of Tekfolio. Yep, I just contradicted what I said. Oh well. But in reality I didn’t really skip the UI design of tekfolio. In contrast I gave the landing page a lot of thought. What to say, where to say it, how to provide examples, and a ton of other ticky-tac little things that drove me crazy to get right. I did rely heavily on vanilla bootstrap, but the content is all me. Once you are inside Tekfolio, you’ll notice I’m leaning on Bootstrap again. But I’m also making use of great open-source API’s (such as &lt;a href=&quot;http://harvesthq.github.com/chosen/&quot;&gt;Harvest’s Chosen&lt;/a&gt;, for example) to try and improve the user experience.&lt;/p&gt;

&lt;p&gt;Tekfolio has been a side-project that I care a lot about. It’s also a playground for learning and testing new ideas. I’ve re-written Tekfolio from the ground-up a few times now (in MVC, Rails, Backbone). As a programmer, this was time well spent on something I think I’m great at (server-side shenanigans), and not something I suck at (UI design). Bootstrap allow me to focus on awesome functionality while keeping the site looking respectable.&lt;/p&gt;

&lt;p&gt;Is the design done? Of course not. It will never be done. However, it is usable today and that’s what I want. If Tekfolio gets more traffic, I won’t hesitate to hire an AWESOME graphic designer to help give Tekfolio a sexy face-lift, but until then, I’ve &lt;a href=&quot;https://twitter.com/#!/mdo/status/170639576300396544&quot;&gt;strapped-it-on&lt;/a&gt;!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Developer Efficiency</title>
   
     <link href="http://www.youtube.com/watch?v=OF5mGoKcm80" />
   
   <updated>2012-03-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/link-developer-efficiency</id>
   <content type="html">&lt;p&gt;I feel like this sometimes developing for iOS, Android, and .NET.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wordpress Permalink Hell</title>
   
     <link href="http://coovtech.com/posts/wordpress-permalink-hell/" />
   
   <updated>2012-02-01T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/wordpress-permalink-hell</id>
   <content type="html">&lt;p&gt;&lt;em&gt;disclaimer: I’m a wordpress noob, which explains why what you are about to read below happened&lt;/em&gt;&lt;/p&gt;

&lt;p itemprop=&quot;description&quot;&gt;
	So I just updated a wordpress site that I created for the Nearby Now plugins. It&#39;s just a basic site we put together to feature some of the various plugins we&#39;ve built for Wordpress and Facebook, and to show examples of those plugins in action. I made a change that screwed things up for about an hour.
&lt;/p&gt;

&lt;p&gt;We’ve got a few decent pages in there that feature the plugins with examples and installation instructions. I’d call it done, save a style upgrade, for what we needed it for.&lt;/p&gt;

&lt;p&gt;Wordpress is a fantastic CMS. I’ve written my own blog engines, used Blogger, Posterous, but from a CMS perspective, I’m a fan. It’s easy to setup and the plugin community is fantastic. If you have some pages you want to manage, and maybe a blog, then this thing is for you. You can even hook into things like &lt;a href=&quot;http://www.stripe.com&quot;&gt;Stripe&lt;/a&gt; if you want to turn your CMS into an e-commerice site with little effort.&lt;/p&gt;

&lt;p&gt;But that doesn’t mean I know how to use it…&lt;/p&gt;

&lt;p&gt;##Crash and Burn&lt;/p&gt;

&lt;p&gt;I wanted to update the URl structure to be user friendly. Something like http://www.sitename.com/webpagename or http://www.sitename.com//blog/posttitle - I know it’s limited but the content here is going to stay fairly static except for any new plugins we create, or instructions we update.&lt;/p&gt;

&lt;p&gt;So I went into the Wordpress admin site, changed the permilink structure and clicked save.&lt;/p&gt;

&lt;p&gt;##BAM!!!&lt;/p&gt;

&lt;p&gt;500 errors everywhere, I mean everywhere. The site pages, the blog posts, the admin pages, even PHP admin was toast. I was pissed. We also just released a new plugin for Wordpress, posted on the Wordpress plugin site, emailed some customers about it, so you could imagine the panic. I was angry that I made a change like that in production after just driving traffic there. Oh well, live and learn.&lt;/p&gt;

&lt;p&gt;##The Fix&lt;/p&gt;

&lt;p&gt;I did some research but I did not find a definitive answer as to why this happened, and searching for the fix was comical. I finally realized that is was probably a database issue since most everything in Wordpress is db powered.&lt;/p&gt;

&lt;p&gt;I fired up the terminal, connected to our linux server, then mysql, the tried to find where that &lt;code class=&quot;highlighter-rouge&quot;&gt;/%postname%/&lt;/code&gt; value is stored. This probably takes a normal Linux/Wordpress guru 5 seconds. I touch linux and mysql about once a year so each time connect, I have to re-learn the commands.&lt;/p&gt;

&lt;p&gt;Anyway, I whacked that value and all is well. Hopefully if you run into this issue, my post helps you find the problem faster than I did.&lt;/p&gt;

&lt;p&gt;I’m not done. I’m going to get the permalink working my way. I’ll post back here when I get to that.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Building the same app for iOS and Android</title>
   
     <link href="http://coovtech.com/posts/nearby-now-for-ios-android/" />
   
   <updated>2012-01-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/nearby-now-for-ios-android</id>
   <content type="html">&lt;p&gt;Here’s a quick rambling on my experience as a .net dev building &lt;a href=&quot;http://www.nearbynow.co&quot;&gt;Nearby Now&lt;/a&gt; for iOS and Android. I had a blast, learned a ton, and developed a love hate relationship for other platforms.&lt;/p&gt;

&lt;p&gt;I’m going to break this post down into three main sections that I feel are most important to talk about. Before I begin… Please note that while I am a .net developer, I’m an Apple fanboy, and never thought I’d develop for Android, or own an Android device. In other words, I had bias against Android prior to developing for it. Take anything negative I have to say about Android with a grain of salt.&lt;/p&gt;

&lt;p&gt;Here are the three main discussion points: &lt;code class=&quot;highlighter-rouge&quot;&gt;Development Experience&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;Testing &amp;amp; Release&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;App &amp;amp; Device Experience&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;##Development Experience&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For iOS I used Xcode 4.2. For Android I used Eclipse Indigo Service Release 1. The iOS app was built first, then Android.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From start, to app in testers hands, it took 12 days to build the iOS version and 6 days to build the Android version. This is based on my git commit logs. &lt;em&gt;A day is equal to 2 to 5 hours of coding&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So it took twice as long to build the iOS version? Well, yes but there are logical reasons for that.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I had a hell of a time with Xcode and Git. It’s probably me but I spent way more time working on messed up merges between my two dev boxes than I should have.&lt;/li&gt;
  &lt;li&gt;For a .net programmer, writing Java is like writing C# the long way. It’s like using Re-Sharper in C# for a year and then having someone take it away from you. My learning curve on Java was much lower than Objective-c. I also took the same Java classes in college that you did so I too can write you the best damn mortgage payment calculator in Java.&lt;/li&gt;
  &lt;li&gt;Objective-c - I still scratch my head sometimes. Do I bracket? Do I dot? .h files are annoying. However, I’m now a lover of the delegate pattern!&lt;/li&gt;
  &lt;li&gt;I did not have to spend time designing or wire framing because we already did that for the iPhone and wanted the Android app to be as similar as possible while maintaining platform usability standards.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.twitter.com/azcoastal&quot;&gt;Barry&lt;/a&gt; built our API and we had all the methods we needed before we started on Android.&lt;/li&gt;
  &lt;li&gt;I left out a view on Android that we built for iOS. It’s a custom view that renders a translucent polygon service area on top of a map based on checkin data for the user, or the user’s company. I did this because we had already been working on new features for the iOS app and we felt it was more important to ship the Android app with the new features rather than a nice-to-have view. I’ll add that in the next release (famous last words).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I remember Uncle Bob calling Visual Studio a Yak…&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p&gt;Visual Studio is a Yak with hair that grows faster than you can shave it.&lt;/p&gt;&amp;mdash; Uncle Bob Martin (@unclebobmartin) &lt;a href=&quot;https://twitter.com/unclebobmartin/status/7174132432&quot; data-datetime=&quot;2009-12-29T22:30:50+00:00&quot;&gt;December 29, 2009&lt;/a&gt;&lt;/blockquote&gt;
&lt;script src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;I thought about that as I was building for these two platforms. I’m not sure what Uncle Bob is using as his IDE these days but there are a couple of things that come to mind.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;He hasn’t used Visual Studio 2010, with &lt;a href=&quot;http://nuget.org/&quot;&gt;NuGet&lt;/a&gt;, and all the awesome plugins we have now. The tweet was from 2009. I wish he’d give it another try.&lt;/li&gt;
  &lt;li&gt;I’d call the version of Eclipse that I’m using now more Yaky than Visual Studio 2005. That’s not good.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turns out, Xcode is great. It’s clean, simple, fast. About the only thing that would be better is if I could have built the app in &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime&lt;/a&gt;. Xcode has improved tremendously since I last used it (about three years ago).&lt;/p&gt;

&lt;p&gt;###XML meh, Storyboard FTW!&lt;/p&gt;

&lt;p&gt;I never enjoyed Silverlight or WPF much. I shipped a WPF app a couple of years ago. I’ve dabbled a little in Windows Phone stuff. One thing that bugs me, because I’m a little insane, is laying out views with XML. I don’t think it’s XML that’s the problem but rather the horrendous support IDE’s have for designing them without doing it directly in markup. It reminds me of the drag-and-drop bloat of asp.net 1.1, where you’d drag a datagrid onto a form and 500 lines of code later you had this incomprehensible chunk of HTML that made no sense. Same sort of thing with XML layouts.&lt;/p&gt;

&lt;p&gt;For building basic views (Nearby Now doesn’t really have “advanced” views), I tip my hat to Xcode. The storyboard feature is absolutely amazing. I’m a visual person so laying out application flow in a storyboard makes a ton of sense to me. Add in the fact that you can wire-up your transitions right from the storyboard and you’ve got a winner. I spent a lot less time in Xcode working on the UI than I did in Eclipse. I love seeing a birds-eye-view of the application flow and that’s what the storyboard gets you.&lt;/p&gt;

&lt;p&gt;###Resources&lt;/p&gt;

&lt;p&gt;Both iOS and Android have decent documentation. I ran into issues where I’d find examples, or documentation, that were outdated for the version I’m compiling against. API documentation is becoming irrelevant though. For every stumble I had, &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;StackOverflow&lt;/a&gt; came to the rescue. I wish most major API vendors would just move their documentation to the &lt;a href=&quot;http://stackexchange.com/&quot;&gt;StackExchange platform&lt;/a&gt; and let the community sort it all out.&lt;/p&gt;

&lt;p&gt;##Testing &amp;amp; Release&lt;/p&gt;

&lt;p&gt;I was a little more careful and thorough with iOS testing. I think I had a built-up fear of our app being rejected and read all the horror stories from other devs. Sure enough, our app was rejected the first time. Here’s the cool thing about that… Say what you will about the app store review process but it actually saved our ass. We had an embarrassing bug that we never found during testing. Even our remote testers never ran into this bug. It was an edge case and Apple found it and rejected us. Had they approved the app with that bug, it would have been an embarrassing launch for us. So I’m thankful. I can’t complain about free quality testing.&lt;/p&gt;

&lt;p&gt;###Testflight&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://testflightapp.com/&quot;&gt;TestflightApp&lt;/a&gt; is amazing. If you aren’t using it in your apps, you should. Without live crash reports, we are all blind to how our app performs in the wild. To release a build, and watch testers from all over the country open your app, and hit checkpoint after checkpoint, is a great feeling. You also get to observe the different ways people navigate your app. Another cool thing you can do with Testflight is A/B test. Let’s say you want your users to focus on a main function (checking into a location in our case), you can create separate builds that have altered flows designed to see which flow gets users from launch, to that function, the fastest.&lt;/p&gt;

&lt;p&gt;Testflight is for iOS only, which is a shame. I hope they are working on an Android and WP7 version. I don’t know what their pricing model is going to be but if anyone from that team reads this they should know that I’d pay a lot of money for what they offer.&lt;/p&gt;

&lt;p&gt;###Code signing sucks&lt;/p&gt;

&lt;p&gt;iOS, Android, ClickOnce, pfft. Code signing sucks on every platform it seems. Why can’t this be easier? The IDE should handle everything for me automatically based on my build configuration (debug or release). I should have to enter my Marketplace or iTunes credentials one time in the IDE and never have to worry about it again. I should not have to drop down to the command line to find my MD5 fingerprint, for each build configuration, just to get a Google Maps API Key. Shipping mobile software is more complicated than it should be. It feels old. Very old.&lt;/p&gt;

&lt;p&gt;###Emulators &amp;amp; Debuggers&lt;/p&gt;

&lt;p&gt;I think perhaps five of the six days it took me to build the Android version was time spent on me waiting on the emulator to start. It’s obnoxious! I didn’t go buy an i7, with a boatload of ram and an SD, so that I could sit and wait on things. The Xcode emulator runs. &lt;strong&gt;Fast&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Where Eclipse shines in my opinion is debugging. I’d prefer a more fluid experience when moving from one perspective to another (like Visual Studio) but the amount of information available to you, and the different widgets and plugins you can use to help test the device was killer. At times I struggle in iOS to find the source of an app crash. In Eclipse, LogCat is great. I never had an issue tracking anything down.&lt;/p&gt;

&lt;p&gt;##App &amp;amp; Device Experience&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I used an iPhone 4, and Droid X for local testing&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Aside from the annoying code signing stuff, and throwing some money at Apple &amp;amp; Google, setting up the devices for testing is straight forward. I prefer testing on the actual device over the emulator on both systems. Using your mouse to trigger scrolling with inertia feels unnatural.&lt;/p&gt;

&lt;p&gt;The iPhone blows the Droid X away in several ways. It’s faster. Transitioning from view-to-view, and scrolling is more fluid. There is never any lag. We know there is &lt;a href=&quot;http://www.forbes.com/sites/sap/2011/12/09/google-to-ex-intern-on-android-screen-lagginess-youre-wrong/&quot;&gt;debate as to why that is&lt;/a&gt; for Android but, I can say with 100% certainty, there is a problem and it’s annoying. I have an iPhone that’s loaded up with a ton of crap, and a Droid that has just a few apps on it with little running in the background. You’d think I’d be able to scroll through email, with a little inertia, and have that awesome experience. Instead, what you get is a choppy, laggy experience. I don’t know, maybe not everyone notices this. Maybe the big ass screen on the Droid X is enough for most people to deal with the lag. By the way, while I love the retina display on the iPhone, I do like the large screen on the Droid X.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/nearbynowforiphoneandadnroid.png&quot; alt=&quot;Nearby Now for iPhone and Android&quot; /&gt;&lt;/p&gt;

&lt;p&gt;##What’s next?&lt;/p&gt;

&lt;p&gt;Oh, I don’t know. We have plenty to do. We are building plugins for WordPress, Facebook, and a few other things. We have Apps galore now! Everything we’ve built so far is for service professionals. We plan on building consumer facing apps too. I suspect Windows Phone 7 might be our next target in the coming months. I don’t think a BlackBerry app will see the light of day but that’s ok because &lt;a href=&quot;http://www.twitter.com/azcoastal&quot;&gt;Barry&lt;/a&gt; built a kick-ass mobile version that works well for Black Berry.&lt;/p&gt;

&lt;p&gt;November and December were some of the best times I’ve had in my software development career. I love learning new programming languages but to build and ship two new apps, in different programming languages, and to have them used by real people in the wild is an amazing feeling.&lt;/p&gt;

&lt;p&gt;###Shameless plug&lt;/p&gt;

&lt;p&gt;If you are a service professional looking to extend your local reach, &lt;a href=&quot;http://www.nearbynow.co&quot;&gt;Nearby Now&lt;/a&gt; was built for you. Both apps are free. Please give them a try:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://itunes.apple.com/us/app/nearby-now/id484145186?ls=1&amp;amp;mt=8&quot;&gt;&lt;img src=&quot;https://s3.amazonaws.com/cdn.nearbynow.co/images/App_Store_Badge.png&quot; alt=&quot;Nearby Now for iPhone&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://market.android.com/details?id=nearby_now.android&quot;&gt;&lt;img src=&quot;http://www.android.com/images/brand/60_avail_market_logo2.png&quot; alt=&quot;Available in Android Market&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>In a world surrounded by technology</title>
   
     <link href="http://coovtech.com/posts/world-surrounding-tech/" />
   
   <updated>2011-12-27T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/world-surrounding-tech</id>
   <content type="html">&lt;p&gt;It’s nice to see something so basic, so trivial, that doesn’t require batteries or wifi to be incredibly useful.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/framehangers.JPG&quot; alt=&quot;Frame Hangers&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So what the heck are these little things?&lt;/p&gt;

&lt;p&gt;##Frame Hangers?&lt;/p&gt;

&lt;p&gt;Today I put up Crystal’s new double diploma frame in our office. Before I started I went to the garage and grabbed my supply of things men buy at the Home Depot but don’t really need. I started with my automatic stud finder, then used a laser level, then grabbed a nail that I would carefully press into the wall to make divot marks that I would use for driving my nails through.&lt;/p&gt;

&lt;p&gt;Then I came across this piece of paper. It’s something most men are oblivious of but I looked at it. It was instructions. O_o - yeah I read it and to my surprise, it came with these two little plastic impressions, and a tiny stick-on level, that make hanging the frame incredibly simple. No need for a laser level, or a nail for marking where your mounts will go. These two little plastic pieces take care of it all.&lt;/p&gt;

&lt;p&gt;You simply slide them into the wall mounts on the back of the frame, place the frame where you want it, and press lightly. These little plastic pieces have a sharp point at their center that leave you with perfectly aligned divots. Just drive in your nails and call it a day.&lt;/p&gt;

&lt;p&gt;Knowing how often I hang things (about once every 5 years), this probably isn’t something new and cool. I just really appreicated the simplicity of these things. It’s not too common these days to find highly functional things that aren’t sold in an AppStore; at least in my world surrounded by geekdom.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Making Nearby Now for iPhone</title>
   
     <link href="http://coovtech.com/posts/nearby-now-iphone/" />
   
   <updated>2011-12-10T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/nearby-now-iphone</id>
   <content type="html">&lt;p&gt;I love a challenge and stepping out of .NET land to tackle another programming language for a couple weeks was a blast!&lt;/p&gt;

&lt;p&gt;So what about Objective-C &amp;amp; Xcode from a .NET programmers perspective?&lt;/p&gt;

&lt;p&gt;There is a learning curve. That’s expected when moving to any new programming language. When I started learning Ruby on Rails, or PHP, or Java, or even moving from .NET Web Forms to MVC, same thing, a learning curve.&lt;/p&gt;

&lt;p&gt;This was actually my third try at Objective-C. My first two attempts were a couple years ago. I really didn’t have a plan for an app and I think that contributed to my dis-intrest in really learning the language and environment.&lt;/p&gt;

&lt;p&gt;When it came time to build an &lt;a href=&quot;http://blog.coovtech.com/sidebox-for-iphone&quot;&gt;iPhone app for SideBox&lt;/a&gt;, I wanted to do it with &lt;a href=&quot;http://xamarin.com/monotouch&quot;&gt;MonoTouch&lt;/a&gt; because I love C# and MonoTouch allowed me to build a ton of re-usable code that I could add to MonoDroid and WindowsPhone 7 when we got to those platforms.&lt;/p&gt;

&lt;p&gt;I almost built Nearby Now in MonoTouch. The only reason I didn’t was because I had this personal vendetta against Objective-C and felt that I needed to concour it. Barry, my business partner, suported this decision so I went forward. I still think MonoTouch is awesome! If you know .NET or if your organization has a lot of .NET devs, or if you want to learn .NET, MonoTouch is a great choice. My words really don’t do MonoTouch and the &lt;a href=&quot;http://xamarin.com/&quot;&gt;Xamarin team&lt;/a&gt; justice. They are one of the smartest dev teams out there. You’ll have a learning curve, like always, but it’s small. Verry verry small. Especially if you’ve built anything (web or desktop) in C#. You can sprinkle in some MonoTouch.Dialog and you’ll be blown away even further at how easy MonoTouch is.&lt;/p&gt;

&lt;p&gt;##Decisions… Decisions…&lt;/p&gt;

&lt;p&gt;So what will I use going forward? Both. It all depends on what we are building, who is going to be coding on it, and who will support it. If I build something with a .NET team, I won’t hesitate to use MonoTouch. If it’s a personal project, it will depend on what my needs are and how heavy I’ll rely on SQL Server, Web Services, re-usable code, etc.&lt;/p&gt;

&lt;p&gt;Ok, back to Objective-C. I really enjoyed learning the language, especially the new ARC way to develop. It felt more natural to rock ARC, coming from .NET.&lt;/p&gt;

&lt;p&gt;My favorite thing with iOS dev is the new Storyboard feature for laying out views and navigation. Xcode made it very simple to transition from one view to another and as a visual person, I really appreciate being able to have that high-level flow view.&lt;/p&gt;

&lt;p&gt;I really like the delegate pattern in Objective-C. It’s so similar to how we build classes &amp;amp; controls with event delegates in .NET that I felt right at home.&lt;/p&gt;

&lt;p&gt;The app is &lt;a href=&quot;http://itunes.apple.com/us/app/nearby-now/id484145186?ls=1&amp;amp;mt=8&quot;&gt;in the App Store&lt;/a&gt; if you want to check it out. Unless you are a service professional you won’t find much use for it, but hey, it’s free to check it out!&lt;/p&gt;

&lt;p&gt;If you’re interested in more of the technical details, including some of the open source projects we used in the app, you can find that information &lt;a href=&quot;http://www.tekfolio.me/billy/portfolio/nearby%20now%20for%20iphone&quot;&gt;on my tekfolio&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mvc Razor Themeable ViewEngine</title>
   
     <link href="http://coovtech.com/posts/razor-view-engine/" />
   
   <updated>2011-09-26T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/razor-view-engine</id>
   <content type="html">&lt;p&gt;Here is how you set it up:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Make sure you have the latest version of NuGet: [http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c
Install-Package MvcRazorThemeableViewEngine]http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c&lt;/li&gt;
  &lt;li&gt;Install-Package MvcRazorThemeableViewEngine&lt;/li&gt;
  &lt;li&gt;Edit your Global.asax.cs file with the code in Global-temp.asax.cs (example to follow)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you install the package, it creates two folders and a file in root. The first folder is called CustomExtensions, and the second one is called CustomViewEngines. These contain the ViewEngine and helpers require to theme your site.&lt;/p&gt;

&lt;p&gt;You’ll want to edit your global.asax.cs file to make sure it’s registering the custom view engine. The global-temp.asax.cs is provided as an example. You’ll specifically want these two methods:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public static void RegisterViewEngine(ViewEngineCollection viewEngines) {
	viewEngines.Clear();
    var themeableRazorViewEngine = new ThemeableRazorViewEngine {
		CurrentTheme = httpContext =&amp;gt; httpContext.Session[&quot;theme&quot;] as string ?? string.Empty
	};

    viewEngines.Add(themeableRazorViewEngine);
}

protected void Application_Start() {
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    RegisterViewEngine(ViewEngines.Engines);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Build and run and you should be running on the new theme engine.&lt;/p&gt;

&lt;p&gt;##Theming your site&lt;/p&gt;

&lt;p&gt;Let’s create an example theme called “Red” that will be, you guessed it, red:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;In your Content folder, add a folder called Red with a Site.css file in it that sets the background to red.&lt;/li&gt;
  &lt;li&gt;In your views folder, create a Themes folder and a Red folder.&lt;/li&gt;
  &lt;li&gt;In the Red folder, create a new view called Index.&lt;/li&gt;
  &lt;li&gt;Add some text to the Index view so that you can identifiy that it’s your Red theme index page.&lt;/li&gt;
  &lt;li&gt;Update your Views/Shared/_Layout.cshtml file to point to your theme specific style sheet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;link href=”@Url.Css(“Site.css”)” rel=”stylesheet”&lt;/p&gt;

&lt;p&gt;Now, update your home controller someone to set the theme sesion variable to “Red” and you’ll see your custom theme.&lt;/p&gt;

&lt;p&gt;I’ll post a working example soon… (famous last words)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hackathons - are they useful?</title>
   
     <link href="http://coovtech.com/posts/hackathons/" />
   
   <updated>2011-09-14T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/hackathons</id>
   <content type="html">&lt;p&gt;If you’ve never participated in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Hackathon&quot;&gt;hackathon&lt;/a&gt; (hack night, code jam, etc) then it might be difficult to understand the point. Typically a hackathon is when two or more programmers get together to work on something interesting. For most hackathons there is no more than a very high-level goal (build something useful for example) and a pre-determined period of time (might be an all-nighter, might be a weekend event, might be a week long thing) to do it in.&lt;/p&gt;

&lt;p&gt;Hackathons can be something two friends do on a weekend in a garage, a fun event that a company throws together for its employees, or a public event that spans a weekend and is open to hundreds of devs.&lt;/p&gt;

&lt;p&gt;##Who goes to hackathons?&lt;/p&gt;

&lt;p&gt;In my opinion, the type of people that go to hackathons have a passion for programming, or design, and have a passion for building things. A lot of them have an entrepreneurial passion and love the opportunity to build something with friends that might go to market some day.&lt;/p&gt;

&lt;p&gt;At a hackathon, you wont find the type of programmer that works a 9 to 5 for a paycheck.&lt;/p&gt;

&lt;p&gt;##Sounds like fun and games…&lt;/p&gt;

&lt;p&gt;I can see that but don’t mistake the pizza, wings, beer, and video games as a sign of a bunch of idiots screwing around. This is called programmer food and its required to keep energy levels high. No really.&lt;/p&gt;

&lt;p&gt;The movie “The Social Network” doesn’t do hackathons justice. Watching the movie, you can’t really feel the energy. You don’t get a feel for how much work actually gets done. You don’t get to see a large paycheek directly related to your hack efforts.&lt;/p&gt;

&lt;p&gt;##So is it useful?&lt;/p&gt;

&lt;p&gt;For who? Programmers? Businesses? - I’ve participated in a few hackathons. Mostly just two-man code jams but I’ve also been a part of a two-week hackathon in a hotel room with three other engineers.&lt;/p&gt;

&lt;p&gt;About three years ago, myself and three other engineers went on a sprint to build an enterprise application for a loan servicing company in Scottsdale, AZ. The goal was simple:&lt;/p&gt;

&lt;p&gt;Build the best collections software in the world&lt;/p&gt;

&lt;p&gt;So we spent three months building it. Towards the end of the sprint, we found that there were many distractions that were keeping us from maximizing our productivity and launching the new product on time. Distractions such as meetings, email, people walking into your cubicle all day, and various other things you find in a corporate environment.&lt;/p&gt;

&lt;p&gt;We decided that we needed to escape the distractions so we moved to a hotel room a couple of blocks down the street and finished our sprint there.&lt;/p&gt;

&lt;p&gt;This ended up being a two week hackathon where the four of us coded for hours (well more than 8) each day. The energy was high, the environment was fantastic (room over looking a pool), and we had laser beam vision of our goal.&lt;/p&gt;

&lt;p&gt;The result was that we launched a polished product that was ready to use right out of the gate. We ended up winning an &lt;a href=&quot;http://eon.businesswire.com/news/eon/20100720005209/en/Altivon/call-center/Collections&quot;&gt;industry award for the software&lt;/a&gt; and I attribute that award to the hotel hackathon effort.&lt;/p&gt;

&lt;p&gt;##Hackathons aren’t just for college kids&lt;/p&gt;

&lt;p&gt;Barry and I &lt;a href=&quot;http://www.twilio.com/blog/2011/09/sidebox-wins-developer-contest.html&quot;&gt;recently won a Twilio contest&lt;/a&gt; for &lt;a href=&quot;http://www.twilio.com/contests/2011/08/new-developer-contest-power-up-sales-with-twilio.html&quot;&gt;powering up sales with Twilio Client&lt;/a&gt;. We are both married with kids (I have three, and he has two). While we can’t do nightly hackathons, we can on occasion pull all-nighters at each others house. We have very understanding wives.&lt;/p&gt;

&lt;p&gt;We sought out to integrate the Twilio Client into the &lt;a href=&quot;http://www.sidebox.com/&quot;&gt;SideBox&lt;/a&gt; application. We knew it would be huge for SideBox customers and it would be a big deal for us if we won. By the time we found out about the contest, we had about a week to get it done.&lt;/p&gt;

&lt;p&gt;We had two hack nights. The first was to polish the Twilio Client experience (implementing it was simple), and the second was to produce the video announcing the feature.&lt;/p&gt;

&lt;p&gt;The result was &lt;a href=&quot;http://www.youtube.com/watch?v=uTACPIGDPiI&quot;&gt;a decent video&lt;/a&gt; (it was my first time doing any type of screen-cast) and a highly polished product called &lt;a href=&quot;http://blog.sidebox.com/campaign-call-center&quot;&gt;Campaign Call Center&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;##Try before you buy&lt;/p&gt;

&lt;p&gt;Speaking from a business owner perspective, hackathons might not make sense at the surface. Especially in the corporate world where people are afraid to introduce anything and where people live in fear of others perceptions (just my opinion here).&lt;/p&gt;

&lt;p&gt;Give it a try, you won’t be disappointed. Work in the corporate world? Who cares? What corporation would not want their programmers to be highly motivated to build a product for them? Afraid of bringing pizza and beer into the work place? Who cares? This about empowering your brightest minds to work their asses off for you (likely not being paid for the extra time/work). This motivates people. You want your programmers working together, after hours, learning new things and building product. You just might be blown away at the result of even one single hack night.&lt;/p&gt;

&lt;p&gt;So hack away!&lt;/p&gt;

&lt;p&gt;P.S. I’ll be at the &lt;a href=&quot;http://www.twilio.com/conference/hack-night/&quot;&gt;Twilio Hackathon&lt;/a&gt; in San Francisco on September 21st. See you there!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Unpacking the Blue Yeti</title>
   
     <link href="http://coovtech.com/posts/blue-yetti/" />
   
   <updated>2011-08-26T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/blue-yetti</id>
   <content type="html">&lt;p&gt;I’m doing some screen casts next week and thought a new mic would be helpful. I tested it tonight on Skype and it works great. Not bad for less than $90.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/blueyeti1.jpeg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s bigger than I expected but it looks great.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/blueyeti2.jpeg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wish me luck on my first ever screen cast. I’ll be showing off a killer new SideBox feature that we’ve been working on the past couple of days.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/blueyeti3.jpeg&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>{less} is more</title>
   
     <link href="http://coovtech.com/posts/less-is-more/" />
   
   <updated>2011-08-22T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/less-is-more</id>
   <content type="html">&lt;p&gt;I just spent the weekend updating &lt;a href=&quot;http://www.CoovTech.com&quot;&gt;CoovTech&lt;/a&gt; and &lt;a href=&quot;www.tekfolio.me&quot;&gt;Tekfolio&lt;/a&gt; with &lt;a href=&quot;http://lesscss.org/&quot;&gt;{less} css&lt;/a&gt;. If you haven’t heard of LESS, it’s a dynamic style sheet language that allows you to write much better CSS that compiles down to regular CSS.&lt;/p&gt;

&lt;p&gt;##Much Better?&lt;/p&gt;

&lt;p&gt;What does that really mean? Well, for as long as I’ve been doing web dev, I’ve hated CSS. When working with C# or RoR, we live in a world where things are dynamic and it’s simple to create variables, classes, methods, etc that are extensible and re-usable. Working with CSS has always been backwards. I remember the religious push to stop writing in-line styles, and it was for good reason. But having to write CSS and re-use the same color tags, for example, over-an-over was ridiculous. LESS let’s you code CSS like you would expect from a native programming language. For example:
    @primary-color: #585858;
    body{
        color: @primary-color;
    }&lt;/p&gt;

&lt;p&gt;You can imagine how many times you might use the #585858; color in your CSS file. It’s a pain in the ass to remember that color and what if you want a similar color but slightly lighter? LESS let’s you program in a more natural way:
    @primary-color: #585858;
    @secondary-color: @base-color * 3; 
    body{ color: @primary-color;}
    h2{ color: @secondary-color};&lt;/p&gt;

&lt;p&gt;The amount of time savings you get is amazing. Imagine the last time you wanted to change font colors on a massive CSS file. ugh. With LESS, it’s trivial. I encourage you to read more &lt;a href=&quot;http://lesscss.org/&quot;&gt;about {less}&lt;/a&gt; - things like mixins and functions will really cook your noodle.&lt;/p&gt;

&lt;p&gt;##what’s next?&lt;/p&gt;

&lt;p&gt;I have a need to make LESS even more dynamic. For example, I need the ability to write LESS like this:
    @primary-color: @{PrimaryColor};
    body{color: @primary-color;}&lt;/p&gt;

&lt;p&gt;Where @{PrimaryColor}’is a value that was fetched from the database. You can imagine a scenario where a client or user can specify certain layouts or themes and you want to store those values in a database and later inject them into a .less file. That’s what I’m working on now ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Talk is Cheap</title>
   
     <link href="http://coovtech.com/posts/talk-is-cheap/" />
   
   <updated>2011-08-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/talk-is-cheap</id>
   <content type="html">&lt;p&gt;I’m a huge fan of &lt;a href=&quot;http://www.linkedin.com/&quot;&gt;LinkedIn&lt;/a&gt; and &lt;a href=&quot;http://careers.stackoverflow.com/&quot;&gt;Stackoverflow Carrers&lt;/a&gt; but there has been something bugging me about both sites for a while.&lt;/p&gt;

&lt;p&gt;They are all talk…&lt;/p&gt;

&lt;p&gt;Before you drive by my house and throws eggs at me, please allow me to explain.&lt;/p&gt;

&lt;p&gt;Both of these sites have been huge for my IT career. I’ve made some great connections with people on both sites and have had great career opprotunities as a result of my information being publically available. So what the heck am I complaining about?&lt;/p&gt;

&lt;p&gt;How about I explain it with a picture?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/talkischeap.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a screen-shot of a section of my LinkedIn profile. What does this tell you? I’m a software contractor that builds SaaS applications and that I’m the co-founder of a tech startup. Well that’s great and all but what have I done? When I say my role at SideBox is application architecture or product design, what does that really tell the reader?&lt;/p&gt;

&lt;p&gt;##Words&lt;/p&gt;

&lt;p&gt;It’s one thing if your resume says “creator of Ruby on Rails”. That’s clearly self explaintory who that person is and what he is capable of.&lt;/p&gt;

&lt;p&gt;When I look at profiles like the example above they are just words. They only tell part of the story. In some cases, they aren’t accurate descriptions of a persons skill-set, rather they just prove that they can write well, or had help fluffing-up their resume.&lt;/p&gt;

&lt;p&gt;Here is a fun example. Let’s say that I write on my resume that I have advanced experience building interactive and responsive internet applications. Sounds nice right? But what happens when you hire me and this is what I deliver for you:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/talkischeap2.png&quot; /&gt;
picture from http://www.lingscars.com/&lt;/p&gt;

&lt;p&gt;##Visual&lt;/p&gt;

&lt;p&gt;This is why I built &lt;a href=&quot;http://www.tekfolio.me/&quot;&gt;Tekfolio.me&lt;/a&gt; - a place for programmers (or designers, or pm’s, or photographers, or anyone) to build an online visual portfolio of the interesting things they have worked on.&lt;/p&gt;

&lt;p&gt;After all, wouldn’t you rather see something like this that complemented my resume:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech.com/blog/talkischeap3.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.tekfolio.me/&quot;&gt;Tekfolio.me&lt;/a&gt; is a place for you to post screen-shots, wireframes, and working examples of projects that you have worked on. You can post links to working examples, source code repositories, and related blog entries that further complement your work. Also, you can add assets to your potfolio with lengthy descriptions of each image. For example, &lt;a href=&quot;http://www.tekfolio.me/billy/portfolio/sidebox%20for%20iphone&quot;&gt;in this iPhone application&lt;/a&gt;, I felt it was important to show several screen-shots of the different views I created within the iPhone application.&lt;/p&gt;

&lt;p&gt;##Why&lt;/p&gt;

&lt;p&gt;Before I went down this path, I searched and search for existing cloud based online portfolios. Just about everything I found, and there are some great ones, are taylored to just designers and photographers. That’s great but what about coders? Not everyone has 1,000 follower on GitHub.&lt;/p&gt;

&lt;p&gt;Don’t get me wrong. LinkedIn and StackOverflow have made huge advances in destroying the traditional concept of the resume. Integrations like GitHub are perfect examples of this. Tekfolio.me is not a resume site, does not compete with resume sites, and doesn’t plan on replacing resume sites. Tekfolio.me complements your career with real visual examples!&lt;/p&gt;

&lt;p&gt;Please feel free to view &lt;a href=&quot;http://www.tekfolio.me/billy&quot;&gt;my profile on Tekfolio&lt;/a&gt;. I’m going to add several more projects over the next few days so please bookmark and refresh.&lt;/p&gt;

&lt;p&gt;The site is in private beta, sort of. It’s my friendly way of saying hey, I’m solo on this project so please allow me to work out some of the kinks here and there. If you’d like your own Tekfolio.me account, please drop me a line at billy@tekfolio.me and I’ll help you get started. Pro-tip, you can just click the sign-in link and create a new account with out the email. Go for it, I don’t mind ;)&lt;/p&gt;

&lt;p&gt;Like the idea? Have ideas of your own you want to share? Is my perfect software buggy? Please &lt;a href=&quot;http://getsatisfaction.com/tekfolio&quot;&gt;post your feedback here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pair Programming With a Twist</title>
   
     <link href="http://coovtech.com/posts/pair-programming-twist/" />
   
   <updated>2011-08-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/pair-programming-twist</id>
   <content type="html">&lt;p&gt;Pair programming has been one of my favorite agile software development techniques for the last couple of years. We built &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt; this way and it’s been some of the most productive programming I have ever done.&lt;/p&gt;

&lt;p&gt;I spent the last two weeks on a sprint at &lt;a href=&quot;http://www.concordservicing.com/&quot;&gt;Concord&lt;/a&gt; trying to help them launch a new web app. We did not do pair programming formally but I did something like pair programming a couple of times.&lt;/p&gt;

&lt;p&gt;##The twist&lt;/p&gt;

&lt;p&gt;My good friend &lt;a href=&quot;http://twitter.com/josuea&quot;&gt;Josue Aparicio&lt;/a&gt; and I would sit together to and review the web application we were building. Sometimes on his laptop, sometimes on a big screen. This wasn’t pair programming because Josue is not a programmer. Josue is a project manager with expert domain knowledge about the client for which we were building the web application.&lt;/p&gt;

&lt;p&gt;He would point something out on screen, and I would implement the change. He’d find a bug; I’d fix it. I’d see something that could be improved and would ask him if the client would allow that and he could answer on the spot. We talked about technology, project management, etc. Josue’s sort of an amateur graphic designer so we talked about design too.&lt;/p&gt;

&lt;p&gt;##Productive&lt;/p&gt;

&lt;p&gt;The thing that stands out about this style of development is that in many ways it is more productive than pair programming, depending on the type of project you are working on. In my opinion, pair programming works well for two people working on their own startup, like Barry and I, where we define all the requirements. Also, when two programmers have been giving marching orders on what to implement (with specs, business rules, documentation, etc), it makes a lot of sense. When there aren’t requirements, or the requirements are vague and you often find roadblocks that require intervention from a project manager, pair programming doesn’t work well.&lt;/p&gt;

&lt;p&gt;If you are in a rapid-fire situation where the requirements are being made up as you go, or will change frequently, then including a project manager, or domain expert, as part of your agile development team is a fantastic way to squash roadblocks as they appear and keep the machine racing forward.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Misinformed Dangerous</title>
   
     <link href="http://coovtech.com/posts/misinformed-dangerous/" />
   
   <updated>2011-07-30T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/misinformed-dangerous</id>
   <content type="html">
&lt;hr /&gt;
&lt;p&gt;layout: post
title: “Misinformed Dangerous”
excerpt:
  Someone insists that this is because of MVC 3, which cannot be indexed by main stream search engine…
—&lt;/p&gt;

&lt;p&gt;I had a recent conversation with a friend about SEO and how the Google Bot crawls websites. There was a question from our conversation that remained unanswered so I fired off some queries to figure it out.&lt;/p&gt;

&lt;p&gt;I came across a &lt;a href=&quot;http://stackoverflow.com/questions/6454734/mvc-site-is-not-crawlable-by-main-stream-search-engines&quot;&gt;question on StackOverflow&lt;/a&gt; (sort of unrelated to what I was searching for) where a programmer (properly) asked a question because she was given terrible information.&lt;/p&gt;

&lt;p&gt;In that question she mentioned:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Someone insists that this is because of MVC 3, which cannot be indexed by main stream search engine&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thankfully she called bullshit and turned to &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;StackOverflow&lt;/a&gt; for help where a few people pitched in.&lt;/p&gt;

&lt;p&gt;##Misinformed&lt;/p&gt;

&lt;p&gt;The person she is referring to gave her terrible information. I want to understand why this person was so misinformed. Did he or she run into an search engine indexing issue with their MVC 3 site and conclude that it was the web development technology that caused the indexing issue? Perhaps this person glanced a tweet that was related and formed their professional opinion based on 140 characters or less. Perhaps this person is wildly making assumptions because they don’t like Microsoft or MVC. Perhaps this person is simply one of those people that forms an opinion at some point and sticks with it without testing the theory or without being open-minded and listening to other professionals who might have compelling information to prove their understanding incorrect. Sometimes misinformation can come from years of experience doing things the wrong way, or simply not allowing anyone to challenge your opinion.&lt;/p&gt;

&lt;p&gt;##Dangerous&lt;/p&gt;

&lt;p&gt;There are many reasons this type of misinformation can be dangerous. Cost alone makes me squeamish when I hear programmers spewing information that is blatantly wrong. Imagine a programmer who takes this bad information, such as the the above example, and chooses a different technology that he or she might not know as well. Also, like a virus, this misinformation can easily spread to other programmers and so on and it can end up perverting entire teams of developers.&lt;/p&gt;

&lt;p&gt;##Correction&lt;/p&gt;

&lt;p&gt;It should be your duty as a software craftsman to correct this in a way that is professional. The best way to tackle that is to test the misinformed theory and then to prove your own opinion. Obviously you might not be able to do this in every case but if you can locate the correct information quickly without a test, then that is ok. The misinformed might not be willing to hear you out. That’s fine, just blog about it instead ;)&lt;/p&gt;

&lt;p&gt;Another option is to post a question on StackOverflow on your topic and have other professionals help prove your opinion correct or incorrect.&lt;/p&gt;

&lt;p&gt;##Trust&lt;/p&gt;

&lt;p&gt;When I think about the programmers I trust, it is typically a programmer who is passionate and who likes to prove their opinions with examples or documentation. I’ve talked about this with my business partner &lt;a href=&quot;http://twitter.com/#!/azcoastal&quot;&gt;Barry Harkness&lt;/a&gt; in the past. Trust is built over years of seeing someone be correct time and time again and sharing the information they have. When we Google for something and a StackOverflow result shows up, we click on that first because we’ve come to trust StackOverflow and the StackOverflow community to provide the best answers to programming questions. I feel that same way about programmers. If you aren’t active on StackOverflow, or you don’t use or advocate it, then I automatically trust you less than a programmer who does. That doesn’t mean that you are a bad programmer, it just means that I trust programmers who use trustworthy tools to perfect their craft more than anyone else. If you drop information all the time to fellow programmers  but never provide details, examples, documentation, then it is likely that your piers will not trust you.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Corporate Smug</title>
   
     <link href="http://coovtech.com/posts/corporate-smug/" />
   
   <updated>2011-07-11T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/corporate-smug</id>
   <content type="html">&lt;p&gt;I drove by an old &lt;a href=&quot;http://www.hollywoodvideo.com/&quot;&gt;Hollywood Video&lt;/a&gt; store this weekend I couldn’t help but reflect on the rise-and-fall of of both Hollywood Video and &lt;a href=&quot;http://www.blockbuster.com/&quot;&gt;Blockbuster&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you Google these two companies you’ll likely read about these corporations as “casualty of the economy” or “casualty of &lt;a href=&quot;https://www.netflix.com/&quot;&gt;NetFlix&lt;/a&gt;”. While some of that may be true, I think it is very likely that something else caused both to crumble.&lt;/p&gt;

&lt;p&gt;##A choice of two&lt;/p&gt;

&lt;p&gt;Look back to 2005. Hollywood Video dodged a hostile takeover from Blockbuster and sold to &lt;a href=&quot;http://www.moviegallery.com/&quot;&gt;Movie Gallery&lt;/a&gt; for close to one billion dollars. Not too shabby eah?&lt;/p&gt;

&lt;p&gt;So there were two big movie rental corporations in a giant battle for movie rental dominance. Both companies, one could say, destroyed the small family-owned movie rental business. Companies at this size could under-cut the ma-and-pa shops; there was nothing they could do. America, for a period of time, had really only two options for movie rentals; Blockbuster and Hollywood video. I remember you could also rent movies from your local grocery store (Bashes, Fry’s, etc) but I always felt like a second-class citizen doing that. Oh how times have changed. I have no problem renting from a RedBox at the same grocery store today. Funny how that works.&lt;/p&gt;

&lt;p&gt;For these two giants, popularity would soar but not because customers loved these brands; they were just the only option. You could get new movie releases as soon as they came out, which was awesome, but they also had an evil side that made people’s blood boil hotter than 1,000 suns.&lt;/p&gt;

&lt;p&gt;##LATE FEES!&lt;/p&gt;

&lt;p&gt;I remember paying a ton of money in fees over time. I also remember that at one point I had more money in fees than it would cost me to buy the movie from them. That never made sense to me. I understand fees, don’t get me wrong. They provide a service (movie rental) for a period of time. If you don’t return your rental, they &lt;em&gt;could&lt;/em&gt; loose money by not renting that movie out to someone else. The downside to the fee thing is a deep inner-hatred that your customers will build towards you. However, they will keep coming back because everyone loves movies and there are only two places to purchase them from.&lt;/p&gt;

&lt;p&gt;##Corporate smug&lt;/p&gt;

&lt;p&gt;So we have two corporations raking in major cash. They are absolutely killing-it in late fee income. But what else are they doing? Nothing?&lt;/p&gt;

&lt;p&gt;The most obvious thing here is to ask “what were you thinking building a business around a late fee revenue model?”. In 2005, if asked that question, the response from executives might be something like “We’ve been doing it this way for XX years and look how profitable we are!”. Enter corporate smug. I think history, especially in the tech, music, and movie industry, shows that you can’t get cocky. There will always be someone, or something out there that can take you down in an instant. You can literally go from billionaire to broke overnight.&lt;/p&gt;

&lt;p&gt;I think it’s safe to say that NetFlix didn’t kill the movie rental industry, but rather it was the combination of the Internet (include NetFlix in that umbrella), and a deep-seeded hatred from it’s customers over ridiculous late fees and new companies with fresh and new ideas about how to improve the movie rental experience. I remember when I first got my NetFlix account I was not that impressed. Blockbuster still had the newer movies that I wanted to see. NetFlix did have something that I loved; no late fees. They were automatic winners in that regard.&lt;/p&gt;

&lt;p&gt;So why did the big corporate movie rental businesses fail? In my opinion, it’s simple. They pissed off their customers and failed to innovate and respond to change. By the time they saw NetFlix as a threat, it was too late. They copied the NetFlix model and offered movie rentals online but it was too late. Nothing they could do would erase the hatred and resent that their customers had over the years-and-years of late fees. They also copied RedBox and rent movie out of kiosks but it doesn’t matter because they are still Blockbuster and their customers still resent them for the previous years of late-fee hell. Their best shot would have been to spin it off into a new company with a new brand.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://assets.coovtech.com/blog/evilblockbuster.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is what happens to cocky corporations who fail to innovate and change. They missed the Internet threat because they were not looking for it; they were happy raking in that cash while pissing customers off. Some might ask “how can you see threats that aren’t real or visible yet?” - well, it’s not hard really. You employ people who’s passion it is to innovate and grow the company and provide excellent customer service. We have this same problem in software development when testing applications. We have to test for bugs that we don’t know about. We have to test for scenarios that we haven’t though of or that aren’t realistic. We call this edge testing. You have to employ people who’s passion it is to edge test and make sure the product is perfect. You have to be consciously looking for things in the dark. You have to always be looking for ways to improve and to grow and to make more money and happy customers, otherwise you WILL FAIL. It might not be tomorrow and it might not be 50 years from now, but at some point, it will happen. It’s inevitable.&lt;/p&gt;

&lt;p&gt;Want some examples?&lt;/p&gt;

&lt;p&gt;SwissAir, Sharper Image, Washington Mutual Bank, Global Crossing, Ritz Camera, KB Toys…&lt;/p&gt;

&lt;p&gt;You might find that these failures are cited as “the economy” but make no mistake about it, there is more to it than “the economy”. KB Toys didn’t file bankruptcy because the economy took a shit. They failed because of competition and a lack of innovation. For 85 years they were king. But you can’t run a corporation like a kingdom because someone else will take all your customers and all your money unless you stay ahead of the game.&lt;/p&gt;

&lt;p&gt;Invitation, and fresh ideas on how to improve are key but so are core values and company strengths. Maybe Hollywood Video thought about it’s core strengths and said “You know, we should stick to what we are good at. Keep that late fee model going”. Just because you have a core strength doesn’t make it good and it doesn’t mean it will last. You have to consider everything and at the end of the day if the result doesn’t equal improvement, you fail!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>In-Memory SQL DB</title>
   
     <link href="http://coovtech.com/posts/in-memory-db/" />
   
   <updated>2011-07-10T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/in-memory-db</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;According to database pioneer Michael Stonebraker, Facebook is operating a huge, complex MySQL implementation equivalent to “a fate worse than death,” and the only way out is “bite the bullet and rewrite everything.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When I hear people throw around terms like “web scale”, or “acid”, I usually face-palm &amp;amp; think of that &lt;a href=&quot;http://www.google.com/m/url?client=safari&amp;amp;ei=HI4aTsDPJMeS8gbel4SlAw&amp;amp;hl=en&amp;amp;oe=UTF-8&amp;amp;q=http://www.xtranormal.com/watch/6995033/mongo-db-is-web-scale&amp;amp;ved=0CBQQFjAA&amp;amp;usg=AFQjCNEAcBU1BzsQMp0MUGgV5yC0aAAN7Q&quot;&gt;MongoDB vs SQL&lt;/a&gt; extra normal video.&lt;/p&gt;

&lt;p&gt;I can’t wait to see “newsql” but I would love for someone to explain how Bing has accomplished “web scale” with MVC3 &amp;amp; SQL. It seems to negate claims such as this.&lt;/p&gt;

&lt;p&gt;http://gigaom.com/cloud/facebook-trapped-in-mysql-fate-worse-than-death/&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How Software Companies Die</title>
   
     <link href="http://coovtech.com/posts/how-software-companies-die/" />
   
   <updated>2011-07-06T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/how-software-companies-die</id>
   <content type="html">&lt;p&gt;I came across this article today and thought it was funny and worth sharing:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Here’s the problem that ends up killing company after company. All successful software companies had, as their dominant personality, a leader who nurtured programmers. But no company can keep such a leader forever. Either he cashes out, or he brings in management types who end up driving him out, or he changes and becomes a management type himself. One way or another, marketers get control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The shock is greater for the coder, though. He suddenly finds that alien creatures control his life. Meetings, Schedules, Reports. And now someone demands that he PLAN all his programming and then stick to the plan, never improving, never tweaking, and never, never touching some other team’s code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://www.zoion.com/~erlkonig/writings/programmer-beekeeping.html&quot;&gt;Here is the full article&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Automated Deployment with AppHarbor</title>
   
     <link href="http://coovtech.com/posts/appharbor/" />
   
   <updated>2011-06-30T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/appharbor</id>
   <content type="html">&lt;p&gt;Just about every site I own has been moved to &lt;a href=&quot;https://appharbor.com/&quot;&gt;AppHarbor&lt;/a&gt;. &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt;, &lt;a href=&quot;http:www.fhawebexpress.com&quot;&gt;FHA Web Express&lt;/a&gt;, &lt;a href=&quot;http://www.coovtech.com&quot;&gt;CoovTech&lt;/a&gt;, &lt;a href=&quot;http://www.tekfolio.me&quot;&gt;Tekfolio&lt;/a&gt; are some examples - It’s a must have not just for scale and flexibility, but also for automated deployment.&lt;/p&gt;

&lt;p&gt;I’m a big believer in simplifying every aspect of the software development process from “file new project” to deployment. Nothing should take more than a click-or-two, or a few keystrokes. I believe my focus should always be on the code, not the tool. Microsoft has done a great job at perfecting my primary tool, Visual Studio, and now AppHarbor has made web deployment automatic for my daily workflow.&lt;/p&gt;

&lt;p&gt;##Workflow&lt;/p&gt;

&lt;p&gt;Most dev teams have a preferred workflow. Some might work very well and be efficient for the team but most workflows I’ve been involved in were slow, tedious, and especially painful if there was a mistake. I’ve always felt that deployment should be automatic every time you push code into a central repo. It should be as much of a natural thing and hitting F5 (build in Visual Studio)…&lt;/p&gt;

&lt;p&gt;Done gasping? Think I’m crazy? Hear me out…&lt;/p&gt;

&lt;p&gt;For my personal sites, I’m perfectly happy working in my primary branch and deploying on commit. Only I can screw up my code, create bugs, bring my site down, so I’m ok with taking 100% responsibility for that. If I screw up then I can give myself a stern talking to. In a team environment, I’m not suggesting that programmers deploy after every commit on their own dev branch, but rather the master production branch, which should only receive commits from code that is production ready. This means that QA, UAT, or whatever workflow your team uses, has taken place and the code is shippable.&lt;/p&gt;

&lt;p&gt;I thought we made a huge improvement in deployment when &lt;a href=&quot;http://www.scootersoftware.com/&quot;&gt;Beyond Compare&lt;/a&gt; came out and we had that killer binary compare feature. I loved the ability of only moving code from my machine to production line-by-line. In retrospect I realize how crazy that sounds. It worked for me because the typical workflow I was using is flawed.&lt;/p&gt;

&lt;p&gt;The Subversion/Vault/SourceSafe type repositories helped push me down this crazy workflow path because merging with them has always been atrocious. One common workflow is that there is a central dev repository and a central production repository. The dev team checks in-and-out of the dev repository for several weeks until a scheduled deploy comes up. The dev them then needs to individually go into the dev repo and move their code over to the prod repo manually with a tool like Beyond Compare. Here is where I liked the line-by-line compare. The dev repo is incomplete; devs still might have the hood up on changes that are not production ready. If you move an entire file over that multiple programmers have touched, you are likely to move something into the production repo that is not production ready. This could break the build, or even worse, bring down the entire application on the next push.&lt;/p&gt;

&lt;p&gt;By now you probably have a laundry list of things that are very wrong about what I just described. Truth is this workflow is very common. Now that I’ve seen the light and have moved away from traditional source control to &lt;a href=&quot;http://en.wikipedia.org/wiki/Distributed_revision_control&quot;&gt;DVCS&lt;/a&gt;, things have become much easier. If you are stuck in a world where your source control sucks, then I encourage you to &lt;a href=&quot;http://blog.coovtech.com/your-source-control-sucks&quot;&gt;move away from it&lt;/a&gt;. Gone are worries about massive merges. Exclusive checkouts; you don’t need them. It’s source control that is out of your way.&lt;/p&gt;

&lt;p&gt;Remember that with DVCS, you commit early and often. You can commit until your fingers are sore. You can commit code that is buggy, that breaks the build, that would make your friends cry. It’s the push to the dev (or central) repository that you want to be working. Many programmers don’t understand what this means. They are used to checking out a file and not checking it back in again until it’s working. This could be days, or even weeks. Some might do exclusive checkouts, forcing other programmers to go renegade on a file; it’s terrible. This is not source control; rather it’s a dumbed-down change management file logger thingy that is very inefficient in a team environment.&lt;/p&gt;

&lt;p&gt;##Deployment for a team with AppHarbor&lt;/p&gt;

&lt;p&gt;Here is the easiest way to automate deployments in a team environment while keeping buggy code that is not production ready:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create an AppHarbor account and setup either &lt;a href=&quot;http://support.appharbor.com/kb/getting-started/deploying-your-first-application&quot;&gt;Git&lt;/a&gt; or &lt;a href=&quot;http://support.appharbor.com/kb/getting-started/using-mercurial-on-appharbor&quot;&gt;Mercurial&lt;/a&gt; deployment&lt;/li&gt;
  &lt;li&gt;Create a single repository with two branches (master and dev)&lt;/li&gt;
  &lt;li&gt;The dev team commits changes on their local copy of the dev branch. Change commit, Change commit, over-and-over again until they are happy with their code. &lt;a href=&quot;http://secretgeek.net/image/mercurial_workflow_image.png&quot;&gt;Here&lt;/a&gt; is a good graphical representation of this workflow.&lt;/li&gt;
  &lt;li&gt;Programmers push to the dev branch when their code is ready for testing or review or whatever the next step is in your workflow.&lt;/li&gt;
  &lt;li&gt;If you are a small team and everyone can deploy to production, then you can have a dev get the teams changes on the dev branch, build-review-test them them locally, then merge to production.&lt;/li&gt;
  &lt;li&gt;The merge to the production branch will trigger AppHarbor to build your latest version, run your unit tests if you have any, and will deploy your application to production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployment that’s integrated into a fluid natural workflow. No more having devs move changes from one repo to another that are days, weeks, or months old. No more comparing files. Just code, commit, push.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>What happened to the Archive?</title>
   
     <link href="http://coovtech.com/posts/archive/" />
   
   <updated>2011-06-29T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/archive</id>
   <content type="html">&lt;p&gt;I’m in the process of converting my blog over to GitHub…&lt;/p&gt;

&lt;p&gt;I’m half-done writing a new post about what. In the meantime, I’m writing a script that takes my old posts, converts any that aren’t already in markdown format, then uploads them to GutHub. Stay tuned.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nothing is Urgent</title>
   
     <link href="http://coovtech.com/posts/nothing-is-urgent/" />
   
   <updated>2011-06-14T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/nothing-is-urgent</id>
   <content type="html">&lt;p&gt;Back in 2004 (about 23 internet years ago) I started working on a cool priority management project. We were trying to build a hybrid application that was part helpdesk, part bug tracking, and part priority management. We basically built an internal &lt;a href=&quot;http://www.zendesk.com/&quot;&gt;ZenDesk&lt;/a&gt; on steroids.&lt;/p&gt;

&lt;p&gt;We were using a HelpDesk tool at the time and we baked-in a lot of those standard helpdesk features that you see everywhere. One of those features in particular was the ability for a user to enter a ticket with a priority (low, medium, high, urgent, If you don’t fix this now the world will end).&lt;/p&gt;

&lt;p&gt;I observed almost immediately that just about everyone would choose the earth-shattering, world-ending priority if given the option, making the priority system completely useless.&lt;/p&gt;

&lt;p&gt;Today I switched the &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt; support site from &lt;a href=&quot;http://www.zendesk.com/&quot;&gt;ZenDesk&lt;/a&gt; to &lt;a href=&quot;http://tenderapp.com/&quot;&gt;Tender Support&lt;/a&gt; and I was reminded of the pain of giving users the ability to prioritize things with this KB article from Tender: &lt;a href=&quot;https://help.tenderapp.com/kb/customization/priorities&quot;&gt;Why don’t you have priorities?&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;priorities-seem-great-but&quot;&gt;Priorities seem great, but…&lt;/h2&gt;

&lt;p&gt;When you are first starting out with support, having priorities seems great because it is easy to build a work-flow around a few support requests. The engineers will work on the priority one stuff now, and will get to the other stuff later. What quickly happens is that there is always new stuff coming in and thus always new priority one’s. So what happens to the lower priority stuff? Well, those get knocked out if there is time. But there is never time. The users realize this and so they make everything an urgent priority because if it’s not urgent, then it won’t get done. When everything is urgent, then nothing is urgent. You cannot prioritize a list where everything on that list has to be done first.&lt;/p&gt;

&lt;h2 id=&quot;dont-let-users-prioritize&quot;&gt;Don’t let users prioritize&lt;/h2&gt;

&lt;p&gt;This KB article sums this up best:
&amp;gt;We have found that giving users the option of noting their priority results in them selecting the most urgent one, most of the time. This field really only serves as a place for people to vent their &amp;gt;frustration, and complicates the new entry form until you have eight mandatory fields and even-more-pissed-off users.&lt;/p&gt;

&lt;p&gt;We took the ability to prioritize away from the users. This caused a big stink at first but after the users figured who moved their cheese, everything was ok. What this really did was forced IT to analyze each request and determine where it should go. Sometimes you don’t know. Sometimes you’ll get a request about a broken light, only to discover that the light was not plugged in O-o. No matter what, someone has to manage the incoming stream. I think this responsibility should rotate around IT so that every feels the pain equally but if one person handles it, that’s fine.&lt;/p&gt;

&lt;p&gt;This opens-up more conversation and collaboration. If a user sends in a request and the person responsible for filtering new requests doesn’t know how to handle the request, he or she gets to ask around, talk to users, etc. You know, network a little… This can lead to great knowledge sharing for everyone; users included.&lt;/p&gt;

&lt;h2 id=&quot;educate&quot;&gt;Educate&lt;/h2&gt;

&lt;p&gt;I am a user so I can speak to this with confidence. When you have a problem, nothing else matters. 
&amp;gt;I don’t give a shit if the system is down. That’s not my problem. My problem, which I sent to you, needs to be fixed, yesterday.&lt;/p&gt;

&lt;p&gt;The fact is that to a user, everything is important. If it wasn’t then they would not waste the time to tell you about it. They don’t care about other problems. Why should they?&lt;/p&gt;

&lt;p&gt;Back to the KB article:
&amp;gt;In our experience, not providing this field means that your users will put “URGENT” in all their titles until you educate them that all requests are, in fact, a priority, since that’s what we’re doing – supporting their requests&lt;/p&gt;

&lt;p&gt;I don’t think this can be avoided with traditional HelpDesk systems and the culture that goes with it. What needs to happen is education. Educate users that everything is a priority and deliver on that. Don’t be afraid to be honest with users. Transparency rules even if the user could care less. If you want to deliver four nines to your clients, then let everyone know that IT drops EVERYTHING for system hiccups and nothing else matters until those hiccups are solved. A user might not like that but it is better then giving them the feeling that their problem is being looked at now because they marked it as urgent when the fact is that it’s moved to some back-log and wont be looked at for a week, or a month, or longer…&lt;/p&gt;

&lt;p&gt;Just remember that no matter how many emails, or blog posts, or KB articles that you write, users will eventually forget how the system works. Education must be constant and ever changing. Clever users, like myself, will put filters on your annoying emails about how to use the support system, so change them up from time-to-time.&lt;/p&gt;

&lt;h2 id=&quot;nothing-is-urgent&quot;&gt;Nothing is urgent&lt;/h2&gt;

&lt;p&gt;Ok, that is a lie. In an emergency room, there are things that are urgent. But someone has to filter the patients to determine who has life threatening injuries and who can wait. If the hospital let the patients decide priority, you’d have the person with a gunshot wound to the head waiting on the little girl in a tutu who sprained her ankle at ballet practice.&lt;/p&gt;

&lt;p&gt;Helpdesk is like triage in a way. Someone needs to make decisions and route the work to the appropriate place, not the users.&lt;/p&gt;

&lt;h2 id=&quot;moxie&quot;&gt;Moxie&lt;/h2&gt;

&lt;p&gt;I applaud Tender Support for building their helpdesk system without a priority function. It takes guts to be different; to go against the status quo and I love that they are open about it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Spoiled by technology</title>
   
     <link href="http://coovtech.com/posts/spoiled-by-technology/" />
   
   <updated>2011-06-07T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/spoiled-by-technology</id>
   <content type="html">&lt;p&gt;One of the features of being a contractor is freedom of movement. You can travel anywhere in the world, and as long as you have a laptop and a wifi connection, you can be productive. I’ve enjoyed the freedom of coding in a local starbucks, a local pub, even awesome co-locations sites like &lt;a href=&quot;http://gangplankhq.com/&quot;&gt;GangPlank&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Internet is truly a beautiful thing.&lt;/p&gt;

&lt;h2 id=&quot;except-when-there-is-no-internet&quot;&gt;Except when there is no Internet&lt;/h2&gt;

&lt;p&gt;Today I’m traveling to D.C. - working when I can, vacationing when I can. My plan was simple. Code 4+ hours on the flight out, 4+ hours on the flight back, and a couple of hours each day where I can.&lt;/p&gt;

&lt;p&gt;I’ve worked on an airplane several times now. It’s surprisingly productive. There are no distractions really, just you in a claustrophobic space with a tiny laptop (using the wife’s macbook air). I’ve been able to kick out a ton of code, respond to email, chat with co-workers, etc.&lt;/p&gt;

&lt;h2 id=&quot;the-panic-ensues&quot;&gt;The panic ensues&lt;/h2&gt;

&lt;p&gt;So we take off, I fire-up the iPad for the wife so she can watch movies, then I log-on my computer and get ready to knock out some defects that need to be fixed before for a deploy tonight, and a new feature for a customer portal website I’m working on.&lt;/p&gt;

&lt;p&gt;There is no WiFi.&lt;/p&gt;

&lt;p&gt;What? No WiFi? - I had several emotions at that moment. Anger, frustration, panic, then it hit me. I just assumed that there was WiFi on my flight because I never thought there would not be. I’ve had WiFi on the last three flights I’ve taken. I just assumed that WiFi was assimilated into U.S. air travel.&lt;/p&gt;

&lt;h2 id=&quot;i-did-not-plan-for-this&quot;&gt;I did not plan for this.&lt;/h2&gt;

&lt;p&gt;This goes against the whole AgileZen/Kanban thing of eliminating waste. I’m 30,000, probably over Texas right now, with no Internet. I have no movies on this computer, no games, this is my wife’s machine so I don’t have a VM on it and can’t work on local .net projects. I effectively have a $1,200 text editor.&lt;/p&gt;

&lt;h2 id=&quot;its-my-fault&quot;&gt;It’s my fault&lt;/h2&gt;

&lt;p&gt;For assuming my plan would just fall into place without creating a backup plan. How silly of me. I took the wife’s laptop because all I needed was VPN and remote desktop. I should have installed a VM on this machine, or brought my laptop just in case something went wrong. I should have brought some school essays I need to complete. I should have brought some SideBox features that I need to knock out. I should have pulled-down some contracting work locally so that I could code against it here and upload it later. No XCode. No Rails. No .NET. No MonoTouch. I have TextEditor and Terminal.&lt;/p&gt;

&lt;p&gt;So, here I sit, wondering what I could build with TextEditor and Terminal. Maybe I’ll blog about how bad it sucks to not have WiFi when you really counted on it…&lt;/p&gt;

&lt;h2 id=&quot;ill-play-catch-up&quot;&gt;I’ll play catch-up&lt;/h2&gt;

&lt;p&gt;When I get to the hotel room, I’ll just VPN into work and try to catch-up. Well, here at the Radisson, you can’t VPN on their public network. I called down to inquire about it and they tell me I have to use the wired connection. Guess what they don’t provide… Guess what I did not bring…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Your Source Control Sucks</title>
   
     <link href="http://coovtech.com/posts/your-source-control-sucks/" />
   
   <updated>2011-06-01T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/your-source-control-sucks</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Did anyone make any changes to [fill in the blank] code?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This question makes my blood boil yet it’s a question that I’ve asked probably 100 times over for the last five years. If you are asking this question too then guess what, you don’t have source control and what you are using sucks.&lt;/p&gt;

&lt;p&gt;Source control is supposed to help you track changes. If you are asking the question above it means that whatever source control system you are using sucks at tracking changes, or you haven’t figured out how it tracks changes. So all source control is really helping you with is backing up your files. That’s not the point of source control… Why not just use dropbox and stop wasting time checking files in and out?&lt;/p&gt;

&lt;p&gt;##What’s the solution?&lt;/p&gt;

&lt;p&gt;If you haven’t already guessed, this is a post about DVCS (distributed version control systems). About a year and a half ago I started playing around with &lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt;, a popular DVCS, because I wanted to start getting involved in open-source projects I was finding on &lt;a href=&quot;http://www.github.com&quot;&gt;GitHub&lt;/a&gt;. I thought DVCS was cool and the idea of forking and cloning was cool but I did not fully understand or appreciate the value of DVCS until we started using &lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;Mercurial&lt;/a&gt; for &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt; in a team environment.&lt;/p&gt;

&lt;p&gt;I took the Joel Spolsky &lt;a href=&quot;http://hginit.com/&quot;&gt;Hg init&lt;/a&gt; tutorial and I immediately began to see the light. What resonated with me the most was two things. 1) Branching and Merging work and you no longer need to run in fear from it and 2) You are encouraged to branch or fork or clone to try out new things and throw them away if you don’t need them. As if your giant Visual Studio project was nothing more than a plain old scratch pad.&lt;/p&gt;

&lt;p&gt;I was the same guy Joel is talking about in his intro. Afraid to make experimental changes. Kept files checked out for weeks, if not longer. Hated. No no, dreaded having to merge and would often find reason to postpone it. But not any more. Joel says it just works and you should take his word for it because it does.&lt;/p&gt;

&lt;p&gt;##Getting to the point&lt;/p&gt;

&lt;p&gt;When someone makes a change in a DVCS system and they have pushed it out and infected everyone else with it, you don’t have scream over your cubicle wall asking “who just changed the blablity blah blah?” because you have the change set. You get to see who changed what, when, and why. You don’t have to traverse a massive folder structure in your POS repository looking for the most recent dates on files because you have the change set and you know who changed what, when, and why.&lt;/p&gt;

&lt;p&gt;And guess what? When you figure out who infected you with their shitty code, you are a command away from ripping their change set out from your copy. No more spending hours rolling back individual files, or trying to find the right labels or blah blah. It works the way version control should work; by tracking change sets.&lt;/p&gt;

&lt;p&gt;I should point out that it is not fool proof… If you deploy changes to production without pushing your commits to the team repository then you will probably still scream over the cubicle wall. Don’t do that unless you are a team of two, wink wink.&lt;/p&gt;

&lt;p&gt;So stop asking that silly question and start busting heads until someone with the power to pull the trigger on moving you to DVCS does just that.&lt;/p&gt;

&lt;p&gt;P.S. I prefer Git over Mercurial. Not for some religious reason. I simply happen to be a big fan of &lt;a href=&quot;http://www.gitboxapp.com/&quot;&gt;GitBox&lt;/a&gt;. Simple to use and it gets me out of the terminal.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tools list for the mac and windows programmers</title>
   
     <link href="http://coovtech.com/posts/tools-list/" />
   
   <updated>2011-05-28T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/tools-list</id>
   <content type="html">&lt;p&gt;I’m a big fan of Scott Hanselman’s &lt;a href=&quot;http://www.hanselman.com/tools&quot;&gt;Ultimate Developer and Power Users Tool List for Windows&lt;/a&gt;. It’s my go-to page whenever I get a new machine. But I’m no longer a Windows guy. I’m a Macdows guy. I
still code C# .Net (with Mono) on the mac, but a lot of these tools are cross-platform.&lt;/p&gt;

&lt;p&gt;I just got a new setup to complete my &lt;a href=&quot;http://blog.coovtech.com/indy-office&quot;&gt;indi-developer work station&lt;/a&gt;. I’m running the new iMac with a LED Cinema connected to it. I used to boot into Windows 7 when I needed to work on &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt; or other contracting work, and boot into OS X when I needed to code iPhone or do school or anything else. This time around I’ve gone virtual with Parallels. I run Windows 7 Pro as a VM. This way I’m running both OS X and Windows 7 at the same time. In fact, Parallels has this coherence mode where it runs your windows applications as if they were part of the OS X environment. It’s slick!&lt;/p&gt;

&lt;p&gt;Anyway, as I was setting up my new work station, I wanted document the apps I was installing. I thought my list would be massive, like Scott’s, but it turns out I use two applications about 99% of the time and don’t really screw around with much else.&lt;/p&gt;

&lt;p&gt;Here is the breakdown of what I installed for OS X, Windows 7, and both:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OS X&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.sparrowmailapp.com/&quot;&gt;Sparrow&lt;/a&gt; - I hate email and that’s why I love Sparrow. Simple minimal design, works with iMap, Mac look &amp;amp; feel.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.parallels.com/&quot;&gt;Parallels&lt;/a&gt; - Let’s me run Windows 7 &amp;amp; Ubuntu VM’s. Better than VMWare Fusion.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mono-project.com/&quot;&gt;Mono&lt;/a&gt; (&lt;a href=&quot;http://monodevelop.com/&quot;&gt;MonoDevelop&lt;/a&gt;, &lt;a href=&quot;http://monotouch.net/&quot;&gt;MonoTouch&lt;/a&gt;, &lt;a href=&quot;https://github.com/migueldeicaza/MonoTouch.Dialog&quot;&gt;MonoTouch.Dialog&lt;/a&gt;) - Build iPhone and iPad apps with C#. Nuff said.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ditchnet.org/httpclient/&quot;&gt;HttpClient&lt;/a&gt; - Simple HTTP tester&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.twitter.com/2011/01/twitter-for-mac.html&quot;&gt;Twitter for Mac&lt;/a&gt; - Clean, simple, minimal, my favorite Twitter client&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://macromates.com/&quot;&gt;Textmate&lt;/a&gt; - Started to dabble with Ruby on Rails, heard Textmate would get me there without having Visual Studio withdrawls&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://smilesoftware.com/TextExpander/&quot;&gt;TextExpander&lt;/a&gt; - It’s like &lt;a href=&quot;http://en.wikipedia.org/wiki/IntelliSense&quot;&gt;intellisense&lt;/a&gt; for everything&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.gitboxapp.com/&quot;&gt;Gitbox&lt;/a&gt; - If you want to leave the terminal, this is the best GUI for Git on the mac&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://rubyonrails.org/&quot;&gt;Ruby On Rails&lt;/a&gt; - I like to dabble with other non- Microsoft technologies&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows 7&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/visualstudio/en-us/home&quot;&gt;Visual Studio&lt;/a&gt; - MVC, WPF, and Windows Phone 7 stuff&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.nuget.org/&quot;&gt;NuGet&lt;/a&gt; - Ruby Gems for the .NET world&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.scootersoftware.com/&quot;&gt;Beyond Compare&lt;/a&gt; - Best compare and FTP tool on this planet&lt;/p&gt;

&lt;p&gt;SQL 2008 Dev - Datebase, duh&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/web/webmatrix/&quot;&gt;Web Matrix&lt;/a&gt; - New Microsoft tool for building basic websites, fast. Razor + MVC + Templates&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.asp.net/mvc/mvc3&quot;&gt;MVC3&lt;/a&gt; + &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx&quot;&gt;Razor&lt;/a&gt; - Leave web forms in the dust&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://notepad-plus-plus.org/&quot;&gt;Notepad ++&lt;/a&gt; - Because notepad and textpad suck&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://storm.codeplex.com/&quot;&gt;Storm&lt;/a&gt; - Best tool for testing web services&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.google.com/chrome&quot;&gt;Chrome&lt;/a&gt; - Best browser. Debugging not as good as Firebug, but it’s good&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.dropbox.com/&quot;&gt;DropBox&lt;/a&gt; - Can’t live without it. Love the folder sharing&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.lastpass.com/2010/12/lastpass-acquires-xmarks.html&quot;&gt;LastPass + XMarks&lt;/a&gt; - Sick of typing in passwords?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt; + &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; - Contribute to open-source. Also great for just backing-up side projects&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;Mercurial&lt;/a&gt; + &lt;a href=&quot;https://bitbucket.org/&quot;&gt;BitBucket&lt;/a&gt; - Another DVCS like Git&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsonviewer.stack.hu/&quot;&gt;JSONViewer&lt;/a&gt; - JSON is nasty to look at in big chunks&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.evernote.com/&quot;&gt;Evernote&lt;/a&gt; - Brain in the cloud&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pixlr.com/&quot;&gt;Pixlr&lt;/a&gt; - Awesome cloud image editor&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.skype.com/intl/en-us/home&quot;&gt;Skype&lt;/a&gt; - Must have for collaboration&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://agilezen.com/&quot;&gt;AgileZen&lt;/a&gt; - I visualize projects in kanban&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://37signals.com/&quot;&gt;Basecamp &amp;amp; Campfire&lt;/a&gt; - Must have if you work on a team&lt;/p&gt;

&lt;p&gt;I’ll try to keep this list fresh for OS X and Windows devs as I find new tools.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Indy Office</title>
   
     <link href="http://coovtech.com/posts/indy-office/" />
   
   <updated>2011-05-27T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/indy-office</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://farm6.staticflickr.com/5106/5766392562_b5336098df.jpg&quot; alt=&quot;http://www.flickr.com/photos/crystalandbilly/5766392562/&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm4.staticflickr.com/3435/5766392236_5ffb5cfa1f.jpg&quot; alt=&quot;http://www.flickr.com/photos/crystalandbilly/5766392236/&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm3.staticflickr.com/2180/5765844995_1ef480237e.jpg&quot; alt=&quot;http://www.flickr.com/photos/crystalandbilly/5765844995/&quot; /&gt;&lt;/p&gt;

&lt;p&gt;My trusty ASP.NET MVC book makes a great stand for my second display. It just happens to line up the monitor almost perfectly with my computer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm4.staticflickr.com/3101/5766391712_79341256fd.jpg&quot; alt=&quot;http://www.flickr.com/photos/crystalandbilly/5766391712/&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I need to work on the lighting in the office. I like the office dark some of the time, but it is difficult to bring in natrual light when I want it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm3.staticflickr.com/2297/5766332826_dc031ac795.jpg&quot; alt=&quot;http://www.flickr.com/photos/crystalandbilly/5766332826/&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Percocet is the answer</title>
   
     <link href="http://coovtech.com/posts/Percocet/" />
   
   <updated>2011-05-27T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/Percocet</id>
   <content type="html">&lt;p&gt;&lt;em&gt;This is a non-technical rant. You’ve been warned.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was injured in a softball game on Wednesday night. It’s kinda of embarrassing how it happened. The guy batting before me hit an opposite field laser that exposed a shitty right-fielder that the other team had. I tried the same and when I hit the ball, I immediately felt pain on my left side. It felt like I pulled something.&lt;/p&gt;

&lt;p&gt;I kept playing and in my next at-bat, the real pain started. I hit the ball and dropped to the ground in pain. I knew something was messed up…&lt;/p&gt;

&lt;p&gt;I went to urgent care the next day and they started by taking upper chest x-rays. I told them, you are wasting your time. I have no chest pain, no lung pain, the pain I have is on my lower left side. Look there.&lt;/p&gt;

&lt;p&gt;##Dumb ass…&lt;/p&gt;

&lt;p&gt;Is probably what they thought because they insisted on the x-ray. Later on, when I got to see the doctor, he justified his decision by saying that sometimes in sports, players can separate a lung from the {blah blah}. I said to the doctor that I’d imagine the pain that would cause would be immense and it would hurt just to breath. He agreed. I said, I don’t have that problem. My side hurts. It’s like a {pain in the ass}, but its on my side.&lt;/p&gt;

&lt;p&gt;He then went through the process of elimination of what my injury wasn’t until he finally told me what I had done. He then went right into pain killers. Asking how I felt about them. I said that I hadn’t taken pain killers since I broke my foot in the same place for a second time, but only for a day or two (That was back in ‘02 I think). My preference was just Aleve for inflammation and Advil or Tylenol for the pain. I just wanted to know what happened.&lt;/p&gt;

&lt;p&gt;##Dumb ass…&lt;/p&gt;

&lt;p&gt;Is probably what he thought because he shook his head at me and said I’m giving you Percocet for the pain and Naproxen to help with the inflammation. He then went into a spiel about why I needed these drugs and how each was going to help.&lt;/p&gt;

&lt;p&gt;##I see what you did there&lt;/p&gt;

&lt;p&gt;He just prescribed me Tylenol and Aleve; prescription versions that are just slightly stronger than what you can buy over the counter. Why? I just speculate and say that is standard operating procedures to get dumb-asses to pay you.&lt;/p&gt;

&lt;p&gt;##Dumb ass…&lt;/p&gt;

&lt;p&gt;I filled the prescriptions. While doing so I had an epiphany… I am a dumb ass. I’m filling these prescriptions. They knew I was a dumb ass. They got me.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The American Express Economy</title>
   
     <link href="http://coovtech.com/posts/amex-economy/" />
   
   <updated>2011-04-26T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/amex-economy</id>
   <content type="html">&lt;p&gt;Quick back-story. I was trying to reserve a car with my Amex points for a trip I’m taking to Virginia. My wife and I are going on a short vacation and I had some Amex points so I wanted to splurge a little and rent us a convertible Mustang. During our trip, we are driving up to New York for a day and that calls for a Mustang drop-top, right?&lt;/p&gt;

&lt;p&gt;Turns out that most car rental agencies don’t make convertibles available for gift certificate buyers (that’s how you rent a car with Amex points… Gift certs). I’m sure it’s because the convertibles are difficult to keep in inventory and Amex probably only pays out pennies on the dollar for those certificates. The car rental agencies want to save those premium cars for cash paying customers. Fine, I get that.&lt;/p&gt;

&lt;p&gt;So then I started looking at other things that I could use my Amex points on and I came across some &lt;a href=&quot;http://www.hermanmiller.com/&quot;&gt;Herman Miller&lt;/a&gt; chairs. I’m going to buy one this year anyway so it made sense to use points if I can. I looked up how much the &lt;a href=&quot;http://www.amazon.com/Herman-Miller-Mirra-Chair-Loaded/dp/B0002K11BK/ref=sr_1_1?s=home-garden&amp;amp;ie=UTF8&amp;amp;qid=1303872270&amp;amp;sr=1-1&quot;&gt;Herman Miller Mirra chair&lt;/a&gt; was and Amex will give it to you for 126,300 points. I only have 91,581 points available so I figured I could just pay the difference in cash. I was pumped. Could I really get the Herman Miller chair I want for a couple hundred dollar plus my Amex points?&lt;/p&gt;

&lt;p&gt;##Not on this planet, not in the amex economy&lt;/p&gt;

&lt;p&gt;Here is the math. I currently have a 3.9 college GPA but I still suck at math so please correct me if I’m wrong…&lt;/p&gt;

&lt;p&gt;At Amazon, the Herman Miller Mirra sells for $799.00. Take 126,000 points divided by $799 and that puts the Amex point value at 158.07 per $1. When you add the Mirra to your cart and go to checkout, the Amex website tells you that you don’t have enough points and that you need to purchase more. You can purchase points from Amex at 40 points per $1 but you have to buy them in 1,000 point increments. So I needed to buy 35,000 points in order to have enough points to get the chair. So, 35,000 divided by 40 points per $1 comes out to $875.00 that I need to come up with to by my chair that costs $799 from Amazon. That’s $76 more for the chair, plus I’m giving up 91,581 points in the process.&lt;/p&gt;

&lt;p&gt;If you did not follow all of that, here is the short version: Amex just broke into my home, robbed me, stole my children, and sold them on ebaY for $1 just because they can.&lt;/p&gt;

&lt;p&gt;What a joke. Here is what the real math should be: You take the points per dollar cost of 158.07 and figure out how much money I have with 91,581 points; it comes to $579.37. This means I’m short $219.63. That’s what I should pay in cash…&lt;/p&gt;

&lt;p&gt;##So what?&lt;/p&gt;

&lt;p&gt;Yeah yeah, I can read your mind. “Duh Billy, everyone knows the points systems are crap”. I knew the points system is backed by clever marketing, but I was totally caught of guard by running the numbers myself. The net result is that to complete this transaction, it actually means my points have a negative monetary value. Well hot damn!&lt;/p&gt;

&lt;p&gt;I feel like  a total idiot for getting excited about this. There has to be something you can use your points on where you at least get the feeling where you come out on top. I’m going to find that thing, whatever it may be…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Social coding - better than college</title>
   
     <link href="http://coovtech.com/posts/social-coding/" />
   
   <updated>2011-04-19T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/social-coding</id>
   <content type="html">&lt;p&gt;A few years back when social networking exploded, I was a little slow to catch on. I had a MySpace and Facebook account, but I thought social networking was sort of silly at the time. I was mostly posting pictures on Flickr, and blogging occasionally so my family could keep up with what I was doing. It was &lt;a href=&quot;http://azcoov.blogspot.com/2008/03/our-son-liam-was-born-with-very-mild.html&quot;&gt;this post about my son&lt;/a&gt; that actually that kicked-off my desire to blog and and write as much as I could.&lt;/p&gt;

&lt;p&gt;I began to research how to blog and came across post from &lt;a href=&quot;http://www.hanselman.com/&quot;&gt;Scott Hanselman&lt;/a&gt; that described the do’s and dont’s of blogging. I think it was his post on &lt;a href=&quot;http://www.hanselman.com/blog/BlogInteresting32WaysToKeepYourBlogFromSucking.aspx&quot;&gt;32 ways to keep your blog from sucking&lt;/a&gt; that gave me everything I needed to get going. It was also Scott Hanselman, and his podcast &lt;a href=&quot;http://www.hanselminutes.com/&quot;&gt;Hanselminutes&lt;/a&gt;, that turned me on to Twitter.&lt;/p&gt;

&lt;p&gt;Once I was on Twitter I began following people that I felt were interesting. People like &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel Spolsky&lt;/a&gt;, &lt;a href=&quot;http://www.codinghorror.com/&quot;&gt;Jeff Attwood&lt;/a&gt;, &lt;a href=&quot;http://www.loudthinking.com/&quot;&gt;DHH&lt;/a&gt;, &lt;a href=&quot;http://scobleizer.com/&quot;&gt;Robert Scoble&lt;/a&gt;, &lt;a href=&quot;http://scripting.com/stories/2007/02/21/daveWinerBio.html&quot;&gt;Dave Winer&lt;/a&gt; are some examples. These are people that I consider pioneers in whatever field/interest they are involved in. The interesting thing about following these people on Twitter is that you get exposed to (concepts, thoughts, ideas, links) that you’d never know about if you weren’t reading your stream. For example, I’ve learned a ton about being an entrepreneur from Joel, bootstrapping a startup from DHH, and the crazy startup life from Scobilizer.&lt;/p&gt;

&lt;p&gt;The net effect this has is high-quality self education. Someone posts a link to a blog post, you read it, bam! you are that much smarter. Sometimes a post, or a link, or a comment can have a life changing impact on you. &lt;strong&gt;That sounds extreme doesn’t it&lt;/strong&gt;? I’ll give you a REAL example of how this can spiral into something amazing…&lt;/p&gt;

&lt;p&gt;There was a postcast that I listened to from Hanselminutes where &lt;a href=&quot;http://www.hanselminutes.com/default.aspx?showID=152&quot;&gt;Scott interviewed the StackOverflow team&lt;/a&gt; about their new website, and more specifically their use of ASP.NET MVC. Scott really drilled into Jeff to get the details of their site and what they were doing with MVC. He also gave Jeff and team crap about some decisions that they made and I thought that was bold, but perfect. Some veteran programmers suck at the whole “this is how you should do it because I have n years experience doing it this way” education but Scott nailed it. This podcast was the catalyst for me jumping into MVC. Once I knew the StackOverflow guys were using it, and Scott was a fan, I had to kick the tires.&lt;/p&gt;

&lt;p&gt;I loved MVC so much that I took it to work, sold some people on the idea, and implemented several production MVC apps for our company. Still to this day these production MVC apps are probably the least problematic sites I have every built. Easy to change, easy to improve, hard to break. Remember the “life changing impact” thing I mentioned above? MVC with jQuery was enough to get my business partner &lt;a href=&quot;https://plus.google.com/114935695547485374091&quot;&gt;Barry Harkness&lt;/a&gt; and I so excited about the web again (we strayed away to win forms for a while) that we decided to start a business together called &lt;a href=&quot;http://www.sidebox.com/&quot;&gt;SideBox&lt;/a&gt; that is built on… wait for it… ASP.NET MVC.&lt;/p&gt;

&lt;p&gt;##Get to the point already!&lt;/p&gt;

&lt;p&gt;Through all of these social networking connections, I learned about social coding with websites like GitHub, BitBucket, CodePlex, and Google Code. What’s so important about social coding? &lt;strong&gt;Knowledge exchange&lt;/strong&gt;. As software programmers, we have ideas all day long. We might have a scratch file here, or a mini project there. We might even have a huge idea we’ve been working on for years, adding code to it day-by-day. Social coding enables us to share these ideas with friends and strangers. There are different types of sharing too. You can look at someones real code, and become smarter. You can clone someones project and compile it yourself, and become smarter. You can fork someones code, sprinkle in your own ideas, and become smarter. You can even pay it forward by forking, adding your ideas, and send pull requests so that others can consume your code, and become smarter.&lt;/p&gt;

&lt;p&gt;Social coding can be fun. For example, I wanted to re-create that little toaster thing that pops down on Twitter when you change your profile, so I hacked it together and invited a friend/co-worker of mine to join-in the fun. We now have it running in two production apps.&lt;/p&gt;

&lt;p&gt;Social coding can save your ass. Seriously. Could you imagine building a .NET web app without &lt;a href=&quot;http://code.google.com/p/elmah/&quot;&gt;ELMAH&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Social coding is fast. This morning, &lt;a href=&quot;http://marcgravell.blogspot.com/&quot;&gt;Marc Gravell&lt;/a&gt; posted a &lt;a href=&quot;http://code.google.com/p/mvc-mini-profiler/&quot;&gt;profiling tool&lt;/a&gt; he built for ASP.NET MVC apps. I was like “holy crap, I need this”. I cloned his code, implemented it in an app I was working on, and bam! I had performance profiling. I was instantly surprised at the performance data and was able to correct a wrong assumption I made about a slight performance bottleneck in the app.&lt;/p&gt;

&lt;p&gt;Social coding can change your future… I started following &lt;a href=&quot;http://tirania.org/blog/&quot;&gt;Miguel de Icaza&lt;/a&gt; and learned about a killer API called &lt;a href=&quot;http://tirania.org/blog/archive/2010/Feb-23.html&quot;&gt;MonoTouch.Dialog&lt;/a&gt; he built for simplifying the pain of creating iPhone user interfaces in &lt;a href=&quot;http://monotouch.net/&quot;&gt;MonoTouch&lt;/a&gt;. I cloned it and ran the sample app that he built. I could not believe how simple it was. I forked it and added a feature to Miguel’s sample code. It was just a different approach that was built off a sample he already provided and I thought it would be useful for others to learn how to do. Even though my contribution is mostly irrelevant compared to everything Miguel has done, I think it’s awesome that Miguel was able to share that code and that I was able to pay it forward, if only slightly. I’m now using MonoTouch.Dialog for building 100% of the UI for the SideBox iPhone app.&lt;/p&gt;

&lt;p&gt;##And finally, the catchy title is explained.&lt;/p&gt;

&lt;p&gt;I’ve been going to the University of Phoenix for the last two years. I have one more class (5 weeks) before I graduate. I’m currently in my 6th of 6 total coding classes in the software engineering program. The first two we SQL. The next four classes were Java and VB. In JAVA I, we spent four weeks building a mortgage payment calculator console application. In JAVA II, we spend four weeks building a mortgage payment calculator desktop application. In VB I, we spent four weeks building a mortgage payment calculator console application. In VB II, we will be spending the remaining three weeks finishing our mortgage payment calculator desktop application. This is not a joke, but what a joke. That’s $20k folks! At least I’ll be a software engineer that can build you the best damn mortgage payment calculator you’ve ever seen.&lt;/p&gt;

&lt;p&gt;I can honestly say that I’ve learned more in a week from Twitter resources, than I have learned from four years in college.&lt;/p&gt;

&lt;p&gt;If I were teaching at the UoP (I hope I can someday, but it’s unlikely after this post), I would throw their textbooks away. Every student would have a GitHub (or the equivalent) account, and we would learn about programming and design and source control and deployments and debugging and everything that a programmer will actually do on day one as a programmer. I would find some open-source projects and have students clone them and study them. I would have them listen to podcasts like &lt;a href=&quot;http://herdingcode.com/&quot;&gt;Herding Code&lt;/a&gt;, or &lt;a href=&quot;http://www.thisdeveloperslife.com/&quot;&gt;This Developers Life&lt;/a&gt; and quiz them about it. We would have code jams. I would try to hook up with local businesses that were hurting for software development and try to create a program where the students would build actual working software for them. We would learn about agile. If textbooks were required, I would let students choose two books from my personal library that only has two books (&lt;a href=&quot;http://www.stevemcconnell.com/cc.htm&quot;&gt;Code Complete&lt;/a&gt; and &lt;a href=&quot;http://blog.objectmentor.com/articles/2008/04/08/clean-code-whew&quot;&gt;Clean Code&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Social coding, twitter, blogs - better than college.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Parsing Json with MonoTouch and MonoTouch.Dialog</title>
   
     <link href="http://coovtech.com/posts/parsing-json-monotouch/" />
   
   <updated>2011-04-14T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/parsing-json-monotouch</id>
   <content type="html">&lt;p&gt;When i first started building the SideBox iPhone app, I tried to parse Json using native .net api’s. I failed. Why? Well mostly because I did not know what I was doing, but also because I was under a pinch to bang it out quickly. Back then I decided to go with a port of the JSON.NET library called Newtonsoft.Json. It has worked well for me up until recently. I began processing some nested json with weird arrays and such and my Json parsing started breaking down. Probably my fault, but I again was in a pinch and needed to bang out a quick solution.&lt;/p&gt;

&lt;p&gt;I knew that the MonoTouch.Dialog app named TweetStation was using System.Json so I took a peak at that source code and it turns out things have gotten really simple in .net for parsing. Here is an example of how I’m using System.Json to parse Json coming back from an HttpWebResponse, and creating an iPhone UI with a list of StackOverflow questions that lets you drill-down to the question’s set of tags:&lt;/p&gt;

&lt;p&gt;I’m using the StackExchange StackAppsAPI to fetch questions tagged with MonoTouch. Here is the entire source code to render this iPhone UI:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/921142.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>iPhone GPS location with MonoTouch</title>
   
     <link href="http://coovtech.com/posts/gps-monotouch/" />
   
   <updated>2011-04-06T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/gps-monotouch</id>
   <content type="html">&lt;p&gt;My first ever hack-a-thon was a failure. Why? Because the battery on my laptop ran out after about 40 minutes… I suck.&lt;/p&gt;

&lt;p&gt;Here was the challenge… We were trying to come up with a way for customers to start using SideBox and feeding hyper-local search, even if our full-service product is not complete/polished, or customers weren’t ready to take the plunge.&lt;/p&gt;

&lt;p&gt;We needed check-in support from the web, and check-in support from the iPhone (Android &amp;amp; Windows Phone 7 too, but later). Barry tackled the web and I took the iPhone. Barry finished the web side (and database) and it kicks ass.&lt;/p&gt;

&lt;p&gt;After I charged my battery &lt;shakes head=&quot;&quot; in=&quot;&quot; shame=&quot;&quot;&gt; I was able to finish what I started.&lt;/shakes&gt;&lt;/p&gt;

&lt;p&gt;I decided to go with &lt;a href=&quot;http://monotouch.net/&quot;&gt;MonoTouch&lt;/a&gt; and &lt;a href=&quot;https://github.com/migueldeicaza/MonoTouch.Dialog&quot;&gt;MonoTouch.Dialog&lt;/a&gt; again because it’s really freaking easy to use. How easy? Well, to create the fully functional UI that fetches the current location and displays on screen is less than 50 lines of code:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/907167.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Using MonoTouch.CoreLocation we fetch the current location, and return a location object and bam, this is what we get:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/Billy_Coover_MonoTouch_MonoTouch.Dialog.png.scaled700.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is the &lt;a href=&quot;https://github.com/azcoov/MonoTouch-CoreLocation-Example&quot;&gt;source code&lt;/a&gt;. Give it a whirl. You can use the &lt;a href=&quot;http://itouchmap.com/latlong.html&quot;&gt;iTouchMap&lt;/a&gt; website to test the accuracy of the latitude and longitude that you retrieve from the CoreLocation call. Mine is very accurate which is why I blurred out my longitude. I don’t want Facebook stalkers coming over.&lt;/p&gt;

&lt;p&gt;Throw a watch on that GitHub project if you want to see some other things I’ll add to it over the next couple of days (a map and perhaps I’ll integrate with Google’s location data to show annotations of nearby businesses).&lt;/p&gt;

&lt;p&gt;** Update ** 4/7/2011 12:30 pm&lt;/p&gt;

&lt;p&gt;I found this &lt;a href=&quot;https://github.com/conceptdev/Monospace09&quot;&gt;gem of an application&lt;/a&gt; that was built for the monospace conference a couple of years back. I was able to take the code, tweak it, and make it useful in my example in just a couple of minutes. Want to know how far away you are from my &lt;a href=&quot;http://herosaz.com/&quot;&gt;favorite watering hole Hero’s&lt;/a&gt;? BOOM&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/Screen_shot_2011-04-07_at_12.25.36_PM.png.scaled700.png&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Next Chapter</title>
   
     <link href="http://coovtech.com/posts/next-chapter/" />
   
   <updated>2011-03-31T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/next-chapter</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;All men dream but not equally. Those who dream by night in the dusty recesses of their minds wake in the day to find that it was vanity; but the dreamers of the day are dangerous men, for they may act their dream with open eyes to make it possible. - T.E. Lawrence&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After 10 years, 3 months, and 27 days (or 325,641,600 seconds for you geeks), today was my last day as a full-time developer for Concord. I resigned my position as Lead Developer to focus more on &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I feel like a lucky guy. Over the past 10 years I’ve had the privilege to work for a great company in Scottsdale, AZ. A bootstrapped company, with no debt, and a stronghold on it’s industry. I started my job at Concord as a green know-it-all punk fresh out of high-school. Within a few years, I was quickly climbing the ranks, bouncing around departments and consuming knowledge from everyone who’s path I crossed.&lt;/p&gt;

&lt;p&gt;In 2005 I found my passion… Programming. I had just come off a stint as a project coordinator for one of Concord’s biggest projects. We were working with GE Money Bank (GE Capital Financial at the time) and I was exposed to what I consider mind blowing concepts (Six Sigma, optimization, efficiency). It was the combination of the amazing people we worked with at GE, and the awesome programmers at Concord, that made me realize how little I actually knew about business and the real-world. I was humbled. My boss at the time was awesome. She guided me through the murky waters of tight delivery dates, aggressive personalities, and showed me the importance of outside perception.&lt;/p&gt;

&lt;p&gt;I transitioned into a Quality Assurance role at Concord; a position that was new to the company and was the result of the rapid development Concord was doing with GE and some other clients. As a QA Analyst, I had a blast. My responsibility ranged from testing the output of 15 developers, to writing business requirements and test plans, to implementing a new software concept for bug tracking and issue management. I was instantly fascinated with software development and started self-teaching. Within a few months I was writing apps, testing concepts, and having the time of my life. My boss at the time (Barry Harkness) saw what I was doing and the passion I had for programming. Barry and Concord went out on a limb and offered me a job as a very green junior programmer. I took the offer and went to town…&lt;/p&gt;

&lt;p&gt;Since 2005, I quickly grew. Each and every day I was learning something new and each and every day I was getting better at developing software. Not just the code writing aspect, but everything else that goes with it (design, testing, working with users, etc). I became a stickler for details, minimalism, and productivity. I loved learning new techniques and technologies, running new concepts by everyone who would listen. I worked, on average, 60 hour weeks since 2005, not because I had to, but because I was obsessed with programming.&lt;/p&gt;

&lt;p&gt;In 2009, we adopted Agile and it changed me. I worked on a project with three excellent programmers for three months. It was a sprint and it was the most fun I’ve had as a programmer. We worked crazy hours, sometimes pulling all-nighters. It was a sort of hack-a-thon that really brought us together as a team. The end result was that we came away with an award-winning product. I realized that building new products is my passion and working in an Agile team is the best way to develop software. I did not want to stop.&lt;/p&gt;

&lt;p&gt;In late 2010, I partnered up with Barry, my mentor and someone who I highly respect, on a little side-project. Barry and I share a similar passion. We love technology, and building kick-ass products. We are technology evangelists and like to talk the ear off anyone who will listen. Our fit was natural. Barry is a DB guy and understands application architecture like no one I have ever met before. I’m a web guy and got Barry excited about the web again by showing him the power of MVC and jQuery. We worked nights and weekends, building a product framework, until we realized that we had developed something that had real legs.&lt;/p&gt;

&lt;p&gt;So here we are, the next chapter. I have startup fever and want to build a successful business. But I’m not going to stop there. At 29 years old, today is the day I act on my dreams.&lt;/p&gt;

&lt;p&gt;I will never forget where I came from. How can I? It was through Concord that I met my wife Crystal and we now have three beautiful children together. I’ve worked with people are Concord that are much smarter than I am and am humbled by the experience. Thank you Concord.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Creating a Site Map in MVC</title>
   
     <link href="http://coovtech.com/posts/sitemap-mvc/" />
   
   <updated>2011-03-20T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/sitemap-mvc</id>
   <content type="html">&lt;p&gt;I needed a to generate a site map today for some cool things we are planning for &lt;a href=&quot;http://www.sidebox.com&quot;&gt;SideBox&lt;/a&gt;. I turned to, you guessed it, Stackoverflow and found a question about &lt;a href=&quot;http://stackoverflow.com/questions/3193649/parsing-an-atom-feed-via-linq-to-xml&quot;&gt;parsing an Atom feed with Linq&lt;/a&gt; which is exactly what I was looking for.&lt;/p&gt;

&lt;p&gt;Here is the code. I’m scraping content from Stackoverflow as an example:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/879061.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Here are some important tips I learned about Google and how they process site maps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sub domains - This will get you. If you have a domain such as www.coovtech.com and you want include content for your blog at blog.coovtech.com, you will need a separate site map for the blog.coovtech.com sub domain.&lt;/li&gt;
  &lt;li&gt;Change frequency is not as it seems. If you tell Google your change frequency is hourly, don’t count on the Google bots to crawl your site hourly.&lt;/li&gt;
  &lt;li&gt;You can prioritize URL’s relative to other URL’s. So what does that mean? It just provides the Google bot a general guideline on the order in which it should crawl your site. I’m using the default in my example (0.05).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m hoping to get some good analytics from this. I’m looking to see if feeding Google updated site maps in real-time as new content appears has an impact on overall traffic to our site. I’m also looking for any change in page ranking as a result. I suspect there wont be but it will be interesting to watch.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SideBox for iPhone</title>
   
     <link href="http://coovtech.com/posts/sidebox-iphone/" />
   
   <updated>2011-03-15T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/sidebox-iphone</id>
   <content type="html">&lt;p&gt;I’ve been working on the iPhone app for SideBox for the last couple of weeks. It’s been fun, challenging, and engaging. I’m really beginning to understand Git, GitHub, and what social coding is all about. I’m using an open-source library called MonoTouch and MonoTouch.Dialog to write this app. I’ll write more about MonoTouch later. The quick-pitch on MonoTouch is that is allows us poor .NET developers to get in on the iPhone (and Android via MonoDroid) action. MonoTouch.Dialog, to quote Miguel de Icaza, takes the “administrivia” out of building views and lets you focus on getting things done.&lt;/p&gt;

&lt;p&gt;Here is a taste of what we are building, from the SideBox blog:&lt;/p&gt;

&lt;p&gt;We have a road map for features that we want to launch with and I will touch on those in another post. For now, here is a quick-list of features we think you’ll love:&lt;/p&gt;

&lt;p&gt;Dashboard - Simple and to the point. This is your mobile command center. You’ll always have a pulse on what’s important to you; Alerts, Follow-ups, and Tasks. You can stop letting leads slip through the cracks now. 
Customers - You’ll always have your contacts with you in a familiar interface. You can add customers on the fly, do fast look-ups by name, even call and email them right from the app.
Documents - You can manage your estimates and invoices right from the app. Email, Fax, or Print an estimate or invoice right from your phone.
GPS - Google is hungry and we’ve got the food they want. SideBox for the iPhone will power hyper-local search for your business.
Pictures - Open an estimate or invoice, snap a pic, done. It’s that easy. Really!
Screen-shots&lt;/p&gt;

&lt;h3&gt;Screen-shots&lt;/h3&gt;
&lt;p&gt;Here are some screen-shots to nibble on. I don&#39;t want to show too much just yet because I&#39;m not ready for Google to buy us... ;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cdn.sidebox.com/images/iphone_dashboard.png&quot; alt=&quot;SideBox iPhone&quot; /&gt; &lt;img src=&quot;http://cdn.sidebox.com/images/iphone_customers.png&quot; alt=&quot;SideBox iPhone&quot; /&gt; &lt;img src=&quot;http://cdn.sidebox.com/images/iphone_newcustomer.png&quot; alt=&quot;SideBox iPhone&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Happy employees make for happy customers</title>
   
     <link href="http://coovtech.com/posts/happy/" />
   
   <updated>2011-02-19T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/happy</id>
   <content type="html">&lt;p&gt;I can’t think of a more efficient business than Quick Trip. From the gas pump, to buying a coffee, the entire experience is fast and hassle free.&lt;/p&gt;

&lt;p&gt;Consider some of the other convenience store chains (Mesa, AZ area) such as AmPm, or shell. It’s 20 questions at the gas pump and a slow as shit credit card interface. Nine times out of ten, the pump is slow as well.&lt;/p&gt;

&lt;p&gt;When you go to buy something, you have to sign for your purchase, show id, or use debit (no credit cards @ AmPm). Some of the mom-and-pop stores a really frustrating because language barriers prevent them from understanding that Billy is short for William and it leads to a three minute conversation about how I need to update my credit cards because of fraud. All of that over a $.99 pack of gum.&lt;/p&gt;

&lt;p&gt;At QT, it’s different. As soon as you walk in the door, they greet you. Not in a way that requires small talk, but in a way that says “welcome to this store, we kick ass and you will love it”. QT is ALWAYS crowded in the morning, but there is never a wait. Why? Because they kill it at the register. Cash, credit, debit, it doesn’t matter. They handle your money quickly and get you in and out as fast as possible. They don’t require you to sign for your purchase, they don’t give you a receipt by default. They take your card, swipe it, done!&lt;/p&gt;

&lt;p&gt;How do they do it? I think it starts with the people. They remind me of Zappos. They seem to want to be there. They don’t look beat-up. They don’t look like they hate their jobs. They look like they want to be the best. As if the number of happy customers they push through has a direct impact on their salary.&lt;/p&gt;

&lt;p&gt;After people, I think the magic is in software. You can see this at the gas pump. No stupid questions, a fast interface, just pump your gas; done. Inside at the cash register, they have big touch screen monitors and what seems to be a killer POS (Point of sale) system. They navigate the POS system like Tom Cruise in Minority Report. It’s speed tapping, fast price lookups, swipe the card, done.&lt;/p&gt;

&lt;p&gt;They have to be killing it in sales. QT is packed with no wait. Go anywhere else, they are never packed (unless there isn’t a QT nearby). I’ll drive an extra mile out of my way just for their service. Not to mention, the stores are massive and contain a much wider variety then their competition.&lt;/p&gt;

&lt;p&gt;I think we can all learn a lesson from this. What doest it take to do better than your competition? In my opinion, you take care of your employees, make them happy, give them the best tools to be the most efficient, and you have a recipe for success.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Priority Inbox, hurray</title>
   
     <link href="http://coovtech.com/posts/priority-inbox/" />
   
   <updated>2011-02-17T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/priority-inbox</id>
   <content type="html">&lt;p&gt;This just in… I moved to gmail’s priority inbox. We haven’t officially moved to the Google app engine, but we were given some test accounts to work with. So I just moved everything over. It’s very simple to do and you won’t regret it. Here is how I moved over in what seems to be a very seamless transition so far:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create a redirect rule (not a forward rule). The difference is in how the email will appear in your gmail inbox. You don’t want all your email’s to have the “FW:” appended to the subject line.&lt;/li&gt;
  &lt;li&gt;Move the rule to the bottom of all other rules. A redirect rule is a server rule and you’ll want to make sure that it is the last rule applied before the redirect. This ensures that the 40 or so other filters that I currently have will stay intact.&lt;/li&gt;
  &lt;li&gt;Export your contacts to a CSV file. (File &amp;gt; Import and Export &amp;gt; Export to a file).&lt;/li&gt;
  &lt;li&gt;Import your contacts to your gmail account (contacts &amp;gt; import &amp;gt; choose file)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step is to train the priority inbox. You won’t have to do this for very long because it’s smart. Be diligent about marking your emails that are important, and marking emails that are unimportant that slip into your priority inbox. The idea is to give the priority inbox enough information about your email behavior so that it can learn what you care about.&lt;/p&gt;

&lt;p&gt;You might have to break the twice daily email rule, like I did, but that’s ok. We just want to make sure everything is being redirected the way we want it and that nothing slips through the cracks. Once you are confident that your priority inbox is educated, then its back to checking email twice per day, or less. I took a two-day break from the twice daily email check. And, as I expected, I got sucked back into to a few things that weren’t important. But now I’m back.&lt;/p&gt;

&lt;p&gt;Say goodbye to the flaming inbox!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The plight of email</title>
   
     <link href="http://coovtech.com/posts/plight-of-email/" />
   
   <updated>2011-02-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/plight-of-email</id>
   <content type="html">&lt;p&gt;A couple of weeks ago I talked about some of the changes I was making in my life so that I could become more effective both at work, and in my personal life. I’ve significantly reduce the number of meetings that I go to, I’ve been at &lt;a href=&quot;http://inboxzero.com/&quot;&gt;inbox-zero&lt;/a&gt; for weeks, and I’ve been extremely productive. I had an endless list of priorities that I’ve put a significant dent into including an 80 hour project, a 50 hour project, and a 30 hour project (don’t quote me on those exact number, just know they are close), all while working less hours. I’m still less productive while in the office because there are distractions I simply cannot avoid (like the cubicle assassins) but overall things have been great.&lt;/p&gt;

&lt;p&gt;One of the things that I struggled with internally was the perception of responsiveness. Even though I had an epiphany about what being responsive really meant, I was concerned that the status quo I had built for myself was going to cause tension and or conflict. A couple of situations happened over the past week that helped reinforce the conclusion I made that responsiveness did not mean responding to email as fast as possible. Two bugs appeared in two different software applications and I subsequently received emails that had the word ASAP in it somewhere. Sticking to my twice daily email rule, I was able to escalate both problems, one I fixed myself same day, and the other I had escalated to someone who could fix it. Both email senders received a response from me same day stating that the bugs had been resolved. That IS responsiveness.&lt;/p&gt;

&lt;p&gt;While everything in my life is improving as a result of the changes that I recently made, there is still one gap that I want to fix. Email…&lt;/p&gt;

&lt;p&gt;##Email sucks&lt;/p&gt;

&lt;p&gt;I’m up to 43 filters now and my inbox is healthy. I’m able to work my email, twice a day, and as a result I stay at inbox zero during the week. The problem is that I’m still working too much email. The email that I’m still processing can’t be filtered by the built-in outlook filter. It’s context sensitive and requires at least a glance if nothing more. How can you filter email that you just need to glance at? Well… This is where the Gmail Priority Inbox comes in handy. Using smart technology it processes email for you, making sure that the highest priority emails sit at the top of your inbox. I keep hearing that we are moving to the Google App Engine which will give us Gmail and thus the priority inbox. My goal, once I have the priority inbox for work email, is to continue processing email twice per day, but only my priority inbox. I’ll defer the at-a-glace stuff to Google so that all I have to worry about is a very small number of emails to read twice per day.&lt;/p&gt;

&lt;p&gt;What about the other emails that get marked as low priority? Simple. I’ll start out by reviewing those emails every other day until I feel comfortable enough that the priority inbox understands me. After that I think that once or twice per week for non priority email will be sufficient. The trick is coaching the priority inbox. Naturally, it should put email from important people at the top of the list, but only in certain situations. For example, if the sender is important and send something directly to me, that should be at the top. However, if that same sender sends an email to me and a group of other people, the first email should probably hit the priority inbox, but any subsequent emails (at this point the email is a chain and is starting to become spammy) should be at the bottom of the priority inbox, if in the priority inbox at all. The To, Cc, and Bcc should weigh-in on the priority algorithm, making sure that Cc email from important people have less of a priority than To email.&lt;/p&gt;

&lt;p&gt;##Get to the point already…&lt;/p&gt;

&lt;p&gt;The point of the priority inbox, and why I crave it so much, is to eliminate emails like the one below from my main view:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/sig.PNG.scaled1000.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The email has a couple of problems with it, namely the signature, that makes it distracting to me. It violates Scott Hanselman’s &lt;a href=&quot;http://www.hanselman.com/blog/EmailSignatureEtiquetteTooMuchFlair.aspx&quot;&gt;email signature etiquette&lt;/a&gt;. He links to a post from Adam Cogan who listed some suggestions for email signatures:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They should include the phone number – if you want business&lt;/li&gt;
  &lt;li&gt;They should &lt;em&gt;not&lt;/em&gt; have the address/location – rarely needed so find it on the website&lt;/li&gt;
  &lt;li&gt;They should have a URL&lt;/li&gt;
  &lt;li&gt;They should have a tag line (Scott: I disagree)&lt;/li&gt;
  &lt;li&gt;They should &lt;em&gt;not&lt;/em&gt; have the email address&lt;/li&gt;
  &lt;li&gt;I don’t believe in images in footers – although I now have an exception for photos as they make things more personal&lt;/li&gt;
  &lt;li&gt;I believe in a tiny bit of corporate colour – for branding purposes&lt;/li&gt;
  &lt;li&gt;Your big signature should only be included &lt;em&gt;once&lt;/em&gt; a thread&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This email has a very short body and a massive signature. I’m not a big fan of massive email signatures, specifically the ones with the legal language in it. Why am I bagging on the legal language? Simple. It applies, but it is not applicable to me in this email in this context. Did that make sense? What I mean is that if the legal stuff is required, by all means send it out. On your first email that starts a conversation… After that, keep it simple. If you ever get a lunch invite and the email has a massive signature, please tease the person until they change it.&lt;/p&gt;

&lt;p&gt;So in this email example, I want to kill the noise by moving it to the bottom of the priority inbox. I think this will be a challenge for the priority inbox. This email if from an important person who’s emails I do want to see because well, they are important. Usually. I’m sure the Google gods will figure this one out. It might not be that difficult. The email should start with a high weight because the person is very important. Its priority should be lowered once it detects that the email is not directly to me, but Cc’d to me. It should then detect a very short email body and lower the priority even further. Perhaps Google will be kind and let me throw in an email signature ranking as well. ;)&lt;/p&gt;

&lt;p&gt;So the point is to have a fluid email inbox. When you go to process your inbox, you will be most effective when the only email you process requires a next action.&lt;/p&gt;

&lt;p&gt;By the way, here is my email signature. It is a hybrid between &lt;a href=&quot;http://timheuer.com/blog/&quot;&gt;Tim Heuer&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://www.hanselman.com/blog/&quot;&gt;Scott hanselman&lt;/a&gt; and uses my Gravatar (no wasteful storage on our servers) to show my ugly mug:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/myemailsig.PNG.scaled700.png&quot; /&gt;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Twitter Style jQuery Toaster</title>
   
     <link href="http://coovtech.com/posts/jquery-toaster/" />
   
   <updated>2011-01-31T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/jquery-toaster</id>
   <content type="html">&lt;p&gt;I was working on a project where I needed to display a confirmation alert to the user. I’m tired of the inline div’s and facebox dialogs but was having a difficult time finding an alternative. Then I remembered I really liked the way Twitter confirmed changes to the user profile so I thought I would make my own version that I can use in my asp.net mvc apps.&lt;/p&gt;

&lt;p&gt;I started messing around with a sliding div that would allow me to pop messages onto the page but in a subtle way. My first implementation was simple. I added a function to my main javascript file that I could call from anywhere within my app.&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/805409.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;My buddy (err boss) Barry thought it would be clever to pop this when we detected ajax errors.&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/805410.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;As I was adding cool effects I thought that I should blog about what I was doing because it was fun. Then I thought, why not turn this into a jQuery plugin that others could use and or extend?&lt;/p&gt;

&lt;p&gt;So i did!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://plugins.jquery.com/project/Toaster&quot;&gt;jQuery Toaster&lt;/a&gt; - a Twitter-like slide-down notifier.&lt;/p&gt;

&lt;p&gt;You can download it from the &lt;a href=&quot;http://plugins.jquery.com/project/Toaster&quot;&gt;jQuery plugin site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source-code is up on &lt;a href=&quot;https://github.com/azcoov/jQuery-Toaster&quot;&gt;GitHub&lt;/a&gt; if you are interested.&lt;/p&gt;

&lt;p&gt;Here are some &lt;a href=&quot;http://coovtech.com/projects/toaster&quot;&gt;live working examples&lt;/a&gt; if you want to see it in action.&lt;/p&gt;

&lt;p&gt;Check it out and if you have any comments about jQuery Toaster, you can post it to &lt;a href=&quot;https://groups.google.com/forum/?fromgroups#!forum/jquery-toaster&quot;&gt;Google Groups&lt;/a&gt;, or the &lt;a href=&quot;https://github.com/azcoov/jQuery-Toaster/issues&quot;&gt;GitHub issues&lt;/a&gt; page.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wireless printer</title>
   
     <link href="http://coovtech.com/posts/wireless-printer/" />
   
   <updated>2011-01-22T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/wireless-printer</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/p72.jpg.scaled1000.jpeg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For the two times each year that I print…&lt;/p&gt;

&lt;p&gt;This is one of those things with a high WAF (Wife Acceptance Factor). She likes to print, and I like gadgets.&lt;/p&gt;

&lt;p&gt;I guess my favorite thing about this printer is that it let me register an email address that I can send to and it will automatically print whatever I send it! You know for those two times I print each year.&lt;/p&gt;

&lt;p&gt;It took 10 minutes or so to set up. Windows took forever to install the print driver. Of course AirPrint worked instantly and flawlessly from the iPhones &amp;amp; iPads.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>No More Meetings</title>
   
     <link href="http://coovtech.com/posts/no-more-meetings/" />
   
   <updated>2011-01-20T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/no-more-meetings</id>
   <content type="html">&lt;p&gt;I’m a huge fan of the book &lt;a href=&quot;http://37signals.com/rework/&quot;&gt;REWORK&lt;/a&gt; by Jason Fried and David Heinemeier Hansson. It’s the first book I read on a Kindle and it’s the only book I have actually read in its entirety. Anyone who knows me is probably at a loss for words right now because I’ve probably never read anything longer than a blog post.&lt;/p&gt;

&lt;p&gt;Today I came across a website called &lt;a href=&quot;http://boycottameetingday.com/&quot;&gt;boycottmeetingday.com&lt;/a&gt; made by &lt;a href=&quot;http://37signals.com/&quot;&gt;guess who&lt;/a&gt;?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Every minute you avoid spending in a meeting is a minute you can get real work done instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This website, and the message it brings got me thinking a lot about some of the recent changes I’ve implemented in my life in order to be more effective. These changes I have made are disruptive (the good kind, like a &lt;a href=&quot;http://en.wikipedia.org/wiki/Disruptive_technology&quot;&gt;disruptive technology&lt;/a&gt;) to some, and not well received by others. I thought I would break-down some of the changes that I have made and talk about the direct impact it has had on my life.&lt;/p&gt;

&lt;p&gt;##Avoid Meetings&lt;/p&gt;

&lt;p&gt;The first change that I made was to avoid meetings. What? Avoid meetings? Isn’t it your job to go to meetings? – No. Far from it. My job it to build great software for a great company. A company that I care for dearly and that I’ve spent 10 years of my life with. While not all meetings can be avoided, most can. I’ll break down some of the quotes about meetings from REWORK and that you see on the “NO MORE MEETINGS” website.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Meetings break your work day into small, incoherent pieces that disrupt your natural workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is true and I believe that it is hard for most non-software/tech people to understand. Speaking from a software developer perspective, programming requires momentum; lots of it. It’s different than data entry, sending an email, writing an executive summary, or doing some other daily tedious procedure. It’s brain racking at times. We spend roughly 90% of our day debugging problems that sometimes we don’t understand. Each and every day is educational. We spend time on Google, StackOverflow, and other developer sites seeking answers to problems we have not been able to solve. Most people will never experience the strain involved in debugging a production application that is completely down for no explainable reason. Phones ringing, emails blasting, and people walking into your cubicle/office all demanding answers.&lt;/p&gt;

&lt;p&gt;In order to debug you need momentum. In order to build new software, or add new features, or to fix non-important bugs, you also need momentum. There is nothing more derailing to momentum than the outlook meeting reminder. I wrote about this almost a year ago today and it still holds true for me. When your are in the middle of writing code, it could be an algorithm, some bug you just squashed, a brand new application, etc. there is no meeting important enough to pull you away from that. It is difficult to build momentum and once you have it you should do whatever you can not to lose it. When your day is broken up into small chunks of coding time, your chances of building serious momentum are slim.&lt;/p&gt;

&lt;p&gt;The result of these distractions, or momentum killers, is the feeling of not being productive. In my case, I would make up for that feeling by going home and working after hours, distraction free. For the last five years up until about a month ago, I would work on average 60 hours per week. Sometimes more (70, even 80), rarely less.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Meetings are usually about words and abstract concepts, not real things (like a piece of code or some interface design)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is also true. Every once and a while I’ll be invited to a meeting where we actually solve a problem by throwing a piece of code on screen and having some smart brains look at it, break it down, and fix it. Most of the meetings I go to involve defining a problem. We almost never leave a meeting with a solution to that problem implemented. In fact, a typical result of such a meeting is to set up more meetings. That’s not effective.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Meetings usually convey an abysmally small amount of information per minute.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if you factor in how late people are (I’m guilty of being late too) to the meetings and the small talk that goes on before and during the meetings, that information per minute is drastically reduced.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Meetings often contain at least one moron that inevitably gets his turn to waste everyone’s time with nonsense.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ah, this one is risky to talk about. If I agree, then I’ve called someone I work with a moron. I’ll put it this way… I’ve been in a lot of meetings where time was wasted. I’m guilty of wasting time in meetings…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Meetings frequently have agendas so vague nobody is really sure what they are about.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is common. What is more common is a meeting with no agenda. One of the changes that I have implemented is to ask for an agenda from the person inviting me to the meeting. I explain that I’m tied up with a lot of work and I’d like to prepare for the meeting to ensure that I can be effective in the meeting. Nothing but brutal honesty here. I am busy. So is everyone else. I like to be transparent about it too. In fact, my priority list is public and anyone at our company can see what I’m working on. The result of asking for an agenda can lead to answering questions or solving the problem right then and there and thus avoiding the meeting all together. This idea comes from &lt;a href=&quot;http://www.fourhourworkweek.com/&quot;&gt;The 4-hour work week by Timothy Ferriss&lt;/a&gt;. I must admit that I completely failed at my first pass at this. I just asked for an agenda and did not explain that I was busy on a high-pressure project. The result was a series of back-and-forth emails and a meeting that still took place. Since then I’ve learned to be more transparent. Most people don’t really care what you are working on but are generally understanding if your under a time crunch.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Meetings require thorough preparation that people rarely do anyway.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This goes back to meetings without an agenda. If you invite a room full of people with a vague meeting topic, how can anyone prepare?&lt;/p&gt;

&lt;p&gt;##Kill the noise&lt;/p&gt;

&lt;p&gt;Once I cleared my calendar of meetings then my next step was to remove my other distractions that keep me from being effective at programming. Email…&lt;/p&gt;

&lt;p&gt;In my opinion, 95% of the email I get is spam. What is spam? Anything that doesn’t directly impact your current list of priorities, or your employment. I’m talking mostly about PSA’s here. Like I said before, nothing kills momentum more than seeing an email about refrigerator cleaning pop-up in the middle of the giant database delete statement that you just wrote and are about to execute. This is a hard one to figure out. Is this message important? Sure it is. To the company. We humans are sloppy and messy and always have to be reminded to do things. Even though I’m not associated with that refrigerator I can’t expect the company to send that email out to everyone but me because I think it is a distraction. I mean what is the company going to do, keep a “do not email about the refrigerator” list? That’s not reasonable to expect so you have to filter it.&lt;/p&gt;

&lt;p&gt;I’ve created about 40 or so filters to keep my inbox free of distraction. When a corporate-wide email goes asking everyone not to print to a specific printer, I don’t see it. I was worried about this at first. I thought I might miss something important. I eased myself into this at first by moving these emails flagged as distractions to a folder. I would then review that folder at the end of the day until I was confident that my email filters were working.&lt;/p&gt;

&lt;p&gt;This is my own implementation of the Gmail priority inbox. If you are not using this yet, then go get it. I hear that we are moving to the Google app engine which means I’ll get the priority inbox on my work email. Why does that matter? Because not only will my filters take care of the distractions, but gmail will make sure that I read the most important email first.&lt;/p&gt;

&lt;p&gt;The second thing I implemented to help make myself more effective is to reduce the checking of email to twice daily. This was extremely difficult to do. I let my email consume me. I was checking email several times an hour, all day and night. In my car to and from work, in meetings, at the park with my kids. Whenever I heard that &lt;em&gt;ding&lt;/em&gt; I was instantly consumed. What I thought I was doing was being ultra responsive to our clients and to my fellow co-workers. I later realized that what I was doing didn’t really have anything to do with being responsive and was having a damaging effect on my wife and kids.&lt;/p&gt;

&lt;p&gt;Part of our mission statement talks about responsiveness. I made the mistake of thinking that being responsive meant responding to email as fast as possible. I realize now that responsiveness has nothing to do with how fast you respond to someone. To be responsive you need to focus on the needs of the person or company you work with. You need to understand how to fulfill those needs and follow-up. I can’t believe I got this wrong for so long. Is it better to respond to every email as fast as possible, sometimes shooting from the hip, or is it better to read the email within a reasonable timeframe, solve or attempt to solve the problem, then respond?&lt;/p&gt;

&lt;p&gt;Shooting from the hip pisses people off. So to me the answer is simple. It is better to send a single email in response to something, than it is to send several emails, as long as that email response is within a reasonable timeframe (24 hours or less for most cases). Most people would prefer a response that said “I solved the problem, here is what was wrong, here is how I fixed it”, than responses that said “I’m not sure what the problem is but I’ll take a look”, “I still have not had a chance to look at the problem”, “Ok, I’m looking at the problem now”, and so on.&lt;/p&gt;

&lt;p&gt;I struggled with how to reduce the checking of email to twice daily without telling anyone. I created this status quo that gave everyone the expectation that if they sent me an email I would respond almost instantly. Some people may have loved that “feature” but the cost of that “feature” was me being less effective for the company and working more hours than I should.&lt;/p&gt;

&lt;p&gt;The solution was an auto-responder. I wanted to be as transparent, open, and honest with everyone about this. The email auto response is simple. It tells the email sender that due to a high workload (completely true, my priority list is impossible at the moment) I’m checking email twice daily, the times when I check and respond to email, how to contact me via phone for urgent issues, and I gave out my personal cell phone (not company paid) for emergencies. I can’t think of a better way to communicate to email senders that I will be responsive to them at these times and they can reach me instantly with a phone call if they have an emergency.&lt;/p&gt;

&lt;p&gt;I’ve been getting great feedback on this. Some people have inquired where I came up with this idea. I encourage them to read the books above. One thing that I would love to improve is to automate the automated email. What I mean is that I’d like to be able to send that auto response to the email sender once per day. So if someone sends me an email 10 times in a day, they will only get the auto response from me once.&lt;/p&gt;

&lt;p&gt;I realize that not everyone can have an email auto responder or can reduce email to twice daily checks. Some people have jobs that require them to sit in their inbox all day. I suggest reading about Inbox Zero and Getting Things Done as ways to reclaim your inbox and be more effective with email processing. I’ve implement both with success.&lt;/p&gt;

&lt;p&gt;##Focus in thirds&lt;/p&gt;

&lt;p&gt;Another change that I implemented was how I approach my work day. We have these things called priority lists. I joke about them a lot because they are a moving target. You might come in to find project XZY your top priority, only to see that shift down to your seventh priority two hours later. The reality is that we can’t work like that and be effective. You can’t work on 30+ hour projects that move around like a stock ticker.&lt;/p&gt;

&lt;p&gt;Each morning when I get to work I take a look at my current priorities. For that day I might be working on one single project all day, or several smaller projects. Whatever the case I take a legal size piece of paper and fold it into thirds. At the top of each third I write down an obtainable goal. This helps with my focus and keeps me on track. Whenever a distraction slips through and kills momentum, I go back to this list and it seems to help me get back on track quickly. An example of a list I created the other morning is as follows: 1) Create HTML helper to render custom sparklines (see my last blog post for info on Sparklines). 2) Write two performance queries and hook them up to drive the Sparkline views. 3) Setup a webserver and deploy the new performance application.&lt;/p&gt;

&lt;p&gt;The most important thing about each item you list is that they have to be obtainable goals for that day. If you make them to high a level, you wont complete it.&lt;/p&gt;

&lt;p&gt;##Social cleanse&lt;/p&gt;

&lt;p&gt;In the book, The 4-hour work week, the author talks about a media cleanse. No TV, News, etc for one week. I did the same thing substituting Facebook, Twitter, and Google news as my media. I removed all social and media apps from my iPhone with the exception of Path. I use Path to capture moments (such as taking my kids to the park) and share them with my wife in a more private setting.&lt;/p&gt;

&lt;p&gt;This cleanse was only supposed to last for a week. It’s been a month… I do occasionally check Facebook and Twitter but those apps only exist on my iPad and I only use them when in bed trying to wind down from the day.&lt;/p&gt;

&lt;p&gt;Just to be clear, I don’t think I was wasting time on Twitter or Facebook. In fact, if it weren’t for Twitter, I would have never learned about MVC (or would have discovered it much later). Some of the best work I’ve done recently has been in MVC. In fact, we won an award last year for an app that we built who’s core communication technology I heard about through tweets linking to Microsoft blog posts (WCF).  What was I dong wrong then? Making Twitter and Facebook a focal point of some part of my day where I could have been more effective doing something else. For example, rather than sit in a meeting and small talk or read tweets on my iPhone, if the meeting is over or if I can no longer contribute, I’ll leave and get back to coding. That is much more effective use of time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Update&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A friend of mine said that he checked my Tweet stats and they supported what I wrote here in this blog post. Take a look:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/tweets.PNG.scaled700.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;#Results&lt;/p&gt;

&lt;p&gt;The results are amazing to me. I’ve been doing this for about a month and can’t believe how much more effective I am in all aspects of my life.&lt;/p&gt;

&lt;p&gt;Work – Instead of working 12-14 hour days I’m working eight hour days. Within those eight hour days I’m getting more things done than I was when I was killing myself working longer days. This makes me much more effective for the company and it makes me a much happier person. I walk and talk differently. My head is clear and I see things more clearly. In fact, a peer told me the other day that they have seen a change in me for the better. That I was more pleasant to be around.&lt;/p&gt;

&lt;p&gt;Home – More important than the impact this has had on work is the impact this has had on my family. My wife told me that I’m a changed man. My mother told me that she could see less tension in my face. My kids now say “I want my daddy” instead of “I want my mommy”. I’ve connected with my kids more within the last month than ever before. When I leave work, its gone. I don’t bring it home anymore. When I take my kids to the park, I focus on them and not my work email, or Facebook, or Twitter. I have more time to focus on school and my side projects after hours. I feel like the weight of the world has been lifted off my shoulders.&lt;/p&gt;

&lt;p&gt;Life is good.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Create a Sparkline in ASP.NET MCV in 30 seconds or less</title>
   
     <link href="http://coovtech.com/posts/mvc-sparkline/" />
   
   <updated>2011-01-13T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/mvc-sparkline</id>
   <content type="html">&lt;p&gt;I’m building a new performance analysis system for our web traffic and was considering different ways to display the data. Anyone who knows me well knows that for the most part I despise reporting. Mostly because time and time again I’ve been asked to build reports that never get used. This time is different. This time I’m the audience so I get to build the report the way I think it should look.&lt;/p&gt;

&lt;p&gt;Several years ago I came across a website that had excerpts from Edward Tufte’s book &lt;a href=&quot;http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR&amp;amp;topic_id=1&amp;amp;topic=&quot;&gt;Beautiful Evidence&lt;/a&gt;. I was interested in these things called Sparklines:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;He also refers to sparklines as “wordlike graphics” or“datawords”. A sparkline usually consists of either a fluctuating line like in a line chart, or of a string of very tiny bars. It is usually longer than high, and is not accompanied by an x- or y-axis or other scale. A sparkline enables the visual display of a large amount of data in a tiny space. In addition, sparklines are often presented in a set, enabling comparisons between the data in different sparklines&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the time I had the idea of adding these sparklines to our flagship application to help give users a better at-a-glance understanding of the health of the account they were working. I did end up implementing it but never released it because I never thought it conveyed the point that I was hoping it would make.&lt;/p&gt;

&lt;p&gt;Fast forward a few years later and Google added &lt;a href=&quot;http://code.google.com/apis/chart/docs/gallery/line_charts.html&quot;&gt;Sparkline capability to the Charts API&lt;/a&gt; which makes it simple. I realized that most of the performance data that I had would be best explained with sparklines. Here is how I did and you should be able to implement this yourself in 30 seconds or less, I promise.&lt;/p&gt;

&lt;p&gt;##Step 1 – Create an HTML helper&lt;/p&gt;

&lt;p&gt;This is a quick hack to get you going. You could probably structure your code better and make it more readable and allows for incoming options as not everything we are sending Google in the query string is required.&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/790542.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;##Step 2 – Add the Sparkline to your markup&lt;/p&gt;

&lt;p&gt;This is a simple MVC View Page. Don’t forget to import your Sparkline.Helpers reference…&lt;/p&gt;

&lt;p&gt;https://gist.github.com/790548&lt;/p&gt;

&lt;p&gt;##Step 3 – Run it&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chf=bg,s&amp;amp;cgh=0,50,1,0&amp;amp;chds=1,9&amp;amp;chs=150x30&amp;amp;chd=t:1,3,5,2,7,9,4&amp;amp;chco=999999&amp;amp;chls=1,1,0&amp;amp;chm=o,990000,0,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|4|1:||2:||&quot; _mce_src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chf=bg,s,ffffff&amp;amp;cgh=0,50,1,0&amp;amp;chds=1,9&amp;amp;chs=150x30&amp;amp;chd=t:1,3,5,2,7,9,4&amp;amp;chco=999999&amp;amp;chls=1,1,0&amp;amp;chm=o,990000,0,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|4|1:||2:||&quot; alt=&quot;sparkline&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s it. It really is that simple… Maybe&lt;/p&gt;

&lt;p&gt;Sparklines are easy to use if you have simple data points. You can take the code from above and change it around to better suit your needs. Perhaps you want a int array, or a simple string of comma delimited values to pass in. No problem.&lt;/p&gt;

&lt;p&gt;At some point you’ll need to do some math. Why? Well, it depends on how you want to handle negative numbers.&lt;/p&gt;

&lt;p&gt;Step 4 – Test it&lt;/p&gt;

&lt;p&gt;Assume you have this series of numbers as your data point: 1,5,3,6,8,4,5,8,9,18,3.5,5,4,7,10,11,9,13,5,6,8&lt;/p&gt;

&lt;p&gt;Your sparkline will look like this: &lt;img src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=100x30&amp;amp;chd=t:5.3,26.5,15.9,31.7,42.3,21.2,26.5,42.3,47.6,95.2,18.5,26.5,21.2,37.0,52.9,58.2,47.6,68.8,26.5,31.7,42.3&amp;amp;chco=336699&amp;amp;chls=1,1,0&amp;amp;chm=o,990000,0,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|8|1:||2:||&amp;amp;chxp=0,42.3&quot; _mce_src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=100x30&amp;amp;chd=t:5.3,26.5,15.9,31.7,42.3,21.2,26.5,42.3,47.6,95.2,18.5,26.5,21.2,37.0,52.9,58.2,47.6,68.8,26.5,31.7,42.3&amp;amp;chco=336699&amp;amp;chls=1,1,0&amp;amp;chm=o,990000,0,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|8|1:||2:||&amp;amp;chxp=0,42.3&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But what if you had a negative number in your series? Do you want your Sparkline to look like this &lt;img src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=100x30&amp;amp;chd=t:33.2,48.1,40.7,51.9,59.3,44.4,48.1,59.3,63.1,96.6,42.5,48.1,44.4,3.4,66.8,70.5,63.1,78.0,48.1,51.9,59.3&amp;amp;chco=BBBBBB,336699&amp;amp;chls=1,1,0|1,1,0&amp;amp;chm=o,990000,1,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|8|1:||2:||&amp;amp;chxp=0,59.3&quot; _mce_src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=100x30&amp;amp;chd=t:33.2,48.1,40.7,51.9,59.3,44.4,48.1,59.3,63.1,96.6,42.5,48.1,44.4,3.4,66.8,70.5,63.1,78.0,48.1,51.9,59.3&amp;amp;chco=BBBBBB,336699&amp;amp;chls=1,1,0|1,1,0&amp;amp;chm=o,990000,1,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|8|1:||2:||&amp;amp;chxp=0,59.3&quot; alt=&quot;&quot; /&gt; or this ?&lt;img src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=100x30&amp;amp;chd=t:29.5,29.5|33.2,48.1,40.7,51.9,59.3,44.4,48.1,59.3,63.1,96.6,42.5,48.1,44.4,3.4,66.8,70.5,63.1,78.0,48.1,51.9,59.3&amp;amp;chco=BBBBBB,336699&amp;amp;chls=1,1,0|1,1,0&amp;amp;chm=o,990000,1,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|8|1:||2:||&amp;amp;chxp=0,59.3&quot; _mce_src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;amp;chs=100x30&amp;amp;chd=t:29.5,29.5|33.2,48.1,40.7,51.9,59.3,44.4,48.1,59.3,63.1,96.6,42.5,48.1,44.4,3.4,66.8,70.5,63.1,78.0,48.1,51.9,59.3&amp;amp;chco=BBBBBB,336699&amp;amp;chls=1,1,0|1,1,0&amp;amp;chm=o,990000,1,20,4&amp;amp;chxt=r,x,y&amp;amp;chxs=0,990000,11,0,_|1,990000,1,0,_|2,990000,1,0,_&amp;amp;chxl=0:|8|1:||2:||&amp;amp;chxp=0,59.3&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Please give them a try yourself and have fun. Ping me back if you have done any neat things with Sparklines!&lt;/p&gt;

&lt;p&gt;I built a sample app and &lt;a href=&quot;https://github.com/azcoov/Utilities/tree/master/Sparkline&quot;&gt;threw it on GitHub&lt;/a&gt;. Please feel free to take it and run with it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>MVC Advanced Model Binding</title>
   
     <link href="http://coovtech.com/posts/advanced-model-binding/" />
   
   <updated>2010-10-19T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/advanced-model-binding</id>
   <content type="html">&lt;p&gt;##The basic model&lt;/p&gt;

&lt;p&gt;Basic model binding is simple. Imagine a Contact class that has a Name and PhoneNumber property:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public class Contact {
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;and the simple controller:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public ActionResult Edit(Contact contact) {
    string name = contact.Name;
    string number = contact.PhoneNumber;
    return View();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;##The advanced model&lt;/p&gt;

&lt;p&gt;But what happens when your model is more complex, for example you allow for a Contact to have many types of PhoneNumbers?&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public class Contact {
    public string Name { get; set; }
    public List&amp;lt;Phone&amp;gt; PhoneNumbers { get; set; }
}

public class Phone {
    public string Number { get; set; }
    public PhoneType Type { get; set; }
}

public class PhoneType {
    public int Type_id { get; set; }
    public string Description { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;##HTML setup&lt;/p&gt;

&lt;p&gt;In order to post form data that the model binder understands, we need to setup our form to match the schema of our model. In this example, the contact name would be a “Name” input, and the contact phone numbers would be  a “PhoneNumbers” input and a “PhoneNumbersType” select. Because the Contact contains a list of PhoneNumbers, we need to make sure our phone and phone type inputs have an index number. Here is how that html might look:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;h2&amp;gt;Edit&amp;lt;/h2&amp;gt;

&amp;lt;input type=&quot;text&quot; name=&quot;Name&quot; /&amp;gt;

&amp;lt;input type=&quot;text&quot; name=&quot;PhoneNumbers.[0].Number&quot; /&amp;gt;
&amp;lt;select id=&quot;PhoneNumbers.[0].Type_id&quot;&amp;gt;
  &amp;lt;option value=&quot;0&quot;&amp;gt;Home&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;1&quot;&amp;gt;Work&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;

&amp;lt;input type=&quot;text&quot; name=&quot;PhoneNumbers.[1].Number&quot; /&amp;gt;
&amp;lt;select id=&quot;PhoneNumbers.[1].Type_id&quot;&amp;gt;
  &amp;lt;option value=&quot;0&quot;&amp;gt;Home&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;1&quot;&amp;gt;Work&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;

&amp;lt;input type=&quot;text&quot; name=&quot;PhoneNumbers.[2].Number&quot; /&amp;gt;
&amp;lt;select id=&quot;PhoneNumbers.[2].Type_id&quot;&amp;gt;
  &amp;lt;option value=&quot;0&quot;&amp;gt;Home&amp;lt;/option&amp;gt;
  &amp;lt;option value=&quot;1&quot;&amp;gt;Work&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In your action result, you are going to accept the Contact model as the parameter. The model binder will use reflection to parse the form fields and map them to your model. There is a catch. The sequence of the list of PhoneNumbers can not be out of order. For example, you can’t pass in phone 1,2,4, it will stop at two. Notice in the above example that the index of the three phone numbers is 0,1,2. Here is what the Controller would look like:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public ActionResult Edit(Contact contact)
{
    string name = contact.Name;
    List&amp;lt;Phone&amp;gt; phoneNumbers = contact.PhoneNumbers;
    return View();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;##The database&lt;/p&gt;

&lt;p&gt;Great so now we have a more advanced model binding scenario. How would save this to the database? There are many ways to do this but I’ll show you how I do it with sql server, xml, and a single call to the database.&lt;/p&gt;

&lt;p&gt;I created a repository class that is responsible for communicating to my database. In that class I have a Edit method that accepts a Contact model. I want to send all of my phone data at once so I’m going to use a System.Xml.Linq.XElement to handle that. To convert my List&lt;Phone&gt;, I have a generic extension method that I use:&lt;/Phone&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public static class GenericExtensions
{
    public static XElement ToXElement&amp;lt;T&amp;gt;(this T obj)
    {
        XmlSerializerNamespaces emptyNamespace = new XmlSerializerNamespaces();
        emptyNamespace.Add(String.Empty, String.Empty);
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        XmlWriterSettings writerSettings = new XmlWriterSettings();
        writerSettings.OmitXmlDeclaration = true;
        StringWriter stringWriter = new StringWriter();
        using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, writerSettings))
        {
            xmlSerializer.Serialize(xmlWriter, obj, emptyNamespace);
        }
        return XElement.Parse(stringWriter.ToString());
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Back in my repository class, I simply call .ToXElement() on my List&lt;Phone&gt;:&lt;/Phone&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;phoneXML = contact.PhoneNumbers.ToXElement();
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here is what phoneXML looks like in the XML inspector:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;ArrayOfPhone&amp;gt;
    &amp;lt;Phone&amp;gt;
        &amp;lt;Number&amp;gt;555-555-5553&amp;lt;/Number&amp;gt;
        &amp;lt;Type&amp;gt;
            &amp;lt;Type_id&amp;gt;0&amp;lt;/Type_id&amp;gt;
        &amp;lt;/Type&amp;gt;
    &amp;lt;/Phone&amp;gt;
    &amp;lt;Phone&amp;gt;
        &amp;lt;Number&amp;gt;555-555-5553&amp;lt;/Number&amp;gt; 
        &amp;lt;Type&amp;gt;
            &amp;lt;Type_id&amp;gt;1&amp;lt;/Type_id&amp;gt;
        &amp;lt;/Type&amp;gt; 
    &amp;lt;/Phone&amp;gt;
    &amp;lt;Phone&amp;gt;
        &amp;lt;Number&amp;gt;555-555-5553&amp;lt;/Number&amp;gt; 
        &amp;lt;Type&amp;gt;
            &amp;lt;Type_id&amp;gt;1&amp;lt;/Type_id&amp;gt;
        &amp;lt;/Type&amp;gt;
    &amp;lt;/Phone&amp;gt;
&amp;lt;/ArrayOfPhone&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Once I have my list of phone numbers in XML form, I make a call to the database (stored proc in my example) and pass in the contact name, and the phone number xml:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CustomerDataContext db = new CustomerDataContext();
db.sp_CustomerEdit(profile.Token, Customer_id, contact.Name, phoneXML);
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In that stored procedure, I use sql’s built in xml goodness to update my table of phone numbers:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;insert into Phone (
    Customer_id,
    PhoneNumber,
    PhoneType_id
)
select
    @Customer_id,
    p.col.value(&#39;./Number[1]&#39;,&#39;varchar(25)&#39;),
    p.col.value(&#39;./Type[1]/Type_id[1]&#39;,&#39;int&#39;)
from 
    @PhonesXML.nodes(&#39;/ArrayOfPhone/Phone&#39;) as p(col) 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So there you have it. It’s a simple way to do complex model binding and a database update. Next up I’m going to show how to add the 37Signals flavor of dynamically rendering more phone numbers of the fly with jQuery while still using the same model binding you see here.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dad Life</title>
   
     <link href="http://coovtech.com/posts/dad-life/" />
   
   <updated>2010-08-12T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/dad-life</id>
   <content type="html">&lt;p&gt;I relate to this song on so many levels. I think I’ve watched this video 20 times. I downloaded the song and will turn it into my ringtone. I thought I’d throw it on my blog so that I’d have it forever! Here is a link to the audio file if you want to download it.&lt;/p&gt;

&lt;iframe src=&quot;http://player.vimeo.com/video/12714406&quot; width=&quot;500&quot; height=&quot;281&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Dad Life from Church on the Move on Vimeo.&lt;/p&gt;

&lt;p&gt;** Download the MP3 at churchonthemove.com! **&lt;/p&gt;

&lt;p&gt;twitter.com/cotmtulsa&lt;/p&gt;

&lt;p&gt;Producer - Whitney George twitter.com/whitneygeorge, Angie Woods twitter.com/angiewittywoods 
Director - Gary Hornstien twitter.com/ghornstien, Chris Munch twitter.com/cmunch78 
Director of Photography - Corey Lack coreylackphotography.com&lt;/p&gt;

&lt;p&gt;Written by - Chris Munch, Whitney George 
Joshua Andersen twitter.com/joshuaandersen 
Andrew Dale twitter.com/drewberdale 
Roman Johnson twitter.com/romanjohnson23 
Adam Bush twitter.com/ambushcreative&lt;/p&gt;

&lt;p&gt;Track recorded at - creativeaudiolab.com 
Track produced by - Andrew Dale, John Mitchell&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lazy Foursquare</title>
   
     <link href="http://coovtech.com/posts/lazy-foursquare/" />
   
   <updated>2010-06-16T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/lazy-foursquare</id>
   <content type="html">&lt;p&gt;Lazy Foursquare? What can possibly be lazy about Foursquare? You go somewhere, you check-in, your done.&lt;/p&gt;

&lt;p&gt;##Human nature and repetitive tasks&lt;/p&gt;

&lt;p&gt;Let’s face it, we humans (well most of us), don’t like doing repetitive tasks. Things become tedious and tedious creates burnout. This can be observed by watching me clock-in at work. Sometimes I remember, sometimes I don’t. Well, most of the time I don’t. I forget to do it. I forget to do it because I think the process is silly. With all the integration possibilities, I often wonder why one of us hasn’t hooked into the badge system to build an auto-clock-in interface with our timecard system.&lt;/p&gt;

&lt;p&gt;Here is my problem with Foursquare on the iPhone. I’m at a venue, like work, and I forget to check-in. I find checking-in tedious in some ways. I don’t have an iPhone 3gs so apps are a little slow to launch. The app crashes sometimes. The app also seems slow to target my location at times. So the process is tedious at times and that is why I forget to do it.&lt;/p&gt;

&lt;p&gt;##Programmers are lazy&lt;/p&gt;

&lt;p&gt;A good friend and co-worker of mine (@krogden) says that the best programmers are lazy and that they will write code just so that they can be lazy. So that’s what this is about. I’m lazy and I wrote a program to do something for me so that I can continue being lazy.&lt;/p&gt;

&lt;p&gt;##What does it do?&lt;/p&gt;

&lt;p&gt;Simple. It checks me into work twice a day. Nothing more, nothing less.&lt;/p&gt;

&lt;p&gt;##But why?&lt;/p&gt;

&lt;p&gt;I’m a competitive person and I like to win (even if its not a game). Another good friend and co-worker of mine (@portiad) got hooked on Foursquare and ousted me as mayor at work. She has a deep drawer with an efficient filing system (that’s code for she doesn’t forget things) and doesn’t miss check-ins as often as I do.&lt;/p&gt;

&lt;p&gt;It’s my mission to take back mayorship. Even if its a hostile takeover. Oh, and I also wanted to play with the Foursquare API. After all, programming is fun…&lt;/p&gt;

&lt;p&gt;##The code&lt;/p&gt;

&lt;p&gt;Foursquare made a great API that is simple to use; just a few lines of code. I simply make check-in calls to the Foursquare API using basic HTTP authentication. I wrote an app that will make check-in calls for me twice a day (once for when I get to work, and once for when I return from lunch), five days a week.&lt;/p&gt;

&lt;p&gt;I read the “Rules and Conduct” in the Terms Of Use section on the Foursquare website. I wanted to make sure that by being lazy, I was not violating their terms. What I’m doing is honest (loosely), efficient, and accentuates my laziness, but does not break any rules as far as I can tell.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Uri uri = new Uri(&quot;http://api.foursquare.com/v1/checkin.xml&quot;);
String username = &quot;&quot;;
String password = &quot;&quot;;
String usernamePassword = username + &quot;:&quot; + password;
CredentialCache mycache = new CredentialCache();
mycache.Add(new Uri(uri.ToString()), &quot;Basic&quot;, new NetworkCredential(username, password));            
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Credentials = mycache;
request.Headers.Add(&quot;Authorization&quot;, &quot;Basic &quot; + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));
request.Method = &quot;POST&quot;;
request.ContentType = &quot;application/x-www-form-urlencoded&quot;;
String postData = &quot;vid=[the venue id of my office]&quot;;
byte[] byteData = UTF8Encoding.UTF8.GetBytes(postData);
request.ContentLength = byteData.Length;
using (Stream postStream = request.GetRequestStream())
{
    postStream.Write(byteData, 0, byteData.Length); 
}
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    StreamReader reader = new StreamReader(response.GetResponseStream());
    Console.WriteLine(reader.ReadToEnd());                
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;And that’s it…&lt;/p&gt;

&lt;p&gt;** Update **&lt;/p&gt;

&lt;p&gt;Within two days of running the lazy Foursquare app, I took back mayorship of one our venues (we have two). Mission accomplished!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Making software better for people that hate you</title>
   
     <link href="http://coovtech.com/posts/hate/" />
   
   <updated>2010-05-22T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/hate</id>
   <content type="html">&lt;p&gt;One of the most complicated things in life is working for people that don’t care for what you are doing. I’m not talking about working for a shitty boss; imagine playing for the last-place NFL team &amp;amp; getting booed off the field. That’s what I’m talking about.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/4631165796_44a2326f70_m.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As a software developer, my goal is to write great software that is useful and easy to use. I want to make people happy and I want them to be excited when I release something new because they know it will work right the first time.&lt;/p&gt;

&lt;p&gt;For the most part, I accomplish this every day. Every now and then however, I run into someone who hates me. Not me as in Billy Coover the human, but me as in the IT guy who was sent from hell to steal everyones productivity and make them unhappy by moving their cheese every chance I get.&lt;/p&gt;

&lt;p&gt;The type of person I’m describing is someone who bitches about something in your software (usually having nothing to do with any code of yours) that they don’t like and think you are an idiot for implementing. Sometimes they like to take little stabs meant to belittle you “I’ve been doing this for n years and I’ve never seen it done this way”. As if your entire purpose was to do it the exact opposite of what everyone is expecting.&lt;/p&gt;

&lt;p&gt;Sometimes this person already has the solution and you just need to implement it. However, if you ask them to define the problem, they get angry, very very angry, as if you are telling them to piss-off.&lt;/p&gt;

&lt;p&gt;They best part about this person is that once you do implement a new feature or bug fix that they ask for, you wont get a thank you. You’ll be lucky if you can escape without another complaint about something else, or even the new feature you just added “it’s about time this works the way I think it should have”.&lt;/p&gt;

&lt;p&gt;They best way to handle this person is to ignore their attitudes, turn on the hate filter, and try as best you can to figure out the root of their problem. Once you do solve their problem, it’s best to keep the information exchange about the solution short and sweet. A simple email is fine. This way, if they respond back and have nothing nice to say you can quickly delete the email and move on.&lt;/p&gt;

&lt;p&gt;Most software users are not this way. They might get excited when you &lt;a href=&quot;http://goo.gl/T6es&quot;&gt;move their cheese&lt;/a&gt;, but for the most part they are open to change as long as everyone understands that the change is intended to make the software better. Also, when you get to sit with users, hear the issues they are having, feel their pain every now and then, then solve their issues with some code, it really does feel good and it helps build trust with the users. They are typically happy and thankful that you came out from behind the big IT wall and actually helped them (I think all programmers at all software companies should do this by the way. It’s part of &lt;a href=&quot;http://goo.gl/FIXC&quot;&gt;Behavior Driven Development&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Now, here is a bigger problem. Sometimes you’ll run across someone that hates you that has a lot of influence over other people. It is possible that they can get an entire department to behave they way I describe above. Maybe even a regional office, or the whole company… Watch out for this and try to squash it as soon as possible. You’ll be miserable if you don’t. There is nothing that will burn you out faster than working 80 hour weeks for a group of people that don’t give a shit that you did it for them. That you missed out on breakfast and dinner with your family because you put their needs in front of your own, not because you had to but because you wanted to. It will leave a bad taste in your mouth for a very long time.&lt;/p&gt;

&lt;p&gt;The best thing to do is listen. You may not agree with the users. After all, they don’t always WANT you to solve their problems unless it is done on their terms. Never-mind that you are paid to solve problems. Sometimes solving the problem is not a solution they are looking for. Sometimes they just want to bitch and you just need to take it.&lt;/p&gt;

&lt;p&gt;I’ve learned a lot about this from my marriage and from White Men Can’t Jump…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When I said I was thirsty, it doesn’t mean I want a glass of water.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It doesn’t?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Finally a meeting that didn&#39;t suck</title>
   
     <link href="http://coovtech.com/posts/meeting-suck/" />
   
   <updated>2010-03-06T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/meeting-suck</id>
   <content type="html">&lt;p&gt;Were you sucked in with the controversial title?&lt;/p&gt;

&lt;p&gt;Allow me to explain. I think meetings are the foundation of business. Meetings are where decisions are made. Meetings are where things get done. In a conference room, at a bar, on the golf course. I’ve been in meetings at each of these places and have seen amazing progress made.&lt;/p&gt;

&lt;p&gt;But not all meetings are create equal… Some meetings are horrible. Some meetings are counter productive and costly. Some meetings just suck to be at.&lt;/p&gt;

&lt;p&gt;This week we had a monthly IT meeting where we talked about technology. Not about our technology. Not about the projects we are currently working on. We talked about technology in general. We talked about our favorite geek tools that we use daily to be more productive. We talked about the fun gadgets we use. We talked about financial tools that help us keep our money organized.&lt;/p&gt;

&lt;p&gt;##How is this productive?&lt;/p&gt;

&lt;p&gt;Simple. We are an information technology company. Our job is to develop world-class software. We do this by writing code. We also do this by understanding technology. We need to understand the latest trends in technology. The latest productivity tools and gadgets. To write world-class software you have to know what’s out there. We also need to see the tools our peers are using to be productive and efficient.&lt;/p&gt;

&lt;p&gt;The alternative is a workplace that doesn’t innovate. A workplace that becomes dull, boring, and repetitive. A workplace that you dread going to every day. You don’t want this to be you:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/4411950144_0afafdcd96_o.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;##The list&lt;/p&gt;

&lt;p&gt;This is the list of technologies that we talked about. I thought it would be cool for everyone to see and try out if you want. I use some of these tools religiously. You should too!&lt;/p&gt;

&lt;p&gt;Evernote – Your extended brain, stored in the cloud. This is my personal favorite. I use this each and every day. At work, and at home. Meeting notes, story boards, recipes, pictures of prescriptions, you name it and I capture it in Evernote.&lt;/p&gt;

&lt;p&gt;LastPass – It’s a password manager for your web browser. It lets you create complex passwords for each site you log into. You create a master password as an encryption key. All you ever need to remember is one password and LastPass takes care of the rest.&lt;/p&gt;

&lt;p&gt;Squeezebox – It’s a Wi-Fi music player that can connect to Pandora, Rhapsody, or Slacker. It can also play your own music.&lt;/p&gt;

&lt;p&gt;Paint.net – Free image and photo editing software for Windows. It’s way better than Microsoft Paint, and has some of the features you might find in Photoshop. Plus, my grandma uses it!&lt;/p&gt;

&lt;p&gt;Twitterberry – A twitter client for the blackberry. The new interface is more intuitive and makes it easy to post photos and video to Twitter.&lt;/p&gt;

&lt;p&gt;Twitter – My obsession with Twitter is simple. I’m a social guy and I love technology. (via Twitter), I’ve been able to connect with people I would have otherwise never connected with before. CEO’s of technology companies, fellow software developers, even an occasional (short( conversation with a celebrity.&lt;/p&gt;

&lt;p&gt;Mint – Mint is a free online personal finance service. It does too much to talk about here, but in a nut-shell, it allows you to aggregate all your financial accounts into one single intuitive website. Watch your spending habits, set monthly budgets, get email alerts, and so much more.&lt;/p&gt;

&lt;p&gt;Sugarsync – Cloud based secure backup. Your files, photos, and media, backed-up automatically. Super easy restore process.&lt;/p&gt;

&lt;p&gt;iGoogle – A customizable home page. Endless number of gadgets to choose from. Weather, stocks, blogs, news aggregator, Twitter, Facebook, Random Chuck Norris Facts. You name it, there is a Gadget for it.&lt;/p&gt;

&lt;p&gt;Dropbox – Ever used a USB thumb-drive? This is thumb-drive 2.0. It allows you to sync files online and across all your computers. I use this every day also. For example, I’m working on a project that has a lot of images. I stick the images in my dropbox folder and can access them from my home and work computers. It makes it easy to catch up on that project over the weekend.&lt;/p&gt;

&lt;p&gt;What I like about most of these technologies is the ubiquity of them. They offer web browser based clients, desktop software for Windows &amp;amp; Mac in most cases, and smart-client apps for the iPhone, Android, and Blackberry phones. This allows you to use them and access content from anywhere in the world.&lt;/p&gt;

&lt;p&gt;Try one out.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Twas the night before sprint demo</title>
   
     <link href="http://coovtech.com/posts/sprint-demo/" />
   
   <updated>2010-02-28T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/sprint-demo</id>
   <content type="html">&lt;p&gt;When all through the house, not a creature was stirring, except for a team of software developers determined to deliver a quality product.&lt;/p&gt;

&lt;p&gt;##size matters&lt;/p&gt;

&lt;p&gt;I’ve lost track of how many sprints we have done. I think we are on our 5th sprint. This last sprint was very long; too long in my opinion. It was also our largest group to date. What this means is that there was a very large amount of work to be done. It also means that there was plenty of room for distractions.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;Group size – I think the size of the group should dictate the amount of work to do. The bigger the group, the more narrow the project should be. This might sound contrary to having a large group. What I mean by having a narrow project is that you want a team to be very focused at the tasks at hand. The bigger the variety of tasks, the more questions there will be; more distractions&lt;/td&gt;
          &lt;td&gt;roadblocks&lt;/td&gt;
          &lt;td&gt;failure opportunity.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;Sprint length – I work with a team of excellent programmers who work hard. This mentality manifests itself from the top down. It’s nice to see the leadership working hard and setting the bar high. This also means fatigue and the potential for burnout. I believe you can combat fatigue with comfortable workspaces (I’ll post about that some other time), and short sprints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;##exhausted&lt;/p&gt;

&lt;p&gt;What we did last night was amazing.&lt;/p&gt;

&lt;p&gt;&amp;lt;img = src”https://s3.amazonaws.com/assets.coovtech/4396790559_f984fde4e4_m.jpg” /&amp;gt;&lt;/p&gt;

&lt;p&gt;Most of our sprint team was up until the wee hours of the morning polishing our product and preparing it for the demo. Some programmers got less than three hours of sleep before they were back at work and ready for the demo. What is worth it? ABSOLUTLY!&lt;/p&gt;

&lt;p&gt;Why is it worth it? I think what we do as software developers is craftsmanship. We take pride in our work and want it to sparkle in front of an audience. When things go wrong we take it personally. It’s embarrassing when you release a bug. It’s even more embarrassing when your demoing in front of your peers, colleagues, and the brass.&lt;/p&gt;

&lt;p&gt;##the future&lt;/p&gt;

&lt;p&gt;I hope we don’t stop with Agile and Scrum. We’ve proven that it works time and time again. I do hope that we continue to evolve and master Scrum. I also hope that we investigate alternatives to Scrum that might suite us better, such as Lean and Kanban. I’ll continue to research these concepts and push to try them all. Heck, I’ll probably try my own Personal Kanban out for size.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>An Email Experiment</title>
   
     <link href="http://coovtech.com/posts/an-email-experiment/" />
   
   <updated>2010-02-18T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/an-email-experiment</id>
   <content type="html">&lt;p&gt;For two years now I’ve been studying David Allen’s Getting Things Done method for productivity. I’ve tried out various tools from a GTD Outlook plugin, to Remember The Milk (RTM), to my own custom To-Do list application.&lt;/p&gt;

&lt;p&gt;So far, with my current setup of RTM as my inbox and next actions, and Evernote as my digital file locker, I’ve been able to stay ahead of the game in nearly every aspect of my life except work email.&lt;/p&gt;

&lt;p&gt;I’ve never liked email. As a software programmer, I like to collaborate in groups and have conversations face-to-face or on the phone. Not everyone understands email etiquette (people who send emails with an empty subject should stop reading now) and its far too easy for people to be dropped from a conversation thread. Also, as emails get longer, and the conversation morphs into multiple conversations, its nearly impossible to follow everything that is going on. Oh and the spam. Don’t get me started on the spam. I consider spam to be anything not directly related to the projects I’m working on. For example “We are cleaning out the refrigerator today at noon” is spam in my inbox.&lt;/p&gt;

&lt;p&gt;The struggle I have is filtering out the stuff I don’t want to see, quickly deleting the items that are not important, and filing the stuff that is important. Also, the email notifications that pop-up have been distracting me for years and I never did anything about it. I starting asking myself why I have an email notification? I’m not required to read and respond to every single email that pops into my inbox, and it certainly is a productivity killer to get a pop-up when your deep in thought and writing code.&lt;/p&gt;

&lt;p&gt;Picture yourself deep in thought about the code you are writing. Your about to call an authentication method that you know is important and as you are calling this method you get an email notification. My brain, even if only for a second, will focus on that email and not the important code I’m writing.&lt;/p&gt;

&lt;p&gt;&lt;a title=&quot;Distracting Email by CoovTech, on Flickr&quot; href=&quot;http://www.flickr.com/photos/coovtech/4368973487/&quot; _mce_href=&quot;http://www.flickr.com/photos/coovtech/4368973487/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2702/4368973487_8de36384be_o.png&quot; _mce_src=&quot;http://farm3.static.flickr.com/2702/4368973487_8de36384be_o.png&quot; alt=&quot;Distracting Email&quot; width=&quot;725&quot; height=&quot;202&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This may seem silly but you have to think about this in the context of your work day. I get many emails and for some strange reason their timing is always bad. Multiply this distraction a few times over and you’ll realize that its a productivity killer. I think its time to fix this problem. After all, being productive IS my job.&lt;/p&gt;

&lt;p&gt;Here is my experiment:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I will start with zero emails. the initial setup of this will take about a day.&lt;/li&gt;
  &lt;li&gt;I will turn of all email notifications. This includes the outlook pop-up, the email icon in the task bar, and the annoying beep.&lt;/li&gt;
  &lt;li&gt;I will reverse the email order in my inbox so that I always look at the old email first. This is so that when I check my email, I won’t miss any important conversation threads. This is also critical for step 4.&lt;/li&gt;
  &lt;li&gt;I will only check my email at set intervals. It may be every two hours, or three times a day. I haven’t decided. I was thinking about a slow transition at first, maybe hourly checks, but I really don’t want to be that involved with my inbox.&lt;/li&gt;
  &lt;li&gt;Write an Outlook VBA macro that makes categorizing and filing my email easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve already written the code for the button. It’s straight forward. I want to get a handle on the currently selected item in my inbox. Then I want to launch the Categories dialog so that I can add categories (tags) to the email. Then I want it to mark the email as read and file it away in my “File” folder (This is my only folder by the way as I use tags for everything).&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    Sub FileItem()
    Dim Item As MailItem
    Set Item = Outlook.Application.ActiveExplorer.Selection.Item(1)
    Item.ShowCategoriesDialog
    If Not Item.Categories = &quot;&quot; Then
        Item.UnRead = False
        Set dstFolder = GetFolder(&quot;Mailbox - ME\File&quot;)
        Item.Move dstFolder
    End If
    End Sub

    Public Function GetFolder(strFolderPath As String) As MAPIFolder
      Dim objApp As Outlook.Application
      Dim objNS As Outlook.NameSpace
      Dim colFolders As Outlook.Folders
      Dim objFolder As Outlook.MAPIFolder
      Dim arrFolders() As String
      Dim I As Long
      On Error Resume Next

      strFolderPath = Replace(strFolderPath, &quot;/&quot;, &quot;\&quot;)
      arrFolders() = Split(strFolderPath, &quot;\&quot;)
      Set objApp = CreateObject(&quot;Outlook.Application&quot;)
      Set objNS = objApp.GetNamespace(&quot;MAPI&quot;)
      Set objFolder = objNS.Folders.Item(arrFolders(0))
      If Not objFolder Is Nothing Then
        For I = 1 To UBound(arrFolders)
          Set colFolders = objFolder.Folders
          Set objFolder = Nothing
          Set objFolder = colFolders.Item(arrFolders(I))
          If objFolder Is Nothing Then
            Exit For
          End If
        Next
      End If
      Set GetFolder = objFolder
      Set colFolders = Nothing
      Set objNS = Nothing
      Set objApp = Nothing
    End Function
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;My plan is to expand on this “easy button” and add an additional option that will copy the email and fire it off to RTM as a Next Action. I’m hoping that by relying on RTM exclusively for Next Actions, it will make it easier to manage all the projects and tasks I’m working on.&lt;/p&gt;

&lt;p&gt;So, as I plan for this experiment to fail, I honestly believe that the worst thing that may happen is someone gets upset because I don’t respond to an email immediately. And to that I ask… If I have to respond to an email immediately, then why do I have a phone, and instant messaging? Is email really the best place to communicate emergencies? I’m sure people will disagree with me, and that’s ok.&lt;/p&gt;

&lt;p&gt;As I plan for success, I imagine less stress and more time to focus on my job, which is to deliver great software. In a perfect world, this would free up so much time that I’ll get spend more time coding on non-work projects for fun with my wife and kids :)&lt;/p&gt;

&lt;p&gt;Time will tell and I’ll report back with results.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>VisualSVN gets Visual Studio integration right</title>
   
     <link href="http://coovtech.com/posts/svn/" />
   
   <updated>2010-02-15T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/svn</id>
   <content type="html">&lt;p&gt;I’ve used three source control plug-ins for Visual Studio. Microsoft’s Visual Source Safe (VSS), Redgate’s Vault, and Subversions VisualSVN (SVN). Each have their pros and some have their cons.&lt;/p&gt;

&lt;p&gt;I’ve never liked VSS as a source code repository, mainly because it runs short of features that make development teams productive. For example, lets say two programmers want to modify the same file at the same time. Well, one dev has to check the file out, while the other dev creates their own local copy. Then, the dev who grabbed the file last has to somehow merge their changes in with the dev who has the actual file checked out. There are two major problems with this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It’s a productivity killer. There is nothing worse than trying to manually merge code. The fact that two programmers have to merge this code creates an expensive bottleneck.&lt;/li&gt;
  &lt;li&gt;It’s prone to error. Let’s face it, humans make mistakes all the time, programmers included. Its inevitable that mistakes will be made during the manual merge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Vault client is vastly superior over VSS in many ways. The auto-merge feature, the blame feature, the compare feature, the search filters, and the ability for devs to check out the same file at the same time, makes Vault a pleasure to work with. For the most part Vault handles complex merges fairly well. On occasion, it will trip up and I’ll have to manually merge something that seems trivial. Given the improvement over VSS, it one of those things where if its minor, you look the other way. The one thing that drives me nuts about vault is when the connection to the server times out, Vault (the Visual Studio enhanced plug-in) allows you to edit the file and will put the file in a renegade status. I wish I could change this behavior to warn me then reconnect to the server.&lt;/p&gt;

&lt;p&gt;SVN, and the Visual Studio plug-in VisualSVN, keeps things simple. All the features I want are right where I need them. It was easy to install, easy to configure, and provided seamless integration with Visual Studio. There is not a single feature that I need that SVN doesn’t provide. It has the blame feature, it has the merge feature, it lets you manually choose to lock a file exclusively. The best feature in my opinion is the visual way VisualSVN shows you the status of your files. They do a great job going down the document tree to let you see what file(s) is checked out. No more pulling up another view to see your checked out files, VisualSVN shows it to you right in the Solution Explorer window. For example, this shows me that I have the Site.css file checked out. It changes the color of the root, and all parent folders until you reach the file:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/coovtech/4361419228/&quot; title=&quot;VisualSVN Solution Explorer by CoovTech, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4071/4361419228_3a1daeb56c_o.jpg&quot; height=&quot;164&quot; alt=&quot;VisualSVN Solution Explorer&quot; width=&quot;194&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VisualSVNServer was free and I had it up and running on my Mediasmart Home Server in no time at all. VisualSVN, the Visual Studio Plugin, was $49 bucks.&lt;/p&gt;

&lt;p&gt;I’m still learning a lot about SVN and the Vault client that I use at work. I plan on taking a dive into Distributed Revision Control (DVCS) in the next few weeks. I have an open-source project that I’m working on and I want to see what the buzz is about GitHub and Mercurial.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The twitter complaint card</title>
   
     <link href="http://coovtech.com/posts/twitter-complaint/" />
   
   <updated>2010-02-13T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/twitter-complaint</id>
   <content type="html">&lt;p&gt;Raise your hand if you like to vent out loud? I sure do and so do millions of twitter users. I’ve tried to be cautious with what I vent about on twitter because it’s public and permanent. You don’t want your foul mouth rants following you where ever you go. Sometimes, though, you get frustrated enough that all bets are off and the venting flows freely.&lt;/p&gt;

&lt;p&gt;That was the case for me a couple of weeks ago when my recently upgraded Qwest connection went down. For about two days it was randomly disconnecting until finally it just died. Both my wife and I work from home and we go to school full time. Our internet connection is just as valuable to us as water and food. Well, not really, I’m just trying to be dramatic.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/assets.coovtech/Picture+1.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I posted the following message on twitter in frustration with my internet connection “#qwest Internet is down. I wish they would tweet or email stating such…”. Four minutes after sending that tweet I received a tweet back from @TalkToQwest asking for my billing number. A couple of tweets later I have a phone call from a tech guy at Qwest. When I say tech guy, I mean someone who “knows” tech like I know software. It’s almost as if the &lt;a href=&quot;http://www.hanselman.com/blog/FizzBinTheTechnicalSupportSecretHandshake.aspx&quot;&gt;Fizzbin&lt;/a&gt; keyword was spoken for me via twitter.&lt;/p&gt;

&lt;p&gt;After my quick tech call, I had a tech person at my door within a day or two and they fixed the issue. No annoying tech call for me where I had to talk to 20 different people and tell my story ten times over. I didn’t waste hours of my life trying to solve the problem myself. I simply vented using twitter as my audience and it payed dividends for me.&lt;/p&gt;

&lt;p&gt;I’m curious why a company would monitor twitter and provide great customer service on a social network and still maintain such horrible customer service standards via their call-in numbers or normal website. + 1 for qwest on the social front. -1 for paying someone real money to do this and not focus on your other major areas of customer service.&lt;/p&gt;

&lt;p&gt;While I’m on this topic, I thought I’d mention my hatred for Papa Johns. Not the food; the food is great. I recieved an email from them with a coupon. While my wife and I were running errands with the offspring, I decided to order from them via this coupon. I clicked the coupon and tried to pull up the phone number of the nearest resturant. No dice, their zip code finder could not find me even though I was standing in the same strip mall that the resturant sits in. So, I used Google maps on my iPhone to get their phone number. I placed my order on the phone with them and gave them the coupon. They rejected and said that it was a website only coupon. Are you freaking kidding me? So I went to the website and tried to order my pizza. They tout a mobile optomized website, one that I don’t need because I rock an iPhone but hey, mobile optomized means fast and that is exactly what I wanted. Imagine my surprise to find out that their registration process is more difficult than applying for a freaking credit card. You call that mobile optimized? Why on earth would you serve up a giant registration for to a potential customer on a mobile device? Needless to say, I opened my big mouth on twitter again “Papa Johns has the WORST mobile experience. Mobile should be fast &amp;amp; fluid. No long a$$ registration process. #fail”. Unfortunately for me, Papa Johns does not have a dedicated twitza (that’s a pizza twitter person) to review negative comments about them.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Data integrity, or lack thereof...</title>
   
     <link href="http://coovtech.com/posts/data-integrity/" />
   
   <updated>2010-02-13T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/data-integrity</id>
   <content type="html">&lt;p&gt;This is what happens when you don’t make database integrity a priority…&lt;/p&gt;

&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;196&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Flag&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Count&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;N&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;876179&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;NULL&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;812543&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;97164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;Y&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;34235&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;1&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;2729&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;N N&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;1132&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;N Y&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;Y Y&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;44128&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;305&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;28103&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;115&quot; valign=&quot;top&quot;&gt;Y N&lt;/td&gt;
&lt;td width=&quot;79&quot; valign=&quot;top&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content>
 </entry>
 
 <entry>
   <title>Take Control of Your URL’s</title>
   
     <link href="http://coovtech.com/posts/take-control/" />
   
   <updated>2010-01-14T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/take-control</id>
   <content type="html">&lt;p&gt;I did a side project once and a customer asked me why all their pages had “.aspx” at the end of them. I explained what it was and offered to “fix” that issue for a small price. After all, I was “solving” a problem. Since that conversation, I’ve always been bitter because I didn’t have a good answer to that question and I hate saying “just because”, as if some magical voodoo was forcing my into compliance with how my URL’s looked. I dislike URL “Rewriting”.&lt;/p&gt;

&lt;p&gt;One of my favorite features of ASP.NET MVC is the ease in which it allows me to control my URL’s. Routing!&lt;/p&gt;

&lt;p&gt;With Routing, its total control simplified. When writing my new blog engine I was trying to decide the shape of my URL’s for blog entries. Do I want mysite.com/Entries?id=3, or mysite.com/Entries/3, or how about mysite.com/Entries/Year/Month/Day/EntryTitle ?&lt;/p&gt;

&lt;p&gt;The built in routing engine makes this super simple. Here are the three different routs I mentioned above:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791747.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;In my Blog index view that lists recent entries, I have a RouteLink that points to the route I want. In this example, I’m using the “BlogPost2” route from above:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791748.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Now that I have the URL shaped the way I want it, I can add constraints too. For example, I may want to constrain the year/month/day to be 4/2/2 digits.&lt;/p&gt;

&lt;p&gt;I’d love to be able to call my customer back and tell him, sure, you can have yoursite.com/Monkey/Banana/MethodOfConsumption without the .aspx and I won’t charge you a dime!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Looking for a tag cloud for your site?</title>
   
     <link href="http://coovtech.com/posts/tag-cloud/" />
   
   <updated>2010-01-09T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/tag-cloud</id>
   <content type="html">&lt;p&gt;I’ve built tag clouds so many times recently I’ve been getting bored with it. The concept is simple. You have items that are tagged and you calculate the tag popularity based on a weighed average of the tag to items, then you apply a style based on score. The more one tag exists on what ever items you have (pictures, blog entries, etc), the heaver its weighted average will be and its style may pop-out more.&lt;/p&gt;

&lt;p&gt;Here is a tag cloud proc in SQL:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791736.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Here is a tag cloud proc in LINQ:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791739.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;You can iterate the result set and assign a style based on the weight:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.tc1 {font-size:8pt; color:#8B8B8B; text-decoration:none;}

.tc2 {font-size:10pt; color:#8B8B8B; text-decoration:none;}

.tc3 {font-size:12pt; color:#5C5858; text-decoration:none;}

.tc4 {font-size:14pt; color:#000000; text-decoration:none;}

.tc5 {font-size:16pt; color:#2554C7; text-decoration:none;}

.tc6 {font-size:16pt; color:#2554C7; text-decoration:none; font-weight:bold;}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This is cool visually but its been done a million times. When writing my new blog engine I was looking for something a little more fresh. I saw on Twitter the stack-exchange site of the day called “moms4mom”. I checked it out and saw a cool rotating tag cloud and was curious how they did it.&lt;/p&gt;

&lt;p&gt;I was going to ask the question on the stack exchange meta site but someone beat me to it. It’s a flash movie and its called “Cumulus” and was built as a plugin for WordPress. It’s now open source and I found a blog post by the author Roy Tanck, that talks about using the tag cloud in others projects.&lt;/p&gt;

&lt;p&gt;Here’s a brief summary of how I implemented it in my ASP.NET MVC blog engine:&lt;/p&gt;

&lt;p&gt;1) Go to the &lt;a href=&quot;http://wordpress.org/extend/plugins/wp-cumulus/download/&quot;&gt;WP-Cumulus download page&lt;/a&gt; and pull the latest version down. I’m on version 1.23.&lt;/p&gt;

&lt;p&gt;2) I stuck the swfobject.js and tagcloud.swf files in my site/content folder:&lt;/p&gt;

&lt;p&gt;3)I create a CSS Class helper that would return one of two classes based on an even or odd tag id (yes, I’m ditching the weighted average):&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791744.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;4) Created a partial view that iterates though my tags and calls the GetTagClass helper to set its style:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791743.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;5) Added the Javascript Below the div “recent-tag”:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791741.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;6) Created a method to retrieve the tags from the repository and load it into viewdata:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/791745.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;7) Run it and enjoy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>LINQ query with a join on an intersection table</title>
   
     <link href="http://coovtech.com/posts/linq-join/" />
   
   <updated>2010-01-08T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/linq-join</id>
   <content type="html">&lt;p&gt;I was working on my MVC blog engine when I needed to write a query that would return blog entries that contained a tag name. This query is simple to write in SQL. It’s a query from the blog entry, to the blog entry tag, to the blog tab tables.&lt;/p&gt;

&lt;p&gt;##SQL&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;select 
be.*
from
BlogEntry be
left join BlogEntryCategory bec on bec.BlogEntry_ID = be.BlogEntry_ID
join BlogCategory bc on bc.BlogCategory_ID = bec.BlogCategory_ID
and bc.Category like &#39;%&#39; + @Category + &#39;%&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I quickly discovered that this is not as straight forward as I thought it would be in LINQ. I first stared out trying to write joins but the whole “into” grouping was not cool. I then just used my sql proc but I lost my ability to leverage the IQueryable interface which I wanted to that I could chain other clauses against it later (such as the pagination I intend to implement).&lt;/p&gt;

&lt;p&gt;I found a &lt;a href=&quot;http://stackoverflow.com/questions/267488/linq-to-sql-multiple-left-outer-joins&quot;&gt;post on stackoverflow&lt;/a&gt; that talked about multiple left outer joins. Towards the bottom was a post was an answer from “aikr473” with an example of using Lambda expressions in the joins. This is exactly what I needed (I voted the answer up).&lt;/p&gt;

&lt;p&gt;##LINQ&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public IQueryable&amp;lt;BlogEntry&amp;gt; FindBlogEntriesByCategory(string category)
{
    return (from entries in db.BlogEntries
            from catlink in db.BlogEntryCategories.Where(e =&amp;gt; e.BlogEntry_ID == entries.BlogEntry_ID).DefaultIfEmpty()
            from Category in db.BlogCategories.Where(c =&amp;gt; c.BlogCategory_ID == catlink.BlogCategory_ID &amp;amp;&amp;amp; c.Category.Contains(category))
            orderby entries.Published descending
            select entries);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This allows me to set up the base query the way I want it, which is a result set sorted by the most recent posts. It also allows me to chain on to this statement later so that I can do something like a take or skip in a paging scenario.&lt;/p&gt;

&lt;p&gt;To give you an idea of how I’ll use this:&lt;/p&gt;

&lt;p&gt;##Controller&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;//
// GET: /Blog/Listing/3
public ActionResult Listing(string id, int? page)
{
    var entries = repository.FindBlogEntriesByCategory(id);
    var paginatedEntries = new PaginatedList&amp;lt;BlogEntry&amp;gt;(entries, page ?? 0, pageSize);
    return View(&quot;Index&quot;, paginatedEntries);
}
PaginatedList class (example taken from NerdDinner)

public class PaginatedList&amp;lt;T&amp;gt; : List&amp;lt;T&amp;gt;
{
    public int PageIndex { get; set; }
    public int PageSize { get; set; }
    public int TotalCount { get; set; }
    public int TotalPages { get; set; }
 
    public PaginatedList(IQueryable&amp;lt;T&amp;gt; source, int pageIndex, int pageSize)
    {
        PageIndex = pageIndex;
        PageSize = pageSize;
        TotalCount = source.Count();
        TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
 
        this.AddRange(source.Skip(pageIndex * pageSize).Take(pageSize));
    }
 
    public bool HasPreviousPage
    {
        get
        {
            return (PageIndex &amp;gt; 0);
        }
    }
 
    public bool HasNextPage
    {
        get
        {
            return (PageIndex + 1 &amp;lt; TotalPages);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This gives me a lot of flexibility on how I can pull the data out of sql repository, which may change based on the context of the area in my site that a person is visiting.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My Digital Backup Strategy (redux)</title>
   
     <link href="http://coovtech.com/posts/digital-backup-2/" />
   
   <updated>2010-01-02T00:00:00+00:00</updated>
   <id>http://coovtech.com/posts/digital-backup-2</id>
   <content type="html">&lt;p&gt;I’m an amateur photographer. I’ve enjoyed taking pictures ever since I was a kid. About two years ago I purchased a Nikon D40 and started using the Flickr photo sharing service so that my wife and I could share our memories with our extended family. Since then I have uploaded over 15,000 high quality images to Flickr.&lt;/p&gt;

&lt;p&gt;The whole concept of Flickr was fascinating to me because it’s a dirt cheap high capacity storage solution for media. It’s backed by Yahoo! and has been a cinch to work with. I’ve never worried about the data because they offer paid DVD copies if needed. Also, there are third party solutions that do backups locally. Not to mention they provide an API so I could write my own program for off-site storage.&lt;/p&gt;

&lt;p&gt;Recently, something happened that exposed my backup weakness…&lt;/p&gt;

&lt;p&gt;I had several hundred photos on a machine that I was selling to a friend. I wanted to move those photos to Flickr but had not gone through and touched them up so I opted to move them to an external hard drive.&lt;/p&gt;

&lt;p&gt;About a month after I sold my old machine I bought a MacBook Pro. The first thing I wanted to test was the TimeMachine backup utility. I already had an external hard drive and figured I could use it both on the Mac and my wife’s PC. Keep in mind that this is the hard drive that contained several hundred photos (and songs) that my wife really wanted. So, with the inexperience of a 5th grader, I slapped the drive on my desk, plugged it into the Mac and was on my way.&lt;/p&gt;

&lt;p&gt;I recall a modal dialog that was severed up to me. Something about the drive not formatted for that Mac and that it wanted to reformat it. I heard that it was easy to partition drives on the Mac so that’s what I did. Half for the Mac half for the PC. I setup time machine and it worked flawlessly.&lt;/p&gt;

&lt;p&gt;Once I had the Mac backed up, I went over to back up the wife’s computer and hooked up the hard drive. I decided to check on those files just to make sure they were safe. Nope… Something went horrible wrong. When I formatted the drive, it seems like it formatted the entire drive to be Mac friendly, then partitioned out a windows area. The panic ensued!&lt;/p&gt;

&lt;p&gt;I immediately went into damage control mode. How do I recover the files? I searched and searched until Google called and asked me to stop hogging their bandwidth. I’ve tried program after program but I cant get these files back. The strange thing is that the files are there.Each utility can locate the files but they can’t read them. Were they corrupted?. I’m screwed!&lt;/p&gt;

&lt;p&gt;What I have now is a paper weight. I don’t want to use the drive anymore because these precious files are on it. I’m in denial that they are unrecoverable because I haven’t taken it to a professional yet for an opinion.&lt;/p&gt;

&lt;p&gt;The good news from this experience is that I’ve become much more data conscious.&lt;/p&gt;

&lt;p&gt;##The solution…&lt;/p&gt;

&lt;p&gt;I just purchased an &lt;a href=&quot;http://tinyurl.com/d7buy5&quot;&gt;HP EX487 MediaSmart Home Server&lt;/a&gt;. It’s a 1.5 TB backup solution for the house. It also centralizes all types of media content that can be shared from anywhere with an internet connection. I really like the iTunes centralization so that my wife and I can hook up our computers to one library. It also offers integration with Flickr for my photos. I fully intend to load my pics on the mac, edit until my hearts content, move the data to the server and have it automatically load my pictures on flickr.&lt;/p&gt;

&lt;p&gt;I’ve got the Mac doing monthly/weekly/daily/hourly backups with time machine both on a dedicated hard drive, and the Windows Home Server.&lt;/p&gt;

&lt;p&gt;So, in addition to a backup solution for both my mac and pc’s, I now have a file sharing server which means I can load all my HD video (I have about 100 GB on my mac right now), audio files and other crap onto this server and keep it off of my machines. You can call Flickr my redundant backup solution for photos. I don’t like clutter and I hate slowness and I hope to really clean things up. With my new 20 MPS internet connection I suspect that the backups and file sharing will be very fluid. Did I mention this thing has dual 750 GB 7200 RPM drives?&lt;/p&gt;

&lt;p&gt;I also have a separate 1 TB drive that I will use to backup the server. I’m currently investigating online storage that is cheap and integrates seamlessly with the home server so that I’m completely covered for any disasters at the house.&lt;/p&gt;

&lt;p&gt;** Update **&lt;/p&gt;

&lt;p&gt;I do like my backup plan. It seems strong and reliable. At least I thought it was until I heard what Jeff Atwood and Phil Haack went through with their blogs. This scares me on many levels. Not only am I concerned about my photos on Flickr, but also blog posts and some social networking content (such as family events I’ve scheduled on Facebook). I have one particular blog entry &lt;a href=&quot;http://azcoov.blogspot.com/2008/03/our-son-liam-was-born-with-very-mild.html&quot;&gt;about my son&lt;/a&gt; that I treasure. The Windows Home Server has been rock solid but it doesn’t store everything I want and its a machine and thus is prone to failure.&lt;/p&gt;

&lt;p&gt;I started out focusing on backing up my blog content. I wrote a program a while back that scrapes my atom feeds, then parses the xml and stores the content in a SQL database. In fact, I use this very same program to backup friends blog content and even some corporate businesses content. It works perfectly well with Atom and is extensible. The problem is that I don’t control the backup of my SQL database; my hosting company M6.net does.&lt;/p&gt;

&lt;p&gt;I looked for another utility and found this open source gem called &lt;a href=&quot;http://www.codeplex.com/bloggerbackup&quot;&gt;Blogger Backup&lt;/a&gt;. It’s using the GData C# library and allows you to authenticate with your Blogger account to pull down all content and save the data as xml. I took advantage of this, copied all my entries into a dropbox folder and replicated it to my Windows Home Server. Now I’m covered right?&lt;/p&gt;

&lt;p&gt;I wasn’t satisfied. I don’t want to manage backups, especially if I have to manage different content in different ways. I want a utility that will back everything up regardless of what the content is.&lt;/p&gt;

&lt;p&gt;I stumbled upon this website called backupify. Its a cloud based storage solution for almost any content. It uses Amazon Web Services and connects to nearly all social platforms, with your credentials and authorization, and stores your data in the cloud. Best of all, they are providing the service free for life until January 31st. Here’s how it works.&lt;/p&gt;

&lt;p&gt;Finally, I can sleep at night. This has a huge &lt;a href=&quot;http://en.wikipedia.org/wiki/Wife_acceptance_factor&quot;&gt;WAF&lt;/a&gt; by the way…&lt;/p&gt;
</content>
 </entry>
 

</feed>