<?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>Jon Gales</title>
	<atom:link href="http://www.jongales.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jongales.com/blog</link>
	<description>Personal weblog of Jon Gales</description>
	<lastBuildDate>Sat, 06 Feb 2010 16:00:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>On Google Webmaster Tools site performance tips</title>
		<link>http://www.jongales.com/blog/2010/02/06/google-webmaster-tools-site-performance-tips/</link>
		<comments>http://www.jongales.com/blog/2010/02/06/google-webmaster-tools-site-performance-tips/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 15:59:54 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[funny]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1110</guid>
		<description><![CDATA[Google Webmaster Tools is a great resource, but the site performance feature makes me chuckle from time to time. I checked how Crossword Tracker was doing and while the site runs really quickly (faster than 88% of sites according to Google), they had two tips. Unfortunately both are impossible&#8230; 
It suggested that I serve Google [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.google.com/webmasters/">Google Webmaster Tools</a> is a great resource, but the site performance feature makes me chuckle from time to time. I checked how <a href="http://crosswordtracker.com">Crossword Tracker</a> was doing and while the site runs really quickly (faster than 88% of sites according to Google), they had two tips. Unfortunately both are impossible&#8230; </p>
<p>It suggested that I serve Google Analytics hosted Javascript with gzip compression and that I could cut down on the number of DNS requests by serving the same JS from my domain. Great ideas guys.</p>
<p><img src="http://www.jongales.com/blog/wp-content/uploads/2010/02/google-webmaster-impossible-tips.png" alt="Google Webmaster impossible performance tips" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2010/02/06/google-webmaster-tools-site-performance-tips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iPad claim chowder</title>
		<link>http://www.jongales.com/blog/2010/01/28/ipad-claim-chowder/</link>
		<comments>http://www.jongales.com/blog/2010/01/28/ipad-claim-chowder/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 05:42:25 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1106</guid>
		<description><![CDATA[John Gruber in December on The Tablet:
One common prediction I disagree with is that The Tablet will simply be more or less an iPod Touch with a much bigger display. &#8230; If Apple’s starting with a hardware size where the iPhone OS can&#8217;t be used one-handed, then trust me, they’re designing a new interaction model.
Of [...]]]></description>
			<content:encoded><![CDATA[<p>John Gruber in December on <a href="http://daringfireball.net/2009/12/the_tablet">The Tablet</a>:</p>
<blockquote><p>One common prediction I disagree with is that The Tablet will simply be more or less an iPod Touch with a much bigger display. &#8230; If Apple’s starting with a hardware size where the iPhone OS can&#8217;t be used one-handed, then trust me, they’re designing a new interaction model.</p></blockquote>
<p>Of course, it&#8217;s easy to be a pundit after the news breaks. Color me surprised that this was an evolution, not a revolution.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2010/01/28/ipad-claim-chowder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crossword puzzle database, search engine, etc</title>
		<link>http://www.jongales.com/blog/2010/01/11/crossword-puzzle-database-search-engine-etc/</link>
		<comments>http://www.jongales.com/blog/2010/01/11/crossword-puzzle-database-search-engine-etc/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 23:18:21 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Web/Tech]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1102</guid>
		<description><![CDATA[I&#8217;ve become a fan of crossword puzzles and recently started downloading a lot of them and processing them with Python. It was interesting itself (finding the most common answers and what not), but I decided to make a UI for it and create a site that lets you browse both crossword answers and clues, viewing [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve become a fan of crossword puzzles and recently started downloading a <em>lot</em> of them and processing them with Python. It was interesting itself (finding the most common answers and what not), but I decided to make a UI for it and create a site that lets you browse both crossword answers and clues, viewing what points to what and related data to both. You can search too, even if you don&#8217;t know all the letters. It&#8217;s pretty interesting and if you do crossword puzzles you should check out <strong><a href="http://crosswordtracker.com">Crossword Tracker</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2010/01/11/crossword-puzzle-database-search-engine-etc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Impossible job postings</title>
		<link>http://www.jongales.com/blog/2009/12/05/impossible-job-postings/</link>
		<comments>http://www.jongales.com/blog/2009/12/05/impossible-job-postings/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 22:23:39 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Web/Tech]]></category>
		<category><![CDATA[funny]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1094</guid>
		<description><![CDATA[A chuckle-worthy gig came up today on a Craigslist feed that I follow. Somehow I think working for this joker would be an excruciating experience (emphasis mine):
To apply, email your resume along with a link to your greatest Web Development project. Describe your responsibilities of that project and any additional information (looking for writing structure [...]]]></description>
			<content:encoded><![CDATA[<p>A chuckle-worthy gig came up today on a Craigslist feed that I follow. Somehow I think working for this joker would be an excruciating experience (emphasis mine):</p>
<blockquote><p>To apply, email your resume along with a link to your greatest Web Development project. Describe your responsibilities of that project and any additional information (<em>looking for writing structure and literacy here</em>). What makes you unique and different than other programmers and Web Developers? Your message will be deleted if this information is not contained in the body of the email. <em>Limit your message to 250 characters or less</em>. Thank you. </p></blockquote>
<p>They should just cut email out of the process and only accept applications through Twitter. Or in haiku. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/12/05/impossible-job-postings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AT&amp;T Wireless reverse number lookup</title>
		<link>http://www.jongales.com/blog/2009/10/25/att-wireless-reverse-number-lookup/</link>
		<comments>http://www.jongales.com/blog/2009/10/25/att-wireless-reverse-number-lookup/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 00:24:22 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Web/Tech]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1088</guid>
		<description><![CDATA[Craigslist never fails to amuse. What a couple they must be.

]]></description>
			<content:encoded><![CDATA[<p>Craigslist never fails to amuse. What a couple they must be.</p>
<p><img src="http://www.jongales.com/blog/wp-content/uploads/2009/10/att-reverse-phone-number-lookup.png" alt="AT&#038;T reverse phone number lookup" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/10/25/att-wireless-reverse-number-lookup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Percentage Django template tag</title>
		<link>http://www.jongales.com/blog/2009/10/19/percentage-django-template-tag/</link>
		<comments>http://www.jongales.com/blog/2009/10/19/percentage-django-template-tag/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 17:37:52 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1079</guid>
		<description><![CDATA[Here&#8217;s a handy template filter that calculates percentages inside Django templates.

@register.filter(name='percentage')
def percentage(fraction, population):
    try:
        return "%.2f%%" % ((float(fraction) / float(population)) * 100)
    except ValueError:
        return ''

Usage
There were {{ yes.count }} yes votes ({{ yes.count&#124;percentage:votes.count }}) [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a handy template filter that calculates percentages inside Django templates.</p>
<pre name="code" class="python">
@register.filter(name='percentage')
def percentage(fraction, population):
    try:
        return "%.2f%%" % ((float(fraction) / float(population)) * 100)
    except ValueError:
        return ''
</pre>
<h3>Usage</h3>
<p><code>There were {{ yes.count }} yes votes ({{ yes.count|percentage:votes.count }}) out of {{ votes.count }} responses.</code></p>
<h3>Result</h3>
<pre>There were 40 yes votes (40%) out of 100 responses.</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/10/19/percentage-django-template-tag/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Constant Contact&#8217;s insane API downtime practice</title>
		<link>http://www.jongales.com/blog/2009/10/17/constant-contacts-insane-api-downtime-practice/</link>
		<comments>http://www.jongales.com/blog/2009/10/17/constant-contacts-insane-api-downtime-practice/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 14:43:13 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Web/Tech]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1070</guid>
		<description><![CDATA[Constant Contact is the leading email newsletter company and hundreds of thousands of businesses use their service to send marketing emails to customers. Constant Contact is a lot bigger than most people think, they are even a publicly traded company with a half billion dollar market cap. However, money can&#8217;t buy sanity.
Constant Contact is typically [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.constantcontact.com">Constant Contact</a> is the leading email newsletter company and hundreds of thousands of businesses use their service to send marketing emails to customers. Constant Contact is a lot bigger than most people think, they are even a <a href="http://www.google.com/finance?q=NASDAQ%3ACTCT">publicly traded</a> company with a half billion dollar market cap. However, money can&#8217;t buy sanity.</p>
<p>Constant Contact is typically used through a web interface, but they do provide an API to allow some basic functions to be handled remotely. It&#8217;s a pretty limited API (you can&#8217;t even send email through it!), but that&#8217;s a rant for another day. All I&#8217;m using it for is adding contacts and basic list management. Simple stuff.</p>
<p>I&#8217;ve had a lot of problems with reliability in the past, but last night takes the cake. Constant Contact had a scheduled downtime for the API that resulted in all requests returning a 200 OK HTTP status code and an HTML page explaining the issue. If you tried to search for a contact, you got the page. If you tried to add a contact you got the page. Etc. But the 200 OK status code makes it look like the request was processed correctly and this HTML was the response (which should be XML if everything did go as planned). They&#8217;re using a browser error screen for API responses&#8230; Insane.</p>
<p><span id="more-1070"></span></p>
<p><img src="http://www.jongales.com/blog/wp-content/uploads/2009/10/constant-contact-api-error.png" alt="Constant Contact API downtime error page" /></p>
<p>Why return an HTTP 200 OK status code when it&#8217;s most certainly not OK? <strong>How is my code supposed to know that when you say everything is OK and here&#8217;s our response that you really mean &#8220;our shit&#8217;s off, we&#8217;ll be back soon&#8221;?</strong> A 503 Service Unavailable seems much more logical, but there&#8217;s a <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">whole list</a> to choose from. Almost every one is better than 200.</p>
<p>My code can figure out it&#8217;s not the XML that should be returned by catching the exception from the XML processor, but it shouldn&#8217;t have to. Also, I still need to get alerted to when this is caught because what if next time it&#8217;s not that there is downtime but something else that would require a change on my end? There&#8217;s no way to tell since it&#8217;s an HTML page returned and not a simple error code or message.</p>
<p>Even better is the HTML error message (for a service never designed to be used by a device that reads HTML) has a nasty JavaScript error that loops and eventually crashes Safari. Woo! Is there any possible reason for having JavaScript on a page that should only be read by computers? I&#8217;ve gotten a lot of errors back from various APIs and this is the first time it has been a HTML/JS page. And even then it crashes the browser. Fail.</p>
<p><img src="http://www.jongales.com/blog/wp-content/uploads/2009/10/constant-contact-api-js-error.jpg" alt="Constant Contact API downtime JS error"></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/10/17/constant-contacts-insane-api-downtime-practice/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>An inside look at the new GOP.com</title>
		<link>http://www.jongales.com/blog/2009/10/14/an-inside-look-at-the-new-gop-com/</link>
		<comments>http://www.jongales.com/blog/2009/10/14/an-inside-look-at-the-new-gop-com/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 21:00:58 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web/Tech]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1061</guid>
		<description><![CDATA[The new ]]></description>
			<content:encoded><![CDATA[<p>The new <a href="http://www.gop.com" rel="nofollow>GOP.com</a> site just launched and has <a href="http://tpmdc.talkingpointsmemo.com/2009/10/the-new-gopcom-crushed-under-weight-of-mockery-dem-says.php">pretty much been a disaster</a>. This project <a href="http://www.redstate.com/erick/files/2009/03/rncsiterfp.pdf">started poorly</a> and never caught up. In any event, here&#8217;s a look at the technology behind the site. </p>
<h3>Hosting</h3>
<p>Hosting is through a firm called <a href="http://www.airnetgroup.com/">Airnet</a> that operates hosting services its SMARTTech brand. If you haven&#8217;t heard of them, you aren&#8217;t the only one. They host only a few thousand domains and primarily serve GOP political interests (most famously the <a href="http://en.wikipedia.org/wiki/Bush_White_House_e-mail_controversy">gwb43.com email server</a>). The site is hosted on Windows, using IIS 7 and PHP 5.2.11. Curiously they didn&#8217;t spring for the dedicated IP address, GOP.com is sharing an IP with domains like georgebush.com and the venerable flippercam.com.</p>
<h3>CMS</h3>
<p><a href="http://expressionengine.com/">ExpressionEngine</a> is the content management system. This is easily confirmed by the <a href="http://www.gop.com/READ_THIS_FIRST.txt">presence of a text file</a> you typically delete before launching a site (in case it&#8217;s deleted, it says &#8220;Welcome to ExpressionEngine!&#8221;. Looking for files like this is a great way to see how a site works—WordPress can often be confirmed along with its version number by looking for readme.html on the root level).</p>
<p>ExpressionEngine is a fine CMS and is in use for other political sites on both sides of the aisle. The performance issues were more likely due to poor planning than anything with ExpressionEngine. One example of said poor planning is the Expires header sent is set 12 years in the past.</p>
<h3>Libraries / Tools</h3>
<p>There&#8217;s lots of social media API integration which is pretty typical these days. Facebook loads JS on every page load for example. <a href="http://blog.deconcept.com/swfobject/">SWFObject</a> is used throughout. The main Javascript library used is <a href="http://mootools.net/">MooTools</a> and MooTools More, which are embedded in a <a href="http://www.gop.com/js/general.js">single JS file</a> that also does the other sitewide scripting.</p>
<p><a href="http://www.shadowbox-js.com/">Shadowbox.js</a> is also embedded in that file though without any attribution.</p>
<h3>Speed</h3>
<p>Speed is being kind, the site is dog slow. For good reason too, all the previously mentioned social media integration makes for a huge number of requests. I just loaded the home page and Firebug says: 194 requests, 2.02MB and an amazing 83 seconds for full completion. Compare this to <a href="http://www.democrats.org">Democrats.org</a> which has 69 requests, 900KB and loads in under 4 seconds (not a speed demon in its own right, but not insane).</p>
<p>No CDN is used and far in the future expires headers aren&#8217;t used for navigational elements.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/10/14/an-inside-look-at-the-new-gop-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Safari using HTML 5 for MP3s</title>
		<link>http://www.jongales.com/blog/2009/10/10/safari-using-html-5-for-mp3s/</link>
		<comments>http://www.jongales.com/blog/2009/10/10/safari-using-html-5-for-mp3s/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 16:02:51 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Apple]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1055</guid>
		<description><![CDATA[I just noticed that the latest Safari (at least on Snow Leopard) is loading MP3 files natively through HTML5. When you go directly to an MP3 file it shows a player widget that I hadn&#8217;t seen before and if you inspect the element it contains the new &#60;video&#62; tag. Pretty neat!
It would have been great [...]]]></description>
			<content:encoded><![CDATA[<p>I just noticed that the latest Safari (at least on Snow Leopard) is loading MP3 files natively through HTML5. When you go directly to an MP3 file it shows a player widget that I hadn&#8217;t seen before and if you inspect the element it contains the new <code>&lt;video&gt;</code> tag. Pretty neat!</p>
<p>It would have been great if the widget included a download option (even Save is disabled), but option-clicking on the link works well enough.</p>
<p><img src="http://www.jongales.com/blog/wp-content/uploads/2009/10/snow-leopard-html-5-safari.png" alt="Snow Leopard HTML 5 and Safari" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/10/10/safari-using-html-5-for-mp3s/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Christopher Kimball on the Internet, Gourmet</title>
		<link>http://www.jongales.com/blog/2009/10/08/christopher-kimball-on-the-internet-gourmet/</link>
		<comments>http://www.jongales.com/blog/2009/10/08/christopher-kimball-on-the-internet-gourmet/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 14:37:53 +0000</pubDate>
		<dc:creator>JG</dc:creator>
				<category><![CDATA[Food]]></category>

		<guid isPermaLink="false">http://www.jongales.com/blog/?p=1052</guid>
		<description><![CDATA[Chris Kimball memorialized Gourmet in a NY Times op-ed and had a striking point towards the end:
Google “broccoli casserole” and make the first recipe you find. I guarantee it will be disappointing. The world needs fewer opinions and more thoughtful expertise — the kind that comes from real experience, the hard-won blood-on-the-floor kind. I like [...]]]></description>
			<content:encoded><![CDATA[<p>Chris Kimball <a href="http://www.nytimes.com/2009/10/08/opinion/08kimball.html?_r=2&#038;ref=opinion">memorialized</a> <em>Gourmet</em> in a <em>NY Times</em> op-ed and had a striking point towards the end:</p>
<blockquote><p>Google “broccoli casserole” and make the first recipe you find. I guarantee it will be disappointing. The world needs fewer opinions and more thoughtful expertise — the kind that comes from real experience, the hard-won blood-on-the-floor kind. I like my reporters, my pilots, my pundits, my doctors, my teachers and my cooking instructors to have graduated from the school of hard knocks.</p></blockquote>
<p>He&#8217;s right. Not that <em>Gourmet</em> was the only publication who could publish a good recipe, but in the age of everyone being an expert quality has suffered. The <a href="http://www.cooks.com/rec/view/0,178,135180-244199,00.html" rel="nofollow">first hit</a> for broccoli casserole includes brozen broccoli, canned soup, a pound of cheese and a package of Ritz crackers. No thanks.</p>
<p>I subscribe to Kimball&#8217;s wonderful <a href="http://cooksillustrated.com/">Cook&#8217;s Illustrated</a> website and you should too.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jongales.com/blog/2009/10/08/christopher-kimball-on-the-internet-gourmet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
