<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Squeeville</title>
	<atom:link href="http://squeeville.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://squeeville.com</link>
	<description>Jason Collins. No redaction.</description>
	<lastBuildDate>Thu, 04 Feb 2010 01:40:05 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='squeeville.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/0b51884fb827bc7a32c55e9427bcc8b3?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Squeeville</title>
		<link>http://squeeville.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://squeeville.com/osd.xml" title="Squeeville" />
	<atom:link rel='hub' href='http://squeeville.com/?pushpress=hub'/>
		<item>
		<title>Third-party Cookies in Safari, Internet Explorer</title>
		<link>http://squeeville.com/2010/02/03/third-party-cookies-in-safari-internet-explorer/</link>
		<comments>http://squeeville.com/2010/02/03/third-party-cookies-in-safari-internet-explorer/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 01:40:05 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=118</guid>
		<description><![CDATA[Today, I fought with (and conquered!) getting third-party cookies enabled in Safari and Internet Explorer. There was a bunch of scattered information about this problem on the Internet, so I will either add to the noise or help someone out with this post.
Both Safari and Internet Explorer have default privacy settings that are quite harsh [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=118&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Today, I fought with (and conquered!) getting third-party cookies enabled in Safari and Internet Explorer. There was a bunch of scattered information about this problem on the Internet, so I will either add to the noise or help someone out with this post.</p>
<p>Both Safari and Internet Explorer have default privacy settings that are quite harsh on third-party cookies, and both browsers need some consideration in order to get them working correctly. With the proliferation of widgets on the internet, third-party cookies are quite common, so I&#8217;m surprised there isn&#8217;t a more thorough treatment of the issue (though don&#8217;t expect one here!).</p>
<p><strong>Internet Explorer</strong></p>
<p>Internet Explorer (I tested with IE7) has a default privacy setting of &#8220;Medium&#8221;, which requires that sites issuing third-party cookies must have a Compact Privacy Policy (P3P) header. The best documents I&#8217;ve found on this subject are <a href="http://msdn.microsoft.com/en-us/library/ms537343%28VS.85%29.aspx#first_and_third_party_context">here</a> and <a href="http://www.w3.org/TR/P3P/">here</a>.  Pay particular attention to the &#8220;Unsatisfactory Cookies&#8221; section in the first document; use the second document to determine your appropriate P3P header. Once you are correctly serving an appropriate P3P header, third-party cookies should start to work in Internet Explorer.</p>
<p><strong>Safari</strong></p>
<p>Safari (I tested with Safari 4) has a default third-party cookie setting of &#8220;Accept cookies: only from sites I visit.&#8221; I took this to mean sites that are the topmost frame (e.g., url showing in the address box). A colleague of mine, <a href="http://blog.davemo.com/">Dave Mosher</a>, saw me struggling with this and casually mentioned that the user must first interact with the frame in order to set third-party cookies. This is an interesting, Apple-ish approach; I suppose if I interact with the frame, I have explicitly &#8220;visited&#8221; it. Further, this solution would work out for many third-party cookie scenarios (e.g., a login) because the cookie isn&#8217;t set until after some sort of interaction. In our case however, we need to set the cookie on the very first load before the user has a chance to interact. So, to make this work, the best I could come up with was: for Safari, if our cookie wasn&#8217;t present, I introduced an interstitial screen that effectively asked the user to click a link, which allowed us to set a third-party cookie. Unfortunately, I could not find anything more elegant, but this is better than many of the other proposed solutions I found (including popping new windows, using HTML5 Local Storage, etc.). Finally, as long as this cookie is present, you are free to read it before the user interacts with your frame; i.e., if it is a permanent cookie, the user will see the interstitial screen only once (of course depending on your particular cookie setting logic).</p>
<p><em>Caveat</em>: you may also require the P3P header for Safari. I had it in place while I discovered the Safari solution, so I&#8217;m not sure if it works without it.</p>
<br />Filed under: <a href='http://squeeville.com/category/uncategorized/'>Uncategorized</a>, <a href='http://squeeville.com/category/vendasta/'>VendAsta</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=118&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2010/02/03/third-party-cookies-in-safari-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Dependency Injection in Python</title>
		<link>http://squeeville.com/2009/10/07/dependency-injection-in-python/</link>
		<comments>http://squeeville.com/2009/10/07/dependency-injection-in-python/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 15:51:04 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=111</guid>
		<description><![CDATA[For testability reasons, we&#8217;ve begun using a lot of dependency injection in our Python projects. Imagine that I have a function that does some work and then ultimately calls an API over-the-wire:

import simplejson
from google.appengine.api import urlfetch # App Engine example
def my_method(user_id):
&#160;&#160;url = 'http://www.example.com/lookup-user/%d.json' % user_id
&#160;&#160;result = urlfetch.fetch(url)
&#160;&#160;if result.status_code == 200:
&#160;&#160;&#160;&#160;return simplejson.loads(result.content)
&#160;&#160;return {}

This is bad for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=111&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>For testability reasons, we&#8217;ve begun using a lot of dependency injection in our Python projects. Imagine that I have a function that does some work and then ultimately calls an API over-the-wire:</p>
<p><code><br />
import simplejson<br />
from google.appengine.api import urlfetch # App Engine example<br />
def my_method(user_id):<br />
&nbsp;&nbsp;url = 'http://www.example.com/lookup-user/%d.json' % user_id<br />
&nbsp;&nbsp;result = urlfetch.fetch(url)<br />
&nbsp;&nbsp;if result.status_code == 200:<br />
&nbsp;&nbsp;&nbsp;&nbsp;return simplejson.loads(result.content)<br />
&nbsp;&nbsp;return {}<br />
</code></p>
<p>This is bad for testability because when my test code executes my_method(), it will either go out over the wire (super bad!) unless I monkey-patch urlfetch to be some other class (really inconvenient).</p>
<p>So, instead, we can accept an alternate urlfetch mechanism optionally in the method:</p>
<p><code><br />
from google.appengine.api import urlfetch <b>as urlfetch_builtin</b><br />
def my_method(user_id, <b>urlfetch=urlfetch_builtin</b>):<br />
&nbsp;&nbsp;url = 'http://www.example.com/lookup-user/%d.json' % user_id<br />
&nbsp;&nbsp;result = urlfetch.fetch(url)<br />
&nbsp;&nbsp;if result.status_code == 200:<br />
&nbsp;&nbsp;&nbsp;&nbsp;return simplejson.loads(result.content)<br />
&nbsp;&nbsp;return {}<br />
</code></p>
<p>So now the test client can pass in an alternate implementation of urlfetch that can return instrumented results and exceptions. This proves to be extremely handy.</p>
<p>One problem with this particular implementation is that it forces the client to do some odd things. Imagine that I have a piece of client code that itself is dependency injected:</p>
<p><code><br />
def client_function(urlfetch=None):<br />
&nbsp;&nbsp;# here, I must check for an injection so that I know to provide it to my_method<br />
&nbsp;&nbsp;if urlfetch:<br />
&nbsp;&nbsp;&nbsp;&nbsp;return my_method(123, urlfetch=urlfetch)<br />
&nbsp;&nbsp;else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;return my_method(123)<br />
</code></p>
<p>This is unfortunate. A better way to implement dependency injection and prevent this client if statement is to adjust my_method:</p>
<p><code><br />
from google.appengine.api import urlfetch as urlfetch_builtin<br />
def my_method(user_id, <b>urlfetch=None</b>):<br />
&nbsp;&nbsp;<b>urlfetch = urlfetch or urlfetch_builtin</b><br />
&nbsp;&nbsp;# ...<br />
</code></p>
<p>Since urlfetch is required by the method, we can take None to mean &#8220;use the default implementation&#8221;. Now the client code becomes simply:</p>
<p><code><br />
def client_function(urlfetch=None):<br />
&nbsp;&nbsp;return my_method(123, urlfetch=urlfetch)<br />
</code></p>
<p>Make sure you setup your dependency injection params in this way and save your clients some headaches!</p>
<br />Posted in Uncategorized Tagged: Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=111&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/10/07/dependency-injection-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>asynctools &#8211; A Tale of Two Queries</title>
		<link>http://squeeville.com/2009/07/24/asynctools/</link>
		<comments>http://squeeville.com/2009/07/24/asynctools/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 21:14:39 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[App Engine]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=88</guid>
		<description><![CDATA[Use asynctools to get parallel API calls (including data store queries) on Google App Engine.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=88&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://www.vendasta.com/">VendAsta</a> we develop, among other things, <a href="http://www.myfrontsteps.com/">social networking applications</a> deployed to Google AppEngine. One of the aspects of our suite is a feature where users (e.g., Facebook users) can trust experts from our <a href="http://steprep.myfrontsteps.com/">StepRep</a> software.</p>
<p>A desirable, and obvious, feature is to identify the experts that my friends trust, or conversely, which of my friends trust a particular set of experts. From a use case perspective, a lot of this information is jammed on to the screen at one time; that is, we cannot simply query for a single friend or a single expert.</p>
<p>This is a classic graph walk style problem that is relatively easy to scale in a parallel processing environment, but nasty where you can only do serialized queries.</p>
<p>Initially, we felt a bit limited by the AppEngine query model. It is very fast, but only allows for serialized queries.</p>
<p>In reaction, we began investigations into using a MapReduce mechanism to compute these &#8220;trust networks&#8221; offline. Specifically, we were planning on using MapReduce deployed into Amazon&#8217;s Elastic MapReduce engine. The results of these computations were to be stored on Amazon&#8217;s S3 (as JSON docs) and simply accessed statically from our AppEngine applications.</p>
<p>This solution, while sound, suffered some drawbacks. We had a difficult time with dealing with the recomputation of the trust networks. We could choose to recompute them daily, but this was wasteful of resources: many of the networks would be completely unchanged. Alternatively, we could queue jobs when new trusts are formed and process just those, but then we have to develop another job to determine which trust networks cascade from the new trust and need recomputation. The absolute nail in the coffin of this approach is that we (typically) use Facebook to define friend networks and their T&amp;C do not allow the storage of friend relationships for any great amount of time, making offline processing difficult and incomplete at best.</p>
<p>We needed another solution that allowed for the real time computation of trust networks.</p>
<p>An architect at our company, Kevin Pierce, also happens to be one of the best reverse engineers I know. He started poking around the gory depths of the AppEngine source and discovered that all of the API calls stub out in MakeSyncCall. This inevitably led to the discovery of the partner MakeCall which yields an RPC object that you can wait on. Of course, if I can wait on one RPC object, I can also wait on many of them. A subsequent release of AppEngine capitalized on this fact allowing the developer to easily make <a href="http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html">parallel UrlFetch requests</a>. There were some earlier code libraries that also facilitated parallel UrlFetch requests leveraging the same mechanism.</p>
<p>At Google I/O, <a href="http://lostinloc.com/">Ryan Baldwin</a> and I had the opportunity to corner Ryan Barrett (AppEngine&#8217;s supersmart Data Store guru) and chat with him about using this approach for other API interaction. Ryan seemed pretty excited about our exploration of this area and indicated that this was something they had intended to expose to developers but, like any successful software project, competing priorities kept getting in the way.</p>
<p>Encouraged, we set about developing code to allow developers to queue up a set of AppEngine API calls and then kick them off in parallel. In particular, for the use case that we were looking to solve was the ability to perform multiple Data Store Queries in parallel; this would allow us to query for each friend&#8217;s trusts in parallel and collect the results together. </p>
<p>An example invocation might look something like this:</p>
<p><code><br />
# set up the async queries<br />
runner = MultiTask()<br />
for uid in user_ids:<br />
&nbsp;&nbsp;&nbsp;&nbsp;query = db.GqlQuery("SELECT __key__ FROM Account WHERE facebook_id = :1", uid)<br />
&nbsp;&nbsp;&nbsp;&nbsp;runner.append(QueryTask(query, limit=1, client_state=uid))</p>
<p># kick off the work<br />
runner.run()</p>
<p># peel out the results<br />
for task in runner:<br />
&nbsp;&nbsp;&nbsp;&nbsp;task_result = task.get_result() # will raise any exception that occurred for the given query<br />
&nbsp;&nbsp;&nbsp;&nbsp;print '%s: %s' % (task.client_state, task_result[0])<br />
</code></p>
<p>Here, we&#8217;re making multiple parallel queries, though the mechanism allows for mixing around different API calls.</p>
<p>As an aside, this can yield some pretty scary/awesome looking values in the logs files:</p>
<div id="attachment_90" class="wp-caption alignnone" style="width: 288px"><img src="http://squeeville.files.wordpress.com/2009/07/picture-2.png?w=278&#038;h=29" alt="Three seconds can chew up a lot of API time!" title="Picture 2" width="278" height="29" class="size-full wp-image-90" /><p class="wp-caption-text">Three seconds can chew up a lot of API time!</p></div>
<p>I&#8217;m excited to announce that we&#8217;ve bundled up this code into a package and released it to the wild on Google Code as <a href="http://code.google.com/p/asynctools/">asynctools</a>. So far, we&#8217;ve wrapped Query (including GqlQuery) and UrlFetch. Others will come as we have time/motivation. Note that you can combine these together and execute arbitrary combinations of them in parallel. </p>
<p>Send us any feedback, comments, encouragement you have.</p>
<br />Posted in Uncategorized Tagged: App Engine, Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/88/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=88&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/07/24/asynctools/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>

		<media:content url="http://squeeville.files.wordpress.com/2009/07/picture-2.png" medium="image">
			<media:title type="html">Picture 2</media:title>
		</media:content>
	</item>
		<item>
		<title>Getting a templating mechanism to render the HTML you want.</title>
		<link>http://squeeville.com/2009/03/17/getting-a-templating-mechanism-to-render-the-html-you-want/</link>
		<comments>http://squeeville.com/2009/03/17/getting-a-templating-mechanism-to-render-the-html-you-want/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 16:36:12 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=85</guid>
		<description><![CDATA[One of the great things about templating systems is the ability to encapsulate repeatable chunks of code. One of the tough things about templating systems is management of a global &#8220;state&#8221; to ensure the the overall document that is emitted is as efficient as possible &#8211; especially in the HTML world were bandwidth is a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=85&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>One of the great things about templating systems is the ability to encapsulate repeatable chunks of code. One of the tough things about templating systems is management of a global &#8220;state&#8221; to ensure the the overall document that is emitted is as efficient as possible &#8211; especially in the HTML world were bandwidth is a performance consideration.</p>
<p>An example of this is where the templating chunks require a particular external resource, like JavaScript. You don&#8217;t want each invocation of a repeated sub-template to cause a  tag to be emitted; you only need it once for the entire document.</p>
<p>Asp.Net has some handling for JavaScript in their UserControl mechanism (RegisterClientScriptBlock()) that uses a server-side registration mechanism to emit an appropriate document.</p>
<p><a href="http://davemo.wordpress.com/">Dave Mosher</a> and <a href="http://bzabos.wordpress.com/">Brett Zabos</a>, here at <a href="http://www.vendasta.com/">VendAsta</a>, have used a pure JavaScript approach to get the JavaScript resources loaded efficiently, built atop the YUI loader. Make sure you check out their <a href="http://davemo.wordpress.com/2009/03/13/javascript-dependency-management-and-yui-loader-quirks/">escapades</a>.</p>
<br />Posted in Uncategorized Tagged: Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=85&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/03/17/getting-a-templating-mechanism-to-render-the-html-you-want/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Fancy iPhone Home Screen Buttons for Bookmarked Sites</title>
		<link>http://squeeville.com/2009/02/23/fancy-iphone-home-screen-buttons-for-bookmarked-sites/</link>
		<comments>http://squeeville.com/2009/02/23/fancy-iphone-home-screen-buttons-for-bookmarked-sites/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 21:07:24 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Hijinx]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=82</guid>
		<description><![CDATA[The other day, I noticed that the button image for a bookmarked site on my iPhone home screen (our corporate GMail) looked really nice, and was different than before:

I got to wondering how it came to be.
Scanning the View Source of the GMail page, I didn&#8217;t see any  tags that were relevant, so I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=82&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The other day, I noticed that the button image for a bookmarked site on my iPhone home screen (our corporate GMail) looked really nice, and was different than before:</p>
<p><img src="http://squeeville.files.wordpress.com/2009/02/gmail-icon.png?w=124&#038;h=169" alt="gmail-icon" title="gmail-icon" width="124" height="169" class="alignnone size-full wp-image-83" /></p>
<p>I got to wondering how it came to be.</p>
<p>Scanning the View Source of the GMail page, I didn&#8217;t see any  tags that were relevant, so I thought it might be handled by iPhone OS, similar to the favicon.ico .</p>
<p>So I pointed my iPhone browser at a web site, added the site to the home screen, and then checked out the web logs to see what was going on.</p>
<p>Sure enough, there were requests for <b>/apple-touch-icon-precomposed.png</b> and then <b>/apple-touch-icon.png</b>. It seems that the precomposed does not apply any processing on the iphone itself (it is used raw), while the second one applies a glass effect. Presumably, the latter one is only requested if the first one 404s.</p>
<p>A nice finishing touch if you have a mobile version of your site. Or perhaps regardless. Add this to the list of &#8220;standard web site items&#8221; like favicon.ico, robots.txt, 404, 500, sitemap.xml, etc.</p>
<br />Posted in Uncategorized Tagged: Hijinx, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=82&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/02/23/fancy-iphone-home-screen-buttons-for-bookmarked-sites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>

		<media:content url="http://squeeville.files.wordpress.com/2009/02/gmail-icon.png" medium="image">
			<media:title type="html">gmail-icon</media:title>
		</media:content>
	</item>
		<item>
		<title>Add a Unique Constraint to Google App Engine</title>
		<link>http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/</link>
		<comments>http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 22:47:45 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=65</guid>
		<description><![CDATA[Google App Engine doesn&#8217;t have a unique constraint in the classical sense of relational databases. This is a favourite construct of application developers and it&#8217;s unfortunate that it&#8217;s not present. At the same time, a basic understanding of the underlying datastore points to why it&#8217;s tough, or at least inefficient.
There are places where you&#8217;re willing [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=65&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Google App Engine doesn&#8217;t have a unique constraint in the classical sense of relational databases. This is a favourite construct of application developers and it&#8217;s unfortunate that it&#8217;s not present. At the same time, a basic understanding of the underlying datastore points to why it&#8217;s tough, or at least inefficient.</p>
<p>There are places where you&#8217;re willing to sacrifice some performance in order to guarantee a unique value. Datastore does guarantee uniqueness on its keys, so we can use a secondary helper model to guarantee uniqueness.</p>
<p><code><br />
class Unique(db.Model):<br />
&nbsp;&nbsp;@classmethod<br />
&nbsp;&nbsp;def check(cls, scope, value):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def tx(scope, value):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key_name = "U%s:%s" % (scope, value,)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ue = Unique.get_by_key_name(key_name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ue:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise UniqueConstraintViolation(scope, value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ue = Unique(key_name=key_name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ue.put()<br />
&nbsp;&nbsp;&nbsp;&nbsp;db.run_in_transaction(tx, scope, value)<br />
class UniqueConstraintViolation(Exception):<br />
&nbsp;&nbsp;def __init__(self, scope, value):<br />
&nbsp;&nbsp;&nbsp;&nbsp;super(UniqueConstraintViolation, self).__init__("Value '%s' is not unique within scope '%s'." % (value, scope, ))<br />
</code></p>
<p>This class simply leverages the key uniqueness aspect of datastore to ensure that the value doesn&#8217;t exist. A call to check() where a matching scope and value already exists will raise a UniqueConstraintViolation.</p>
<p>To use this, you need to build out a common create method on your models. Below, I&#8217;ve used a classmethod to achieve this:</p>
<p><code><br />
class Account(db.Model):<br />
&nbsp;&nbsp;name = db.StringProperty()<br />
&nbsp;&nbsp;email = db.StringProperty() # unique=True - wouldn't that be great?<br />
&nbsp;&nbsp;@classmethod<br />
&nbsp;&nbsp;def create(cls, name, email):<br />
&nbsp;&nbsp;&nbsp;&nbsp;Unique.check("email", email)<br />
&nbsp;&nbsp;&nbsp;&nbsp;a = Account(name=name, email=email)<br />
&nbsp;&nbsp;&nbsp;&nbsp;a.put()<br />
&nbsp;&nbsp;&nbsp;&nbsp;return a<br />
</code></p>
<p>I need to make a call to Unique.check() first to ensure uniqueness (which causes at least a lookup, but likely a lookup and a put &#8211; both are a performance hit relative to doing nothing at all), and then I create my own account. Unique.check() will throw if the value is not unique, preventing the Account from being created.</p>
<p>Note that this technique lugs around an additional dictionary in datastore (costing some $$, though realistically not much). Also note that if you jam too many scopes into this class, you&#8217;ll get degrading performance (though it&#8217;s still just a key lookup which is very efficient).</p>
<br />Posted in Uncategorized Tagged: Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=65&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/01/30/add-a-unique-constraint-to-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Retrieving the key from a ReferenceProperty in Google App Engine</title>
		<link>http://squeeville.com/2009/01/30/retrieving-the-key-from-a-referenceproperty-in-google-app-engine/</link>
		<comments>http://squeeville.com/2009/01/30/retrieving-the-key-from-a-referenceproperty-in-google-app-engine/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 21:57:07 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=60</guid>
		<description><![CDATA[Recently, I discovered something surprising about Google App Engine&#8217;s datastore and ReferenceProperty. Imagine I have a class like the following:

&#160;&#160;from google.appengine.ext import db
&#160;&#160;class Home(db.Model):
&#160;&#160;&#160;&#160;address = db.StringProperty()
&#160;&#160;&#160;&#160;room = db.ReferenceProperty(Room)

where Room is also a db.Model.
Datastore uses a proxying technique such that db.Model objects are created lightly (i.e., with only their key) and any hit to an attribute [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=60&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Recently, I discovered something surprising about Google App Engine&#8217;s datastore and ReferenceProperty. Imagine I have a class like the following:</p>
<p><code><br />
&nbsp;&nbsp;from google.appengine.ext import db<br />
&nbsp;&nbsp;class Home(db.Model):<br />
&nbsp;&nbsp;&nbsp;&nbsp;address = db.StringProperty()<br />
&nbsp;&nbsp;&nbsp;&nbsp;room = db.ReferenceProperty(Room)<br />
</code></p>
<p>where Room is also a db.Model.</p>
<p>Datastore uses a proxying technique such that db.Model objects are created lightly (i.e., with only their key) and any hit to an attribute causes the entire object to be inflated by looking it up in the datastore.</p>
<p>I thought this was achieved with a lazy load technique, meaning that Room in the above example contained the logic to load itself (or more accurately Home would populate room with a proxy to Room that would know how to inflate). To do this, the proxy class would hold only its key and use that key to look itself up. From this, it follows that I could access that key without inflating the object.</p>
<p>It doesn&#8217;t work this way!</p>
<p>Instead, the referencing class (Home in the above example) holds the key (in a protected attribute, which you shouldn&#8217;t touch) and is responsible for inflating reference types.</p>
<p>I&#8217;ll say that again: the referenced object does not inflate itself lazily, but the referencing object does the inflation.</p>
<p>So, I previously thought code like this would <b>not</b> cause a datastore lookup:</p>
<p><code><br />
&nbsp;&nbsp;# assume home is an instance of Home<br />
&nbsp;&nbsp;room_key = home.room.key()<br />
</code></p>
<p>but I was very wrong. Simply hitting home.room causes home to lookup the entire room.</p>
<p>But what if you only want to get at the key (which the home has, but is protecting)?</p>
<p>This post <a href="http://groups.google.com/group/google-appengine/browse_thread/thread/cf9af7c9a5976d27/3083824e105df2cd">suggests that the safe way</a> to get this key is to access it via the class attribute, not the instance attribute. Here is the resulting code for my example:</p>
<p><code><br />
&nbsp;&nbsp;room_key = Home.room.get_value_for_datastore(home)<br />
</code></p>
<p>Note carefully the capitalization (indicating the classes versus objects).</p>
<p>This gives me the room key without causing a room lookup. Over and out.</p>
<br />Posted in Uncategorized Tagged: Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=60&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/01/30/retrieving-the-key-from-a-referenceproperty-in-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Django templatetag, RequestContext, and inclusion_tag</title>
		<link>http://squeeville.com/2009/01/27/django-templatetag-requestcontext-and-inclusion_tag/</link>
		<comments>http://squeeville.com/2009/01/27/django-templatetag-requestcontext-and-inclusion_tag/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 19:31:54 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=38</guid>
		<description><![CDATA[We have a templatetag, called scurl, that needs to look at the HttpRequest object. Django&#8217;s templating system provides a straight-forward, yet wordy, mechanism to pass the request object in to the template:

&#160;&#160;def my_view(request):
&#160;&#160;&#160;&#160;return render_to_response("myview.html", context_instance=RequestContext(request))

The render method of our scurl templatetag gets access to this context and thus access to the HttpRequest.
So far, so good.
In [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=38&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>We have a templatetag, called <span style="font-family:'Courier New',Courier,Fixed;">scurl</span>, that needs to look at the <span style="font-family:'Courier New',Courier,Fixed;">HttpRequest</span> object. Django&#8217;s templating system provides a straight-forward, yet wordy, mechanism to pass the request object in to the template:</p>
<p><code><br />
&nbsp;&nbsp;def my_view(request):<br />
&nbsp;&nbsp;&nbsp;&nbsp;return render_to_response("myview.html", <strong>context_instance=RequestContext(request)</strong>)</p>
<p></code></p>
<p>The render method of our <span style="font-family:'Courier New',Courier,Fixed;">scurl</span> templatetag gets access to this context and thus access to the <span style="font-family:'Courier New',Courier,Fixed;">HttpRequest</span>.</p>
<p>So far, so good.</p>
<p>In our project, we also use inclusion_tags to include common chunks of HTML into pages. This sort of tag looks something like this:</p>
<p><code><br />
&nbsp;&nbsp;<strong>@register.inclusion_tag("html-to-include.html")</strong><br />
&nbsp;&nbsp;def my_include_tag(myparam):<br />
&nbsp;&nbsp;&nbsp;&nbsp;return {"inclusion_param":myparam}</p>
<p></code></p>
<p><span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span> is a nice time saving decorator that automatically pulls up the appropriate template and renders it. However, when we included our <span style="font-family:'Courier New',Courier,Fixed;">scurl</span> tag (remember, this tag depends on the <span style="font-family:'Courier New',Courier,Fixed;">HttpRequest</span>) inside the <span style="font-family:'Courier New',Courier,Fixed;">html-to-include.html</span> template, everything blew up. Looking at the Django source, I was surprised to see that when processing the <span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span>, a new context is created and the parent context is not used. At first, this seemed crazy, but in thinking about it more, it&#8217;s the right thing to do: we don&#8217;t necessarily want our parent context colliding with expectations of the <span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span>. That is, because of this separate context, there is a way to formally adapt our parent context to the context of the <span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span>.</p>
<p>So now, the challenge is to adapt the context. The <span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span> decorator provides a handy flag <span style="font-family:'Courier New',Courier,Fixed;">takes_context</span> that tells Django to provide the context to the template tag. To do this, we need to alter our signature slightly; the context must be the first parameter:</p>
<p><code><br />
&nbsp;&nbsp;@register.inclusion_tag("html-to-include.html", <strong>takes_context=True</strong>)<br />
&nbsp;&nbsp;def my_include_tag(<strong>context</strong>, myparam):<br />
&nbsp;&nbsp;&nbsp;&nbsp;return {"inclusion_param":myparam}</p>
<p></code></p>
<p>The parameter <span style="font-family:'Courier New',Courier,Fixed;">context</span> is now passed the parent <span style="font-family:'Courier New',Courier,Fixed;">RequestContext</span>.</p>
<p>Now, misunderstanding #2 came along: we thought that this context would automatically be propagated when rendering the template. It was not; a new <span style="font-family:'Courier New',Courier,Fixed;">Context</span> instance was still being created. Diving into the source, <span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span> has an undocumented keyword parameter <span style="font-family:'Courier New',Courier,Fixed;">context_class</span> that allows you to specify what context that Django instantiates. So this led to this trial:</p>
<p><code><br />
&nbsp;&nbsp;@register.inclusion_tag("html-to-include.html", takes_context=True, <strong>context_class=RequestContext</strong>)<br />
&nbsp;&nbsp;def my_include_tag(context, myparam):<br />
&nbsp;&nbsp;&nbsp;&nbsp;return {"inclusion_param":myparam}</p>
<p></code></p>
<p>This failed because the <span style="font-family:'Courier New',Courier,Fixed;">__init__</span> signature for <span style="font-family:'Courier New',Courier,Fixed;">RequestContext</span> looks nothing like the <span style="font-family:'Courier New',Courier,Fixed;">Context</span> <span style="font-family:'Courier New',Courier,Fixed;">__init__</span> signature. And in hindsight, it&#8217;s a naive trial because, unless there&#8217;s some serious magic under the hood, how would the actual <span style="font-family:'Courier New',Courier,Fixed;">request</span> get passed through to the <span style="font-family:'Courier New',Courier,Fixed;">RequestContext</span> that was being instantiated?</p>
<p>But wait! The intent of the <span style="font-family:'Courier New',Courier,Fixed;">inclusion_tag</span> is to provide an adapter between contexts. AND python is dynamically typed. The latter is relevant because my initial tag <span style="font-family:'Courier New',Courier,Fixed;">scurl</span> doesn&#8217;t actually care that it has a <span style="font-family:'Courier New',Courier,Fixed;">RequestContext</span>, only that <span style="font-family:'Courier New',Courier,Fixed;">context['request']</span> returns what it needs.</p>
<p>So, all we had to do was implement the adapter (dumping the erroneous <span style="font-family:'Courier New',Courier,Fixed;">context_class</span> bit):</p>
<p><code><br />
&nbsp;&nbsp;@register.inclusion_tag("html-to-include.html", takes_context=True)<br />
&nbsp;&nbsp;def my_include_tag(context, myparam):<br />
&nbsp;&nbsp;&nbsp;&nbsp;return {"inclusion_param":myparam, <strong>"request":context['request']</strong>}</p>
<p></code></p>
<p>Pretty cool, but rife with a pretty deep understanding of Django internals that is vital for any templatetag author. Would have never sorted this out without access to the Django source&#8230;</p>
<br />Posted in Uncategorized Tagged: Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=38&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2009/01/27/django-templatetag-requestcontext-and-inclusion_tag/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Announcing VendAsta Friday Afternoon Jam Sessions</title>
		<link>http://squeeville.com/2008/09/19/announcing-vendasta-friday-afternoon-jam-sessions/</link>
		<comments>http://squeeville.com/2008/09/19/announcing-vendasta-friday-afternoon-jam-sessions/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 18:49:28 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=33</guid>
		<description><![CDATA[So, here we sit, uncertain of our first steps&#8230;.
Here at VendAsta, we&#8217;ve just kicked off our Friday afternoon jam sessions. Starting at noon, we bring in lunch and all get together in adhoc groups and work on projects of interest. Anything. Well, anything software.
It&#8217;s an odd feeling though to have all constraints lifted and actually [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=33&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>So, here we sit, uncertain of our first steps&#8230;.</p>
<p>Here at VendAsta, we&#8217;ve just kicked off our Friday afternoon jam sessions. Starting at noon, we bring in lunch and all get together in adhoc groups and work on projects of interest. Anything. Well, anything software.</p>
<p>It&#8217;s an odd feeling though to have all constraints lifted and actually believe that we can just go out and play, experiment, learn, research, anything.</p>
<p>But now the group is starting to self-organize and some ideas are emerging. I&#8217;m confident that these sessions will rock as people get going on things.</p>
<p>It&#8217;s gonna be great!</p>
<br />Posted in Uncategorized Tagged: Projects, VendAsta <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=33&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/09/19/announcing-vendasta-friday-afternoon-jam-sessions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Code review is essential.</title>
		<link>http://squeeville.com/2008/08/15/code-review-is-essential/</link>
		<comments>http://squeeville.com/2008/08/15/code-review-is-essential/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 16:52:02 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=22</guid>
		<description><![CDATA[Code review is a vital mechanism for ensuring conventions and patterns, as well as spreading knowledge of solutions and technologies throughout a team.
We have been evaluating Crucible as a formal tool for tracking comments and laying the comments alongside the actual code. The cool thing is that it integrates (somewhat) with Fisheye, Jira, and Subversion [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=22&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Code review is a vital mechanism for ensuring conventions and patterns, as well as spreading knowledge of solutions and technologies throughout a team.</p>
<p>We have been evaluating <a href="http://www.atlassian.com/software/crucible/" target="_blank">Crucible</a> as a formal tool for tracking comments and laying the comments alongside the actual code. The cool thing is that it integrates (somewhat) with <a href="http://www.atlassian.com/software/fisheye/" target="_blank">Fisheye</a>, <a href="http://www.atlassian.com/software/jira/" target="_blank">Jira</a>, and <a href="http://subversion.tigris.org/" target="_blank">Subversion</a> &#8211; all tools that we use. However, it comes with a steep price tag, and its baked-in process is too heavyweight for our small Scrum teams.</p>
<p>So I recently went on a search for an alternative.</p>
<p>In short order, I came across <a href="http://code.google.com/p/rietveld/" target="_blank">rietveld</a>, which has come out of Guido van Rossum&#8217;s 20% Google project (originally Mondrian). This app is built on Google <a href="http://code.google.com/appengine/" target="_blank">App Engine</a> and integrates with Subversion (along with Perforce from the original Mondrian days).</p>
<p>We&#8217;ll try it out and see how it goes.</p>
<p><strong>The best side-effect:</strong> in rietveld, we have Guido showing us the best practices in building a Django app on App Engine! Best practice information in this space is hard to come by.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/22/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/22/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=22&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/08/15/code-review-is-essential/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Holy Schmolie, Batman!</title>
		<link>http://squeeville.com/2008/08/07/holy-schmolie-batman/</link>
		<comments>http://squeeville.com/2008/08/07/holy-schmolie-batman/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 22:21:32 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[VendAsta]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=15</guid>
		<description><![CDATA[VendAsta has closed out a substantial investment deal for a new product that we are working on. We are, of course, super excited and working like crazy.
The investment was in essence to allow us to go much, much faster on our plan. As such, we are now swimming in job openings.
Get your resumes in! Or [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=15&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://vendasta.com" target="_blank">VendAsta</a> has closed out a <a href="http://vendasta.com/news/#article2" target="_blank">substantial investment deal</a> for a new product that we are working on. We are, of course, super excited and working like crazy.</p>
<p>The investment was in essence to allow us to go much, much faster on our plan. As such, we are now swimming in <a href="http://vendasta.com/careers/" target="_blank">job openings</a>.</p>
<p>Get your <a href="mailto:jobs-001@vendasta.com">resumes</a> in! Or come by our <a href="http://vendasta.com/contact/" target="_blank">office</a> Friday&#8217;s at 4p for a beverage and to chat more about who we are and what we&#8217;re up to. Or give me a call (306-230-3322).</p>
<p>Calling all Sask-ex-pats! Saskatchewan is <a href="http://www.canada.com/saskatoonstarphoenix/news/story.html?id=4fe305dd-b8f4-425a-9d4c-8527546c710c" target="_blank">booming</a>! Saskatoon is leading the way! Got a new family &#8211; raise, em in Sask! You turned out awesome after all!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=15&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/08/07/holy-schmolie-batman/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Bus Error &#8211; and I didn&#8217;t even know I was riding.</title>
		<link>http://squeeville.com/2008/07/01/bus-error-and-i-didnt-even-know-i-was-riding/</link>
		<comments>http://squeeville.com/2008/07/01/bus-error-and-i-didnt-even-know-i-was-riding/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 16:54:44 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=13</guid>
		<description><![CDATA[I&#8217;ve been doing quite a bit with python, django, and Google app engine lately. In a word, it&#8217;s awesome, but more to come on that later.
I use Mac OS X 10.5.3 right now with python 2.5.2. Very often, python simply dies with the cryptic &#8220;Bus Error,&#8221; which I can only assume means that something very [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=13&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing quite a bit with python, django, and Google app engine lately. In a word, it&#8217;s awesome, but more to come on that later.</p>
<p>I use Mac OS X 10.5.3 right now with python 2.5.2. Very often, python simply dies with the cryptic &#8220;Bus Error,&#8221; which I can only assume means that something very dramatic has happened. It&#8217;s surprising and somewhat frustrating to realize just how much drama there is on my computer.</p>
<p>I thought I had it licked by installing <a href="http://darwinports.com/">DarwinPorts</a> and compiling python with a <a href="http://www.zopyx.com/blog/compiling-readline-support-for-python-on-macosx">different version of readline</a> (the word is that the readline lib that ships with Mac is bad).</p>
<p>However, as I was writing this post and used the interpretter to check my python version, it crapped out when I exited with a simple &#8220;exit()&#8221;.</p>
<p>Back to the drawing board I guess.</p>
<p><strong>Update 2008-07-08</strong>: I found <a href="http://www.stereoplex.com/two-voices/creating-a-python-2-4-plone-and-zope-development-environment-on-mac-os-x-leopard" target="_blank">another resource</a> on the topic. I&#8217;m not sure which of the steps in this post helped, but my python is much more stable now.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=13&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/07/01/bus-error-and-i-didnt-even-know-i-was-riding/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Matt, why don&#8217;t you like me?</title>
		<link>http://squeeville.com/2008/06/19/one-of-the-strangest-shows-ive-seen/</link>
		<comments>http://squeeville.com/2008/06/19/one-of-the-strangest-shows-ive-seen/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 06:03:44 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=11</guid>
		<description><![CDATA[Matthew Good. What can I say? I think the guy is a great songwriter and a great musician. I like his music. BUT. I just saw him at the Odeon with around 700 other people, and walked away with somewhat mixed emotions. Great music, but absolutely no connection with the audience. No talking; it almost [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=11&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Matthew Good. What can I say? I think the guy is a great songwriter and a great musician. I like his music. BUT. I just saw him at the Odeon with around 700 other people, and walked away with somewhat mixed emotions. Great music, but absolutely no connection with the audience. No talking; it almost felt like disdain. The lighting even reflected it: double spotlight on Matt, but I couldn&#8217;t even see any of the facial features of any of his 5-piece band.</p>
<p>I still like the music though, so it was a really weird dynamic.</p>
<p><a title="The Spades" href="http://www.thespades.ca/" target="_blank">The Spades</a> opened for him. They are a power trio from Peterborough Ontario and did a fabulous job. The drummer has his snare drum tuned about as low as it will go, and paired with two bass toms, he laid a powerful backbeat for the other guys. Good vocals, good guitar, and a solid bass line rounded it all out. A double &#8220;marching band&#8221; drum piece, that the bassist described to me as a &#8220;good break,&#8221; pulled the crowd right in. Good work, The Spades.</p>
<p>Matt Good, you know music, but take some notes from The Spades on stage presence. Oh, and drop the attitude.</p>
<p>Update: Upon reflection, this show was not &#8220;One of the Strangest Shows I&#8217;ve Seen&#8221; &#8211; I&#8217;ve seen some pretty strange stuff and this wasn&#8217;t one of them. Instead there was just a really weird range of emotions going on.</p>
<p>I&#8217;ve decided to save the old title for something that really deserves it.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=11&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/06/19/one-of-the-strangest-shows-ive-seen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Google I/O 2008</title>
		<link>http://squeeville.com/2008/05/29/google-io-2008/</link>
		<comments>http://squeeville.com/2008/05/29/google-io-2008/#comments</comments>
		<pubDate>Thu, 29 May 2008 17:34:47 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Google I/O]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=10</guid>
		<description><![CDATA[Google I/O is Google&#8217;s premier developer conference. A key theme is definitely pervasive: Google feels the Internet is the platform and that developers (the &#8220;geekosystem&#8221;) are key to its continued dominance.
In the opening day keynote, Vic Gundotra (VP Engineering) had a freshingly blunt answer to the question as to why Google was developing so many [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=10&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Google I/O is Google&#8217;s premier developer conference. A key theme is definitely pervasive: Google feels the Internet is the platform and that developers (the &#8220;geekosystem&#8221;) are key to its continued dominance.</p>
<p>In the opening day keynote, Vic Gundotra (VP Engineering) had a freshingly blunt answer to the question as to why Google was developing so many free, open source products: Google makes more money. That is, by enabling developers to build better, faster, larger applications targeted at the Internet, these applications will attract more users and more Internet users means more $$ for Google. (Aside: we had a short debate as to whether or not this was true, but the converse definitely holds: fewer Internet users means less $$ for G.)</p>
<p>The primary themes for Google are centred around making their compute cloud more accessible (via Google App Engine), making it easier to develop rich client apps (via Google Web Toolkit) and bringing human interaction to bear in applications (via OpenSocial).</p>
<p>They also have an entire track devoted to Android (their mobile phone platform). Gundotra stated that G feels that eventually, the mobile browser will be their target platform, but until mobile browser capabilities are enhanced, Android is an important project. Android looks cool to be sure, but I couldn&#8217;t help thinking that I was looking at a Zune: in countries well connected, the iPhone seems to have so much steam. Ironically, Gundotra pointed out that he felt the only phone that had a sufficiently powerful browser was in fact the iPhone. So perhaps G has no interest in competing with that platform, but only to help the other phone manufacturers get their shit together.</p>
<p>Google App Engine, in particular, is very interesting to me. In some ways, it&#8217;s super advanced (scalability is &#8220;automatic&#8221;), but in other ways, it&#8217;s so immature (there is no real way to migrate your data models to new versions). I can&#8217;t tell you how many times in the last day I&#8217;ve heard people ask for &#8220;offline processing.&#8221; That said, of course it&#8217;s brand new, and they are working hard at it.</p>
<p>All in all, it&#8217;s been a great conference with the usual mix of lots of stuff you can find online along with a number of nuggets of information that you just couldn&#8217;t get anywhere else. The other important bits are always in the panel / fireside chats &#8211; vision/philosophy stuff &#8211; so many conference-goers miss these. At the meta level, this conference is very under-stated. Everything is in black/grey/white, there is little to no marketing anywhere, the swag consisted of a t-shirt (black and white) and a water bottle (black and white). I guess, like the G homepage, it&#8217;s about simplicity and content</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=10&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/05/29/google-io-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Rails loses Round 2 to Google App Engine</title>
		<link>http://squeeville.com/2008/04/13/rails-loses-round-2-to-google-app-engine/</link>
		<comments>http://squeeville.com/2008/04/13/rails-loses-round-2-to-google-app-engine/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 04:23:07 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=9</guid>
		<description><![CDATA[Google launched a limited access program for their Google App Engine. I landed solidly on the waiting list, but have been able to check out the local developer environment.
Bottom line: it&#8217;s very cool. It&#8217;s based on python with a very Django-like framework.
By far and away the coolest thing is the Google-proprietary Datastore/BigTable. This is Google&#8217;s [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=9&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Google launched a limited access program for their <a href="http://code.google.com/appengine/" target="_blank">Google App Engine</a>. I landed solidly on the waiting list, but have been able to check out the local developer environment.</p>
<p>Bottom line: it&#8217;s very cool. It&#8217;s based on <a href="http://python.org/" target="_blank">python</a> with a very <a href="http://www.djangoproject.com/" target="_blank">Django</a>-like framework.</p>
<p>By far and away the coolest thing is the Google-proprietary <a href="http://code.google.com/appengine/docs/datastore/" target="_blank">Datastore</a>/<a href="http://labs.google.com/papers/bigtable.html" target="_blank">BigTable</a>. This is Google&#8217;s approach to a database, except indexes, data replication, scalability, etc. are <strong><em>all managed for you</em></strong>. As an application developer, you can concentrate on your app logic and let the framework and infrastructure deal with these issues. Oh, and by the way, all the indexes and interfaces work exactly the same on the local dev environment as they do in this expansive Google compute cloud.</p>
<p>To be clear, in my experience with large webapps, data scalability and availability is precisely the place where a team will spend most of their time. The Google App Engine eliminates this for you.</p>
<p>This is a real testament to Google&#8217;s insistence and persistence on building out a world-class infrastructure and a super-solid architecture layer to build upon. Remember, this company did almost nothing other than search for the first 4 or 5 years. They had lots of employees back them too (not like today, of course), but instead of building out gobs of applications, they focused on the underlying architecture pieces and produced things like Datastore. This sort of investment has a massive flywheel effect over time.</p>
<p>Back to Google App Engine: it will be great to find out what G&#8217;s roadmap is for this product if one is seriously considering hosting their corporate apps. In the mean time, Google App Engine is a pretty serious endorsement for python/Django.</p>
<p>I love <a href="http://www.ruby-lang.org/" target="_blank">Ruby</a> as a language, but damn I&#8217;m starting to have a tough time finding a place for <a href="http://www.rubyonrails.org/" target="_blank">Rails</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/9/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/9/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=9&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/04/13/rails-loses-round-2-to-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
		<item>
		<title>Jason gets a Mac</title>
		<link>http://squeeville.com/2008/03/29/jason-gets-a-mac/</link>
		<comments>http://squeeville.com/2008/03/29/jason-gets-a-mac/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 20:42:39 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.com/2008/03/29/jason-gets-a-mac/</guid>
		<description><![CDATA[Allan finally wore me down, and I got a Mac. Well, it was a combination of Allan and Windows Vista. I&#8217;d lost sooo much time to a busted network stack that it just didn&#8217;t make sense anymore.
So, it&#8217;s a MacBook Pro &#8211; the 2.4GHz Core2 Duo model. First impressions: the hardware is, of course, extremely [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=8&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.orthodrome.ca/" target="_blank"><img src="http://lh3.google.com/jason.a.collins/R-6eyMXoHvI/AAAAAAAAABg/DRxKQKJTBP0/s288/jm.jpg" align="right" border="1" height="236" hspace="4" vspace="4" width="288" />Allan</a> finally wore me down, and I got a Mac. Well, it was a combination of Allan and Windows Vista. I&#8217;d lost sooo much time to a busted network stack that it just didn&#8217;t make sense anymore.</p>
<p>So, it&#8217;s a MacBook Pro &#8211; the 2.4GHz Core2 Duo model. First impressions: the hardware is, of course, extremely sexy. Sleek, solid; the keyboard is awesome. There are some amazingly beautiful apps that come loaded, notably Front Row and Expose/Spaces. I had a slight difficulty getting my wifi (aka AirPort) to work with my D-Link DIR-625, but got that sorted out (I had to &#8220;downgrade&#8221; it away from WPA2 and force it to stay only on WPA).</p>
<p>Toughest thing so far: window management. I hadn&#8217;t realized how reliant I had become on the Windows Task Bar. Mac OS X has a very different conceptual model that I&#8217;m starting to get the swing of. <img src="http://lh5.google.com/jason.a.collins/R-6hnsXoHwI/AAAAAAAAABo/WF-qJcIJ9XQ/s144/ff.jpg" align="right" border="1" height="62" hspace="4" vspace="4" width="59" />For example, the little blue, almost imperceptible dot below applications on the dock means that the program is running &#8211; even though there&#8217;s no window to be found. Very helpful to know that; thanks <a href="http://www.linkedin.com/in/kap329">Kevin</a>.</p>
<p>Anyway, things are going well so far, though I&#8217;m not taking it to work until the end of our current iteration, as I think right now, it would be a productivity loss (just the windows mgmt thing). End of iteration is only a few days away though&#8230;</p>
<p><a href="http://www.vendasta.com" target="_blank">VendAsta</a> seems to be slowly being overrun with Macs. Stay tuned to see how that all turns out.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/8/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/8/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=8&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/03/29/jason-gets-a-mac/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>

		<media:content url="http://lh3.google.com/jason.a.collins/R-6eyMXoHvI/AAAAAAAAABg/DRxKQKJTBP0/s288/jm.jpg" medium="image" />

		<media:content url="http://lh5.google.com/jason.a.collins/R-6hnsXoHwI/AAAAAAAAABo/WF-qJcIJ9XQ/s144/ff.jpg" medium="image" />
	</item>
		<item>
		<title>There&#8217;s never enough whiteboard.</title>
		<link>http://squeeville.com/2008/02/17/theres-never-enough-whiteboard/</link>
		<comments>http://squeeville.com/2008/02/17/theres-never-enough-whiteboard/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 00:17:22 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[VendAsta]]></category>
		<category><![CDATA[Hijinx]]></category>

		<guid isPermaLink="false">http://squeeville.com/?p=6</guid>
		<description><![CDATA[My brother-in-law Zach Scott is a super-smart guy. I have a tremedous amount of respect for him.
He&#8217;s currently working on introducing Scrum to his new organization. I encourage everyone who is dubious to check their trepidation and give it a whole-hearted whirl; Zach has the experience and credentials to know what he&#8217;s talking about.
I must [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=6&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>My brother-in-law <a href="http://constructingsoftware.com/" target="_blank">Zach Scott</a> is a super-smart guy. I have a tremedous amount of respect for him.</p>
<p>He&#8217;s currently <a href="http://constructingsoftware.com/2008/02/03/point2-is-rolling-with-scrum/">working on introducing Scrum</a> to his new organization. I encourage everyone who is dubious to check their trepidation and give it a whole-hearted whirl; Zach has the experience and credentials to know what he&#8217;s talking about.</p>
<p>I must say that I&#8217;m a bit jealous of their 25 linear feet of whiteboard. Our current temporary space is a bit whiteboard challenged:</p>
<p><img src="http://squeeville.files.wordpress.com/2008/02/allan-whiteboard.jpg?w=500" alt="allan-whiteboard.jpg" /></p>
<p>Thankfully, we&#8217;ve begun work with the architecture design team on our new permanant space.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/6/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/6/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=6&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/02/17/theres-never-enough-whiteboard/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>

		<media:content url="http://squeeville.files.wordpress.com/2008/02/allan-whiteboard.jpg" medium="image">
			<media:title type="html">allan-whiteboard.jpg</media:title>
		</media:content>
	</item>
		<item>
		<title>Insource vs. Outsource, Build vs. Buy</title>
		<link>http://squeeville.com/2008/02/03/insource-vs-outsource-build-vs-buy/</link>
		<comments>http://squeeville.com/2008/02/03/insource-vs-outsource-build-vs-buy/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 21:12:54 +0000</pubDate>
		<dc:creator>Jason Collins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[VendAsta]]></category>

		<guid isPermaLink="false">http://squeeville.wordpress.com/?p=4</guid>
		<description><![CDATA[I have been lucky enough to work with very driven, intelligent, capable, talented people in my career. There is a weird side-effect of this. Often, due to a wide range of talents, these teams often find themselves building everything themselves. &#8220;We can do that, and no one can do it as well as us,&#8221; is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=4&subd=squeeville&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I have been lucky enough to work with very driven, intelligent, capable, talented people in my career. There is a weird side-effect of this. Often, due to a wide range of talents, these teams often find themselves building everything themselves. &#8220;We can do that, and no one can do it as well as us,&#8221; is a phrase that comes to mind.</p>
<p>As I see it, the problem with this philosophy is one of opportunity cost. In most cases the statement above is pretty much accurate &#8211; we can build it, and we can do a damn good job of it. In doing so, however, what have you <em>not </em>been able to do? That is, in the time you&#8217;re building project B, how much time has been taken from your primary project A?</p>
<p>Just because you can do something is not a good enough reason to actually undertake the work. Even if there is a small quality hit you take by outsourcing (which, by the way, likely won&#8217;t happen assuming the people that you enlist to help you are experts in their field), it is worth it to outsource in order not to rob time, energy and focus away from your primary goal. In everything you undertake, you should always be asking yourself, &#8220;Is this the highest value add work that I can be doing right now? By doing this work, am I taking away from work where I am truly the only one in the world who can do it?&#8221;</p>
<p>After answering those questions, hopefully there&#8217;s not an arbitrary cash flow reality that gets in your way of doing the right thing.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/squeeville.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/squeeville.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/squeeville.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/squeeville.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/squeeville.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/squeeville.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/squeeville.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/squeeville.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/squeeville.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/squeeville.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/squeeville.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/squeeville.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=squeeville.com&blog=2723317&post=4&subd=squeeville&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://squeeville.com/2008/02/03/insource-vs-outsource-build-vs-buy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4d12119779d195ef931d27eebd82570?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Squee</media:title>
		</media:content>
	</item>
	</channel>
</rss>