<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hot Koehls &#187; crappy coding</title>
	<atom:link href="http://frankkoehl.com/tag/crappy-coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://frankkoehl.com</link>
	<description>The more you know, the more you don&#039;t know</description>
	<lastBuildDate>Thu, 10 May 2012 18:34:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Building a complex system? Take easy steps.</title>
		<link>http://frankkoehl.com/2010/03/building-complex-system-take-easy-steps/</link>
		<comments>http://frankkoehl.com/2010/03/building-complex-system-take-easy-steps/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 20:28:08 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For techies]]></category>
		<category><![CDATA[coding theory]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=1192</guid>
		<description><![CDATA[After launching Fwd:Vault last month, it&#8217;s been a race to add the necessary features and functions to take the service broader. First on the list was more subscription tiers. I launched with just two: free and &#8220;unlimited everything.&#8221; I did this because, well, it was easy. Your instinct may be to dismiss my decision as [...]]]></description>
			<content:encoded><![CDATA[<p>After <a href="/2010/02/celebrate-the-little-victories">launching Fwd:Vault last month</a>, it&#8217;s been a race to add the necessary features and functions to take the service broader. First on the list was more subscription tiers. I launched with just two: free and &#8220;unlimited everything.&#8221; I did this because, well, it was easy.</p>
<p>Your instinct may be to dismiss my decision as laziness, but hear me out. I built most of the base site with just 1 state: free (remember that unlimited free beta period last year?). That allowed me to &mdash; rightly &mdash; focus purely on features, functions, bugs, etc. Dealing with subscription tiers at the same time would have clouded everything, slowing everything down and likely leading to more rewriting. Staying focused allowed me to get the cornerstone stuff right before building on top of it. </p>
<p>I applied the same thought process when it came time to offer paid options. The game plan has always been to have three paid options, plus the free account. However instead of initially coding four possible user states, I started with just two: free or paid.</p>
<p>This makes my job as a developer much more focused. There&#8217;s a LOT of logic in a service like Fwd:Vault focused explicitly on subscriptions: access permissions, showing/hiding upgrade options, setting quota restrictions, security checks to prevent hackarounds from unscrupulous users. The functionality of almost every page is affected by the user&#8217;s free/paying status, and don&#8217;t even get me started on the work it takes to process credit cards. You have to be <del>doubly</del> triply careful when dealing with people&#8217;s personal data like that. On and on. Getting the basics in place takes a lot of forethought and coding.</p>
<p>So instead of thinking about all this stuff in four dimensions &mdash; free, option 1, option 2, option 3 &mdash; I can cover most everything in just two &mdash; free or paid &mdash; and then come back later to fill in the holes for the other tiers.</p>
<p>Complexity is your enemy as a developer. Each task must be as tightly focused as possible. The tighter your focus, the less chance you&#8217;ll have to introduce bugs. Adding more later may require rewrites, but they are far far easier than rewriting the big sloppy mess you get when biting off more than you can chew.</p>
<p>With the basic subscription and tier logic in place, it&#8217;s a far simpler matter to expand the options out to infinity (though we&#8217;ll start with four). Expect to see the new pricing options in a few weeks.</p>
<p>Looking for more to read? There&#8217;s a new post on the Fwd:Vault Blog that details the <a href="http://blog.fwdvault.com/2010/03/always-forgetting-to-defrag-use-your-screensaver/">most unobtrusive disk defragmenting process</a> I&#8217;ve seen (that I also use for my own systems).</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2010/03/building-complex-system-take-easy-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get domain out of any URL string (yes, really)</title>
		<link>http://frankkoehl.com/2009/10/get-domain-out-of-any-url-string/</link>
		<comments>http://frankkoehl.com/2009/10/get-domain-out-of-any-url-string/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 19:21:44 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For techies]]></category>
		<category><![CDATA[coding theory]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[regular expressions]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=951</guid>
		<description><![CDATA[It&#8217;s a common problem with no single right answer: extract the top domain (e.g. example.com) from a given string, which may or may not be a valid URL. I had need of such functionality recently and found answers around the web lacking. So if you ever &#8220;just wanted the domain name&#8221; out of a string, [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s a common problem with no single right answer: extract the top domain (e.g. example.com) from a given string, which may or may not be a valid URL. I had need of such functionality recently and found answers around the web lacking. So if you ever &#8220;just wanted the domain name&#8221; out of a string, give this a shot&#8230;</p>
<pre lang="php">
<?php
function get_top_domain($url, $remove_subdomains = 'all') {
  $host = strtolower(parse_url($url, PHP_URL_HOST));
  if ($host == '') $host = $url;
  switch ($remove_subdomains) {
    case 'www':
      if (strpos($host, 'www.') === 0) {
        $host = substr($host, 4);
      }
      return $host;
    case 'all':
    default:
      if (substr_count($host, '.') > 1) {
        preg_match("/^.+\.([a-z0-9\.\-]+\.[a-z]{2,4})$/", $host, $host);
        if (isset($host[1])) {
          return $host[1];
        } else {
          // not a valid domain
          return false;
        }
      } else {
        return $host;
      }
    break;
  }
}

// some examples
var_dump(get_top_domain('http://www.validurl.example.com/directory', 'all'));
var_dump(get_top_domain('http://www.validurl.example.com/directory', 'www'));
var_dump(get_top_domain('domain-string.example.com', 'all'));
var_dump(get_top_domain('domain-string.example.com/nowfails', 'all'));
var_dump(get_top_domain('finds the domain url.example.com', 'all'));
var_dump(get_top_domain('12.34.56.78', 'all'));
?>
</pre>
<p>Most of the examples are simply proofs, but I want to draw attention to the string in example #4, <code>'domain-string.example.com/nowfails'</code>. This is not a valid URL, so the call to <code>parse_url()</code> fails, forcing the script to use the entire original string. In turn, the path part of the string causes the regex to break, causing a complete failout (<code>return false;</code>).</p>
<p>Is there a way to account for this? Surely, however I&#8217;m not about to tap that massive keg of exceptions (i.e. just a slash, slash plus path, slash plus another domain in a human-readable string, etc).</p>
<p>No regex for validating URL&#8217;s or email addresses is ever perfect; the &#8220;strict&#8221; RFC requirements are too damn broad. So I did what I always do: chose &#8220;what works&#8221; over &#8220;what&#8217;s technically right.&#8221; This one requires any 2-4 characters for a the top level domain (TLD), so it doesn&#8217;t allow for the .museum TLD, and doesn&#8217;t check to see if the provided TLD is actually valid. If you need to do further verification, that&#8217;s on you. Here&#8217;s the <a href="http://data.iana.org/TLD/tlds-alpha-by-domain.txt">current full list of valid TLD&#8217;s provided by the IANA</a>.</p>
<p>If you need to modify the regex at all, I highly recommend you read this <a href="http://www.regular-expressions.info/email.html">article about email address regex</a> first for two reasons: </p>
<ol>
<li>There&#8217;s a ton of overlap between email and URL regex matching</li>
<li>It will point out all the gotcha&#8217;s in your &#8220;better&#8221; regex theory that you didn&#8217;t think about</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/10/get-domain-out-of-any-url-string/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fix emails dropped or blocked by Comcast</title>
		<link>http://frankkoehl.com/2009/08/email-dropped-blocked-comcast/</link>
		<comments>http://frankkoehl.com/2009/08/email-dropped-blocked-comcast/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 02:25:41 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For techies]]></category>
		<category><![CDATA[business support]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[customer service]]></category>
		<category><![CDATA[fwdvault]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[tech support]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=728</guid>
		<description><![CDATA[As an email-based backup service, Fwd:Vault ran into spam filters pretty quickly. Most of this can be mitigated with proper server configuration and getting records in the right places (i.e. abuse.net). From there it&#8217;s simply a matter of reminding users to check the spam folder when things are missing. However through the tribulations of one [...]]]></description>
			<content:encoded><![CDATA[<p>As an email-based backup service, <a href="http://fwdvault.com">Fwd:Vault</a> ran into spam filters pretty quickly. Most of this can be mitigated with proper server configuration and getting records in the right places (i.e. <a href="http://abuse.net">abuse.net</a>). From there it&#8217;s simply a matter of reminding users to check the spam folder when things are missing.</p>
<p>However through the tribulations of one of my testers, I found out that Comcast goes the extra mile for users of their comcast.net webmail. Unlike most setups, where spam is simply redirected to a spam-specific folder, Comcast will <strong>delete the message outright</strong>, without issuing any kind of notice to the sender or recipient.</p>
<p>Truly, above and beyond (belief).</p>
<p>Of all the lousy IT practices I&#8217;ve seen over the years, this one takes the cake. No spam filter is perfect, so it&#8217;s guaranteed that they are dropping legitimate emails (case-and-point: I&#8217;m losing Fwd:Vault account emails). Plus it appears they default to a &#8220;highly suspicious&#8221; mode with newer systems, as <code>fwdvault.com</code>, my IP address, and my DNS records are completely fresh and unblemished.</p>
<p>Finally, the sheer size of their operation means that getting a hold of anyone to actually fix the problem when it happens to you is virtually zero. I&#8217;d go so far as to say that they can get away with this nonsense precisely <strong>because</strong> they are a large ISP. As a former &#8220;your company IT guy,&#8221; I can imagine getting at least an earful, and at worst a pink slip, if I were caught doing this.</p>
<p>Despite my astonishment, I couldn&#8217;t deny reality. Through my logs I watched Fwd:Vault&#8217;s mail server find their systems, connect, and deliver the message and get a 250 response code (i.e. all good). Then over in my comcast.net inbox I&#8217;d get exactly nada, ditto for the spam folder. Since the actual delivery had no technical issue, I had zero clue as to the cause of the problem. I wasn&#8217;t on any blacklists, the IP was static, and my DNS records were in good order, including a reverse DNS record with my hosting service.</p>
<p>Fortunately, it seems that someone in the trenches at Comcast is fighting the good fight, as I took two long-shot attempts today and it seems one of them paid off. Here&#8217;s what I did, hopefully it works for you.</p>
<p><strong>1. Use the feedback form at comcastsupport.com</strong><br />
I tried to retrace my steps on how I found this one, but their sites are so damn convoluted I kept going in circles. However I know I started from inside the web mail interface, aka their &#8220;SmartZone&#8221;.</p>
<p>(See kids? That&#8217;s what we call irony. Can you say, &#8220;irony?&#8221;)</p>
<p>Whatever, here&#8217;s the link. You don&#8217;t need to log in to use the form:</p>
<p><a href="http://www.comcastsupport.com/forms/net/sccfeedback.asp">http://www.comcastsupport.com/forms/net/sccfeedback.asp</a></p>
<p>I selected <code>Spam or Junk Mail</code> in the checkboxes and wrote something to the effect of:</p>
<blockquote><p>I am not receiving mail from example.com in my Comcast email. I own and operate the mail server for this domain and have confirmed through my logs that the message is delivered properly (response code 250) to Comcast MX servers. </p>
<p>My tests delivered via the server mx.comcast.net (IP 00.00.00.00). It&#8217;s been over 24 hours and I have not received a bounce, nor is anything showing up in my inbox or spam folder. </p>
<p>As I have nothing else to go on, I am looking for help from your end.</p></blockquote>
<p>I did not receive any reply, however I also took another step&#8230;</p>
<p><strong>2. Use their RBL Removal Form</strong><br />
This should only apply if your mail server has actually been blocked by Comcast, in which case you would likely see an error code of 550 in your logs. If your server picks up the full response from Comcast, you may also get additional helpful information as outlined in their list of custom <a href="http://postmaster.comcast.net/mail-error-codes.aspx">mail delivery error codes</a>.</p>
<p>None of this applied to me, as the connection and delivery went off without a hitch. Still, I figured it was worth a shot; a bureaucracy this big is bound to have systems running into one another.</p>
<p>I sent in a request to be removed from their RBL by way of this form:</p>
<p><a href="http://www.comcastsupport.com/Forms/NET/blockedprovider.asp">http://www.comcastsupport.com/Forms/NET/blockedprovider.asp</a></p>
<p>Most of the information will depend on your setup, however I did check the boxes for <code>Implemented technology to filter or prevent transmission of spam</code> and <code>Changed the rDNS records to reflect a consistent and non-dynamic setting</code> just in case. I included text similar to what I outlined earlier in the <code>Issue Description</code> box.</p>
<p>I saw emails coming through less than 30 minutes after sending this message. However, I sent the feedback first, followed by a brief online chat with their support, who directed me to the RBL form. All told it was at least an hour between my first step and the delivered message.</p>
<p><strong>Update:</strong> I received this message back in response to my RBL request&#8230;</p>
<blockquote><p>Thank you for contacting Comcast Customer Security Assurance. We have received and reviewed your RBL removal request.</p>
<p>Below each IP address you submitted in your request, we have included the result of our research. Please do not reply to this message.</p>
<p><strong>[IP address(es)]</strong></p>
<p>We have received your request for removal from our inbound blocklist. After investigating the issue, we have found that the IP you provided for removal is currently not on our blocklist.</p>
<p>We need the IP address currently blocked to further investigate this issue. The IP address is a number separated by decimals and is located in an error code starting with &#8220;550&#8243; in the returned email from Comcast.  You can learn more about how to identify a blocked IP by visiting our Frequently Asked Question page at:<br />
<a href="http://www.comcast.net/help/faq/index.jsp?faq=SecurityMail_Policy18667">http://www.comcast.net/help/<wbr>faq/index.jsp?faq=<wbr>SecurityMail_Policy18667</a></p>
<p>Please verify the IP(s) and resubmit your request to <a href="http://www.comcastsupport.com/rbl">http://www.comcastsupport.com/rbl</a>
</p></blockquote>
<p>So it looks like the RBL request didn&#8217;t do anything. Unless it did, and some numb-nut at Comcast was covering for their idiotic policies.</p>
<p>My gut tells me that I caught a particularly helpful support person manning the feedback desk who was able to punch the few keys it took to rectify the problem. If that&#8217;s the case, thanks for the help, and I hope the rest of you get to run into him/her as well. I sent the message around 2:00 pm on a Monday.</p>
<p>You can find more helpful information, including a link to the Blacklist Removal Request Form, on the <a href="http://postmaster.comcast.net/">Comcast Postmaster Site</a>.</p>
<p>Best advice I can give: encourage your users to switch to <a href="http://www.gmail.com">Gmail</a>.  <img src='http://frankkoehl.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/08/email-dropped-blocked-comcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opera hanging on page load on your site? Check for missing files.</title>
		<link>http://frankkoehl.com/2009/04/opera-hanging-page-load/</link>
		<comments>http://frankkoehl.com/2009/04/opera-hanging-page-load/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 18:56:32 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For entrepreneurs]]></category>
		<category><![CDATA[For techies]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=490</guid>
		<description><![CDATA[I recently discovered an issue with the mailing list signup on the Fwd:Vault placeholder site. [Aside: It was perfect when I set it up, I swear there are gremlins in my code sometimes. If you tried to sign up and were unable to, I apologize, try it one more time.] After fixing the issue, I [...]]]></description>
			<content:encoded><![CDATA[<p>I recently discovered an issue with the mailing list signup on the <a href="http://fwdvault.com">Fwd:Vault placeholder site</a>. [Aside: It was <strong>perfect</strong> when I set it up, I swear there are gremlins in my code sometimes. If you tried to sign up and were unable to, I apologize, try it one more time.] After fixing the issue, I naturally tested it in every browser, and Opera was simply hanging at the page load. The page would visually come up fully, but the Javascript effects wouldn&#8217;t fire, making the signup form unresponsive.</p>
<p>To start figuring it out, I enabled the Progress Bar to check out when/where the problem occurred. The bar contains a bunch of useful stats while the page is loading. To see the bar yourself:</p>
<p><code>Shift-F12 &gt; "Toolbars" tab &gt; choose "Pop-up at bottom" from dropdown</code>.</p>
<p>Here&#8217;s a screenshot of the menu:</p>
<p><img class="alignleft size-full wp-image-492" title="opera-appearance-menu" src="http://frankkoehl.com/wp-content/uploads/opera-appearance-menu.png" alt="opera-appearance-menu" /></p>
<p>Then I refreshed the pageload and saw this&#8230;</p>
<p><img class="alignleft size-full wp-image-491" title="opera-pageload-hang" src="http://frankkoehl.com/wp-content/uploads/opera-pageload-hang.png" alt="opera-pageload-hang" /></p>
<p>Note the &#8220;Elements&#8221; load is off by one, yet the request is listed as &#8220;completed.&#8221; Keep in mind that the browser is still acting like it&#8217;s loading at this point: hourglass cursor, and I couldn&#8217;t interact with the page. To make matters worse, you can&#8217;t click through to see any further details on any of these stats, which is really dumb since this summary information is coming from <strong>some</strong>where.</p>
<p>Opera&#8217;s Developer Tools, Error Console, and Java Console interfaces showed nothing. I probed the rest of Opera&#8217;s menu&#8217;s and output options, and couldn&#8217;t find anything to support remedying the situation. I could be wrong of course, so if you have more Opera experience, please let me know where to look.</p>
<p>Instead, I used Firebug to discover a missing Javascript file, as the title suggests. I had a standard <code>&lt;script src=[...]&gt;&lt;/script&gt;</code> block, but the target file wasn&#8217;t in place. Now every other browser had handled this situation just fine, they timed out on the missing file and moved on. Opera is apparently more insistent, which wouldn&#8217;t be a problem if they provided the information necessary to diagnose the situation or manually override the hanging pageload.</p>
<p>This behavior is simply idiotic planning on Opera&#8217;s part: end users see a finished page that doesn&#8217;t allow interaction, and webmasters get zero clue to the cause of the hangup.</p>
<p>Expounding, this seeming lack of user focus likely contributes to Opera&#8217;s weak market position. With all the free choices out there, they have to be the most appealing in one or more categories to one or more demographics, and I never saw anything Opera that differentiated it significantly from the pack. That seems like a &#8220;Business 101&#8243; observation to me, but they certainly <a href="http://www.pownce.com/">aren&#8217;t</a> <a href="http://en.wikipedia.org/wiki/Kozmo.com">the</a> <a href="http://en.wikipedia.org/wiki/Flooz.com">first</a> <a href="http://en.wikipedia.org/wiki/Pets.com">netcom</a> to come along without a clearly defined path to market and profit.</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/04/opera-hanging-page-load/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Where is the Google Analytics code block?</title>
		<link>http://frankkoehl.com/2009/04/where-is-the-google-analytics-code-block/</link>
		<comments>http://frankkoehl.com/2009/04/where-is-the-google-analytics-code-block/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 16:02:45 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For entrepreneurs]]></category>
		<category><![CDATA[For everyone]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user interfaces]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=473</guid>
		<description><![CDATA[This is the kind of &#8220;usability fail&#8221; that drives me nuts, especially from a company of Google&#8217;s caliber. When you add a new site to Google Analytics, they present you with the Javascript code block you need during the setup process. But what if you need to look up that code block again? What if [...]]]></description>
			<content:encoded><![CDATA[<p>This is the kind of &#8220;usability fail&#8221; that drives me nuts, especially from a company of Google&#8217;s caliber. When you add a new site to <a href="https://www.google.com/analytics/">Google Analytics</a>, they present you with the Javascript code block you need during the setup process. But what if you need to look up that code block again? What if Google updates the Analytics code block (<a href="http://www.google.com/support/googleanalytics/bin/answer.py?hl=en&amp;answer=69588">they just did it in Dec 2008</a>)? Naturally you go back to the Analytics site to get the code&#8230;<br />
<a rel="lightbox" href="http://frankkoehl.com/wp-content/uploads/analytics_ss.png"><img src="http://frankkoehl.com/wp-content/uploads/analytics_ss-300x140.png" alt="Analytics Screenshot" title="Analytics Screenshot" width="300" height="140" class="alignleft size-medium wp-image-481" /></a><br />
Where&#8217;s the code block at? Anyone else stumped? Keep in mind that I limited this puzzle to just a single page; I scoured the whole site before finding the link on this page. As it turns out, the code block is hiding in the <em>Check Status</em> link in the top right corner of the main column.<br />
<a rel="lightbox" href="/wp-content/uploads/analytics_ss_link.png"><img src="http://frankkoehl.com/wp-content/uploads/analytics_ss_link.png" alt="Analytics Tracking Code Link" title="Analytics Tracking Code Link" width="277" height="72" class="alignleft size-full wp-image-484" /></a><br />
It&#8217;s not part of any of the standardized navigation — the header, the breadcrumbs, the sidebar — and the link text is not at all indicative of what the resulting page contains. Speaking of which, the page that actually houses the code is even more incriminating.<br />
<a rel="lightbox" href="http://frankkoehl.com/wp-content/uploads/analytics_ss_code.png"><img src="http://frankkoehl.com/wp-content/uploads/analytics_ss_code-300x260.png" alt="Analytics code page" title="Analytics code page" width="300" height="260" class="alignleft size-medium wp-image-485" /></a><br />
The &#8220;status&#8221; information appears at least in part on the previous page, so the overt purpose of this page is pretty worthless. To make matters worse, the breadcrumb actually says &#8220;Tracking Code.&#8221; So someone got the right idea when they put this page together, but didn&#8217;t follow through when hooking it up to the rest of the site navigation.</p>
<p>Everyone (and so every company) makes mistakes. However Analytics is an offshoot of the Google AdWords service, which is their bread and butter. This kind of oversight on a flagship product is simply sloppy.</p>
<p>Make sure that you spend all the necessary time on the key &#8220;touch points&#8221; of your site/service to ensure they are operating at their maximum.</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/04/where-is-the-google-analytics-code-block/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Do the upfront planning</title>
		<link>http://frankkoehl.com/2009/04/do-the-upfront-planning/</link>
		<comments>http://frankkoehl.com/2009/04/do-the-upfront-planning/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 15:14:06 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For entrepreneurs]]></category>
		<category><![CDATA[For techies]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[fwdvault]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=4</guid>
		<description><![CDATA[Since announcing my work on Fwd:Vault, a few friends have come forward expressing interest in being angel investors. From what I&#8217;ve read, most entrepreneurs have to seek such people out, so I&#8217;ll take it as a compliment that these friends either (a) really like me, or (b) really trust my technical and prowess. I&#8217;m leaning [...]]]></description>
			<content:encoded><![CDATA[<p>Since announcing my work on <a href="http://fwdvault.com">Fwd:Vault</a>, a few friends have come forward expressing interest in being angel investors. From what I&#8217;ve read, most entrepreneurs have to seek such people out, so I&#8217;ll take it as a compliment that these friends either (a) really like me, or (b) really trust my technical and prowess. I&#8217;m leaning towards (a)&#8230;</p>
<p>Anyway, despite my obvious flattery at the offer, I always answer the same way&#8230;</p>
<blockquote><p>I&#8217;m not looking for investors at the moment, no. My goal is to get this thing off the ground with zero incurred debt or outside investment, and grow with revenue. That&#8217;s the beauty of a dotcom startup: depending on what you&#8217;re doing, if you put it together the right way the first time, it can largely run itself.</p></blockquote>
<p>Think about that. After several months analyzing technical requirements, programming, support, customer service, marketing, etc., I&#8217;m confident that I can run the entire business in a solo fashion until reaching a certain point in revenue. The only reason I can do this is because I am setting myself up for a launch with as many core features and as few bugs as humanly possible. That will allow me to focus on customer support and marketing, both of which require that I <strong>not</strong> have my head buried in a computer screen 12 hours a day.</p>
<p>I don&#8217;t care what <a href="http://www.amazon.com/Ready-Fire-Aim-Million-Agora/dp/0470182024">Michael Masterson</a> says, &#8220;ready-fire-aim&#8221; will only create more work for you down the road. Don&#8217;t fire off projects half-cocked. Take the time to lay the groundwork, and you&#8217;ll reap huge benefits in the long-term.</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/04/do-the-upfront-planning/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Free and open source alternative to ShareThis, AddThis, AddToAny</title>
		<link>http://frankkoehl.com/2009/03/free-open-source-alternative-sharethis-addthis-addtoany/</link>
		<comments>http://frankkoehl.com/2009/03/free-open-source-alternative-sharethis-addthis-addtoany/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 20:00:17 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For techies]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[lifestream]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[social networking]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=429</guid>
		<description><![CDATA[Update: Make sure you check out the comments! My post is just a launching point for some great commentary from staff at iBegin Share and Add to Any. Every site with timely or useful content should utilize some on-site bookmark sharing tool. I&#8217;m talking about the bar of links to social networking sites like Facebook, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> Make sure you check out the comments! My post is just a launching point for some great commentary from staff at iBegin Share and Add to Any.</p>
<p>Every site with timely or useful content should utilize some on-site bookmark sharing tool. I&#8217;m talking about the bar of links to social networking sites like Facebook, Digg, Reddit, Twitter, etc. that you find at the end of a post. These buttons are preset to recognize the URL of the page they appear on, allowing visitors to quickly propagate your content to their digital lifestream. WordPress specifically offers <a href="http://wordpress.org/extend/plugins/search.php?q=bookmark">a ton of plugins</a> that offer such functionality.</p>
<p>The most popular tools use Javascript to display all the sites in a popup: <a href="http://www.addtoany.com/">Add to Any</a>, <a href="http://www.addthis.com/">AddThis</a>, and <a href="http://sharethis.com/">ShareThis</a>. Speaking in terms of pure function, these tools are great: they make sharing functionality readily available without cluttering up the display.</p>
<p>However these JS-based bookmarkers possess some significant downsides. First and foremost are the performance concerns. These tools are all stored remotely, and get loaded on your page as a javascript include. Here&#8217;s an example of the code from ShareThis:</p>
<pre lang="html"><script src="http://w.sharethis.com/button/sharethis.js#tabs=web%2Cpost%2Cemail&amp;charset=utf-8&amp;style=default&amp;publisher=abc123" type="text/javascript"><!--mce:0--></script></pre>
<p>Pay attention specifically to <code>src="http://w.sharethis.com/button/sharethis.js[...]"</code>. It&#8217;s just a normal URL, like any page you visit. This means that each time the page is loaded, the user&#8217;s browser goes off to retrieve a copy of the javascript required to display the button. Aside from the obvious bump in bandwidth usage, they can cause an obvious delay in page loading. Worse, if the service is experiencing any kind of slowdown or outage, including these services can cause your site to hang and timeout. And these services <strong>do</strong> hang on a regular basis. I&#8217;ve seen it last so long on my own blog that I&#8217;ve had to disable to the plugin until service returned. That the delay is not your fault does not matter; it slows <strong>your</strong> page down, making <strong>you</strong> the laggard in the eyes of users. Not good.</p>
<p>But while these services are not focused on reliability and uptime, they do spend an awful lot of time on data collection/aggregation, legal, and advertising. None of these are good for you, the site owner. All activity surrounding the button on your site is tracked. They can partner with ad networks, packaging in extra ad cookies when the button is served up. Aside from the privacy issues, this again increases bandwidth. Imagery — specifically the branded icons of each service — are copyrighted, making them subject to usage restrictions and leaving you open to dealing with pain-in-the-ass take-down requests. <strong>Update:</strong> Per conversation with Add to Any Founder Pat Driven in the comments, Add to Any actually avoids this type of language entirely, limiting all their legal jargon to a <a href="http://www.addtoany.com/privacy">plain-speak Privacy Policy</a>.</p>
<p>To be clear, there&#8217;s <strong>nothing inherently wrong</strong> with any of this. These are businesses, they provide a service and have to make money to stay alive. However I think the vast majority of users just want the fancy javascript popup, everything else is excess baggage.</p>
<p>Enter <a href="http://www.ibegin.com/labs/share/">iBegin Share</a>, a free, open source alternative for javascript-powered bookmark sharing. Instead of going offsite to retrieve code at each page load, iBegin Share runs locally on your site, saving you bandwidth and decreasing load time. iBegin Share tracks usage like its corporate counterparts, but that data is stored in your database and used for your own data tracking purposes only, saving more bandwidth (since it doesn&#8217;t have to communicate back) and your privacy. Finally, since its open source you can modify the code any way you want: change the look, layout, color scheme — the tool includes 4 preset color schemes, plus an option for text vs. button link — even add totally new share options. <a href="http://www.ibegin.com/labs/share/">A WordPress plugin version is available.</a></p>
<p>On the downside, external documentation is pretty thin at the moment, but the code is well-commented. <a href="http://www.ibegin.com/labs/forums/">There is also a forum</a>, but activity there is rather limited right now — a <a href="http://www.ibegin.com/labs/forums/index.php?topic=45.0">discussion on a seemingly common issue</a> started earlier this month has yet to receive any official word. So you&#8217;re on your own with any heavy customizing or problems, but I suppose that&#8217;s the tradeoff for eliminating any third party eyes poking around your traffic. Assuming it works as advertised, I&#8217;d argue that it&#8217;s a far better deal than the other tools, even without any customization ability.</p>
<p>If you decide to give iBegin Share a shot, or if you&#8217;re using it already, I&#8217;d love to hear how it&#8217;s working for you. Please share your experiences in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/03/free-open-source-alternative-sharethis-addthis-addtoany/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Trouble logging into anything Google from Firefox</title>
		<link>http://frankkoehl.com/2009/02/trouble-anything-google-firefox/</link>
		<comments>http://frankkoehl.com/2009/02/trouble-anything-google-firefox/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 04:17:04 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For everyone]]></category>
		<category><![CDATA[For techies]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=385</guid>
		<description><![CDATA[That&#8217;s what I keep getting everywhere I go in the Google universe for the past several days using Firefox (using latest stable release, v3.0.6). I know I&#8217;m not the only one, I&#8217;ve found a plethora of recent support posts discussing the same issue. Normally I&#8217;m the one writing here to say &#8220;Hey, look out for [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/examples/bad_request.png" alt="400 Bad Request" /><br />
That&#8217;s what I keep getting everywhere I go in the Google universe for the past several days using Firefox (using latest stable release, v3.0.6). I know I&#8217;m not the only one, I&#8217;ve found a <a href="http://www.google.com/search?as_q=firefox+400+bad+request&#038;as_qdr=m">plethora of recent support posts</a> discussing the same issue. Normally I&#8217;m the one writing here to say &#8220;Hey, look out for this one, here&#8217;s how to handle it.&#8221; But this time I&#8217;m at a loss.</p>
<p>I automatically attribute any and all odd Firefox behavior to my <a href="http://frankkoehl.com/2008/09/my-firefox-extension-collection/">ridiculous extension collection</a>. There are so many, and sometimes one of them will get out of date and go all bull-china-shop on me. So I start disabling the most likely suspects&#8230;then a few more&#8230;finally all of them. Google still won&#8217;t behave. I go so far as to reset my Firefox profile (Beginners: <a href="http://kb.mozillazine.org/Creating_a_new_Firefox_profile_on_Windows">try the safe way</a>; Experts: <a href="http://kb.mozillazine.org/Creating_a_new_default_profile">go full monty</a>). I log in once, but the behavior rapidly returns within a couple sessions (didn&#8217;t even have to restart).</p>
<p>Then I started looking at more systemic fixes, and I discover that <a href="http://www.google.com/support/accounts/bin/answer.py?hl=en&#038;answer=32050">clearing cache and cookies</a> will fix the problem (with or without extensions in the picture), but again only lasts a few sessions. Since the problem is definitely with cache and/or cookies, I&#8217;m pretty much out of moves. I have no cookie or cache manager plugins that could be responsible, so this one rests squarely at Firefox&#8217;s furry feet. </p>
<p>At first I blamed Google, but then I saw similar behavior when trying to log into the <a href="http://www.webmin.com/">Webmin</a> interface I use for some servers. Logging in just kicks right back to the login prompt, with no errors.</p>
<p>In the meantime, I&#8217;ve switched all my logged-in Google activities (GMail, Analytics, etc.) over to <a href="http://www.google.com/chrome">Chrome</a>, where I&#8217;ve had no problems whatsoever. I never used Chrome for routine browsing; the lack of extensions &mdash; notably <a href="https://addons.mozilla.org/en-US/firefox/addon/1865">AdBlock Plus</a> and <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a> &mdash; really makes it unappealing. However I must admit that the overall UI is fantastic. If the Mozilla team doesn&#8217;t figure this cookie issue out soon, or if Google gets their act together and starts allowing Firefox plugins, I may make the full switch.</p>
<p>Still, I&#8217;d like to get back to a single window if possible, so if anyone has any other suggestions, I&#8217;m all ears.</p>
<p><strong>Update:</strong> I&#8217;ve now reinstalled Firefox as well, to no avail. Until I find a permanent solution, I&#8217;ve installed another add-on called <a href="https://addons.mozilla.org/en-US/firefox/addon/1280">Clear Private Data</a>, which gives you an icon to do exactly that. Now whenever Firefox acts up, I hit the button and continue. It still happens with ridiculous regularity, but at least the browser stays usable.</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/02/trouble-anything-google-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>There are still kinks in Apple&#8217;s armor</title>
		<link>http://frankkoehl.com/2009/02/kinks-in-apple-armor/</link>
		<comments>http://frankkoehl.com/2009/02/kinks-in-apple-armor/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 00:23:31 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For everyone]]></category>
		<category><![CDATA[For techies]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=365</guid>
		<description><![CDATA[To: Anyone at Apple who works on iPod/iTunes From: Annoyed iPod Shuffle user Subject: Stop deleting my songs Message: A recent run was rudely cut short when I realized that my iPod Shuffle contained just two of the hundred or so songs that I listen to while working out. Some sleuthing lead me to discover [...]]]></description>
			<content:encoded><![CDATA[<p>To: Anyone at Apple who works on iPod/iTunes<br />
From: Annoyed iPod Shuffle user<br />
Subject: Stop deleting my songs</p>
<p>Message:<br />
A recent run was rudely cut short when I realized that my iPod Shuffle contained just two of the hundred or so songs that I listen to while working out. Some sleuthing lead me to discover that every time I connect my iPod to the docking station and open iTunes, the program <strong>re-syncs every song I have on the device</strong>. If the song is not located in the original location &mdash; i.e. the place on my computer that I uploaded it from &mdash; iTunes jumps to the conclusion that I must not want the song on my iPod any longer. I can sincerely assure you that this is never the case. The NAS device where I house my music is only connected when I need something, and I do not consider your RIAA-worshipping deletion paranoia a legitimate reason to alter my behavior.</p>
<p>Your devices are indeed wonderful, I bought one after all. However the software connected to it leaves much to be desired. Obviously <a href="http://www.google.com/search?q=itunes+alternative">I&#8217;m not alone</a>, as there are a <a href="http://www.simplehelp.net/2007/07/08/10-alternatives-to-itunes-for-managing-your-ipod/">plethora</a> of <a href="http://www.rockbox.org/">alternatives</a> to your crap-tastic iTunes interface. If the Genius Bar isn&#8217;t smart enough to realize that *I* get to decide what goes on and comes off the device, it&#8217;s hardly deserving of the title, and I suggest you put your efforts toward a better overall experience.</p>
<p>In a way, I can&#8217;t say I blame you. Your devices bring in hordes of money, the software that runs on the desktop is almost an afterthought. However I can assure that I am keeping my eyes keen for the company that can deliver a competitive product with a superior interface with my computer.</p>
<hr />
<p>You hear that, competitors? I want to give you money for the stuff that Apple can&#8217;t deliver. Quit charging them in the open field, and start sniping at range. Their armor is weak just below the neck&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/02/kinks-in-apple-armor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What not to put on your homepage</title>
		<link>http://frankkoehl.com/2009/01/what-not-to-put-on-your-homepage/</link>
		<comments>http://frankkoehl.com/2009/01/what-not-to-put-on-your-homepage/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 04:22:49 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
				<category><![CDATA[For entrepreneurs]]></category>
		<category><![CDATA[For everyone]]></category>
		<category><![CDATA[For techies]]></category>
		<category><![CDATA[crappy coding]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user interfaces]]></category>

		<guid isPermaLink="false">http://frankkoehl.com/?p=340</guid>
		<description><![CDATA[I have a friend who showed me something on the WineAccess homepage tonight that just made me laugh. Check it out. See anything wrong with that picture? How about the &#8220;What You Missed&#8221; section at the bottom? It contains wine bottles that you can&#8217;t purchase, because they&#8217;re sold out. Hence the title. Worthless information with [...]]]></description>
			<content:encoded><![CDATA[<p>I have a friend who showed me something on the WineAccess homepage tonight that just made me laugh. <a href="http://www.wineaccess.com/pvt/my-wineaccess.adp">Check it out</a>.</p>
<p>See anything wrong with that picture? How about the &#8220;What You Missed&#8221; section at the bottom? It contains wine bottles that you can&#8217;t purchase, because they&#8217;re sold out. Hence the title. Worthless information with which the user can do nothing, essentially wasted primo homepage real estate.</p>
<p>Homepage design is a very complex topic, but you can definitely tuck this one in the &#8220;What not to do&#8221; column.</p>
]]></content:encoded>
			<wfw:commentRss>http://frankkoehl.com/2009/01/what-not-to-put-on-your-homepage/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

