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

<channel>
	<title>scot hacker's foobar blog</title>
	<atom:link href="http://birdhouse.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://birdhouse.org/blog</link>
	<description>Like a chicken with a jewel in its beak.</description>
	<lastBuildDate>Wed, 01 Jul 2009 22:56:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Carver Park Reserve</title>
		<link>http://birdhouse.org/blog/2009/07/01/carver-park-reserve/</link>
		<comments>http://birdhouse.org/blog/2009/07/01/carver-park-reserve/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 22:17:18 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Geo]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3391</guid>
		<description><![CDATA[Wrapping up an excellent &#8211; but sad &#8211; 10 days with relatives in Minnesota. Excellent because Minnesota is always excellent this time of year, lush and verdant, with endless trails and meadows fed by those famous 10,000 lakes. Excellent because it was wonderful to see family and because I really needed the downtime. Sad because [...]]]></description>
			<content:encoded><![CDATA[<p>Wrapping up an excellent &#8211; but sad &#8211; 10 days with relatives in Minnesota. Excellent because Minnesota is always excellent this time of year, lush and verdant, with endless trails and meadows fed by those famous 10,000 lakes. Excellent because it was wonderful to see family and because I really needed the downtime. Sad because we were there to say farewell to my father-in-law, who passed away a few weeks ago and is deeply missed by all of us.</p>
<p> <iframe src="http://www.trailguru.com/ui/embed/embedTrack.php?thid=347043&#038;width=550&#038;height=400" scrolling="no" height="400" width="550" frameborder="0"><br />
    <a href="http://www.trailguru.com/wiki/index.php/Track:7FS3">Carver Park, Minnesota (Hiking) | MN, USA</a><br />
</iframe><br />
<em>Click Replay for hike animation</em></p>
<p>Wrapped up the visit with a lovely 3-mile walk through <a href="http://www.ci.orono.mn.us/carver_park_reserve.htm">Carver Park Reserve</a> with the family and kids through rolling hills. Returned with a few tics and lots of great memories. </p>
<p>Farewell Ben &#8211; we&#8217;ll always miss you. </p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/07/01/carver-park-reserve/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Michael Jackson Liberated Eastern Europe</title>
		<link>http://birdhouse.org/blog/2009/06/30/how-michael-jackson-liberated-eastern-europe/</link>
		<comments>http://birdhouse.org/blog/2009/06/30/how-michael-jackson-liberated-eastern-europe/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 14:59:03 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3387</guid>
		<description><![CDATA[For Stuck Between Stations, Roger Moore on how Michael Jackson liberated Eastern Europe from communism: The Aviator, Part I:
As with Elvis, I dismissed most of what he did long before he left. But MJ was an arresting presence even for those who, like me, did my best to ignore him. Elvis even seems an inadequate [...]]]></description>
			<content:encoded><![CDATA[<p>For Stuck Between Stations, Roger Moore on how Michael Jackson liberated Eastern Europe from communism: <a href="http://stuckbetweenstations.org/2009/06/28/the-aviator-part-i-michael-jackson/">The Aviator, Part I</a>:</p>
<blockquote>As with Elvis, I dismissed most of what he did long before he left. But MJ was an arresting presence even for those who, like me, did my best to ignore him. Elvis even seems an inadequate comparison for his stratospheric global reach. A closer comparison might be Howard Hughes, another man-child of erratic brilliance, whose master aviator’s soaring heights later gave way to reclusive paranoia and heartbreaking tailspin.<br />
</blockquote>
<p>Then, in <a href="http://stuckbetweenstations.org/2009/06/30/the-aviator-part-ii-sky-saxon/">The Aviator, Part II: Sky Saxon</a> Moore pays tribute to Sky Saxon of The Seeds, whose death was completely overshadowed by Jackson&#8217;s. </p>
<blockquote>The Seeds discovered trippy keyboards before the Doors, and were unleashing raw power before the Stooges. They were their best at their simplest, exemplifying Woody Guthrie’s dictum that if you use more than two chords, you’re showing off.</blockquote>
<p>See also: <a href="http://stuckbetweenstations.org/2009/06/14/mayra-andrades-lunar-mission/">Mayra Andrade’s Lunar Mission</a></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/06/30/how-michael-jackson-liberated-eastern-europe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>django-profiles: The Missing Manual</title>
		<link>http://birdhouse.org/blog/2009/06/27/django-profiles/</link>
		<comments>http://birdhouse.org/blog/2009/06/27/django-profiles/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 17:59:27 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3375</guid>
		<description><![CDATA[The User model in Django is intentionally basic, defining only the username, first and last name, password and email address. It&#8217;s intended more for authentication than for handling user profiles. To create an extended user model you&#8217;ll need to define a custom class with a ForeignKey to User, then tell your project which model defines [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://docs.djangoproject.com/en/dev/topics/auth/">User model</a> in Django is intentionally basic, defining only the username, first and last name, password and email address. It&#8217;s intended more for authentication than for handling user profiles. To create an extended user model you&#8217;ll need to define a custom class with a ForeignKey to User, then tell your project which model defines the <a href="http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users">Profile</a> class. In your settings, use something like:</p>
<p><code>AUTH_PROFILE_MODULE = 'accounts.UserProfile'</code></p>
<p>To make it easier to let users create and edit their own Profile data, James Bennett (aka ubernostrum), who is the author of <a href="http://www.amazon.com/Practical-Django-Projects-Pratical/dp/1590599969">Practical Django Projects</a> and the excellent <a href="http://www.b-list.org/">b-list blog</a>, created the reusable app <a href="http://bitbucket.org/ubernostrum/django-profiles/">django-profiles</a>. It&#8217;s a companion to <a href="http://bitbucket.org/ubernostrum/django-registration/wiki/Home">django-registration</a>, which provides pluggable functionality to let users register and validate their own accounts on Django-based sites.<br />
<span id="more-3375"></span></p>
<p>Both apps are excellent, and come with very careful documentation. But here&#8217;s the rub: Bennett&#8217;s documentation style comes from the mind of an engineer, rather than an average user who just needs to get things done quickly. For people who write Django code every day and are intimately familiar with the official Django docs, they&#8217;re probably sufficient. For those of us who don&#8217;t have the luxury of being full-time programmers, who don&#8217;t live and breathe Django, they&#8217;re frustrating. Sample templates are not included, and no clues are given as to what should go in the templates you create. Likewise, the ability to customize the default behavior of the apps is only hinted at, not spelled out. Users coming from a CMS world where you install and configure a plugin and get instant functionality for your site quickly become frustrated.  </p>
<p>From IRC logs, it appears that Bennett believes banging your head against a wall is a great way to learn. To an extent, that&#8217;s true. I know there&#8217;s no better way to learn a new tool than having to solve real-world problems with it. But at the same time, learning doesn&#8217;t <em>only</em> take place in the Django docs &#8211; it happens on mailing lists, in code samples on djangosnippets.org (which, by the way, is another of Bennett&#8217;s projects), and, yes, in documentation for add-on apps like django-profiles. </p>
<p>Let&#8217;s take an example: A developer wants to let users edit their own profiles. They get their Profile model registered, install django-profiles, and create a template at <code>profiles/edit_profile.html</code>. What goes in that template? Not much is needed, but the django-profiles docs don&#8217;t give you a clue (nor do they give you a clue where to find the answer in the Django docs).  You&#8217;ll need something like this:</p>
<pre>{% extends "base.html" %}
{% block title %}Edit Profile{% endblock %}
{% block content %}
&lt;h1&gt;Edit contact info for {{ user }} &lt;/h1&gt;
&lt;form method="POST" action=""&gt;
{{ form }}
&lt;input type="submit" name="submit" value="Update" id="submit"&gt;
&lt;/form&gt;
{% endblock content %}</pre>
<p>Now  access <code>/profiles/edit/</code> and you&#8217;ll see all fields on your profile model represented with appropriate field types. So far so good. Now you probably want to customize two things, right off the bat. You may have fields on the profile that only administrators should be able to edit, and you want to hide those fields. And you may want to modify the <code>success_url</code>, to control where the user is sent after a successful form submission. The docs for django-profiles say that the provided <code>edit_profile</code> view takes optional <code>form_class</code> and <code>success_url</code> arguments. But how can you pass in arguments? You&#8217;re simply linking to the predefined URL <code>/profiles/edit/</code> &#8211; there is no code of your own from which you can pass in arguments. </p>
<p>This is where things became inscrutable to me. I was at an impasse, with no clue or hint as to what to do next. If the django-profiles docs had included a link to the section of the Django docs that contained the answer (or <em>some</em> kind of directional indicator) I could have done the research and gotten things moving. Fortunately, a friend and fellow Django developer had been down this road before and had the solution. Here&#8217;s how the pieces connect:</p>
<p>First, you need to create a custom ModelForm based on your Profile model. If you don&#8217;t already have a forms.py in your app, create one, then add something like:</p>
<pre>
from django.db import models
from django.forms import ModelForm
from ourcrestmont.itaco.models import *

class ProfileForm(ModelForm):
  class Meta:
      model = Foo
      exclude = ('field1','field2','field3',)
</pre>
<p>The idea is to pass your custom ModelForm to django-profiles with the name <code>form_class</code>, thereby overriding the default object of the same name. django-profiles will then operate against your custom <code>ProfileForm</code> rather than from a default representation of your Profile model. Once I understood this, the light went on and things started to snap into place.</p>
<p>Still, how can you pass this custom form_class to django-profiles, when there&#8217;s no view code in your own app to handle this? That&#8217;s where trick #2 comes in: The seldom-used ability to <a href="http://docs.djangoproject.com/en/dev/topics/http/urls/#passing-extra-options-to-view-functions">pass dictionaries of custom values</a> in from your urlconf. So wiring things up now becomes a pretty straightforward task. In <code>urls.py</code>, import your custom form and pass it through to the django-profiles view, right <em>after</em> the reference to the django-profiles urlconf (you want to do this after, not before, so the last matching URL for <code>/profiles/edit/</code> is the one you define, not the one django-profiles defines:</p>
<pre>from projname.appname.forms import ProfileForm
    ('^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm,}),
    (r'^profiles/', include('profiles.urls')),</pre>
<p>You can pass in your custom success_url value in the same way:</p>
<pre>from projname.appname.forms import ProfileForm
    ('^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm,'success_url':'/my/custom/url',}),
    (r'^profiles/', include('profiles.urls')),</pre>
<p>Now access <code>/profiles/edit/</code> again and you&#8217;ll find that the view is using your custom form definition, rather a default one derived from the profile model. Pretty easy once you see how the pieces fit together. Unfortunately, I was not able to find these answers from the Django docs on my own &#8211; a friend supplied the answers. </p>
<p>If you need even more control than that, there&#8217;s another alternative to passing a dict in through the urlconf &#8211; write your own view with the name <code>edit_profile</code>, overriding aspects of the provided view of the same name:</p>
<pre>from profiles import views as profile_views
from myprofiles.forms import ProfileForm

def edit_profile(request):
  return profile_views.edit_profile(request, form_class=ProfileForm)
</pre>
<p>(I haven&#8217;t tried this method).</p>
<p><strong>profile_detail and profile_list</strong></p>
<p>django-profiles enables other templates as well. As documented, the &#8220;details&#8221; template lets you retrieve all data associated with a single profile by sending an object named &#8220;profile&#8221; to the template <code>profile/profile_detail.html</code>, e.g.:</p>
<pre>&lt;p&gt;&lt;strong&gt;Address 2:&lt;/strong&gt;&lt;br&gt;
{{ profile.address2 }}
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;City:&lt;/strong&gt;&lt;br&gt;
{{ profile.city }}
&lt;/p&gt;</pre>
<p>It&#8217;s not quite so clear how to get a list of all profiles in the system. The docs say:</p>
<blockquote>profiles/profile_list.html will display a list of user profiles, using the list_detail.object_list generic view</blockquote>
<p>You&#8217;ll access the list view at <code>/profiles/</code>, with template code along the lines of:</p>
<blockquote>{% for p in object_list  %}<br />
&lt;a href=&#8221;{% url profiles_profile_detail p.user %}&#8221;&gt;{{ p }}&lt;/a&gt;<br />
{% endfor %}</blockquote>
<p>(in other words you can ignore the &#8220;list_detail.&#8221; portion of the object name referenced in the docs).<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>I have one remaining question: A common task when editing profile data would be to change one&#8217;s email address. But since the email address is included in the User model and not in the Profile model, it doesn&#8217;t show up in the {{form}} object. Anyone know how to get it in there?</p>
<p>With a few well-placed links and code samples, the django-profiles docs <em>could</em> be a great learning opportunity for this kind of Lego-like site construction. Until then, I&#8217;ll update this post with any other tips users provide on django-profiles implementation.</p>
<p>Despite my gripes about the docs, many thanks to Bennett for all of his excellent free code, writing, and other contributions to the Django community. And a ton of thanks to <a href="http://m.andric.us/">mandric</a> for the golden ticket on how to wire up the pieces.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/06/27/django-profiles/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>End Times</title>
		<link>http://birdhouse.org/blog/2009/06/14/end-times/</link>
		<comments>http://birdhouse.org/blog/2009/06/14/end-times/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 20:57:46 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Media]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Journalism]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3370</guid>
		<description><![CDATA[Who let Jason Jones of the Daily Show in to talk to New York Times staffers? Hilarious and on the money.



The Daily Show With Jon Stewart
Mon &#8211; Thurs 11p / 10c


End Times


www.thedailyshow.com








Daily Show Full Episodes
Political Humor
Newt Gingrich Unedited Interview






]]></description>
			<content:encoded><![CDATA[<p>Who let Jason Jones of the Daily Show in to talk to New York Times staffers? Hilarious and on the money.</p>
<table style='font:11px arial; color:#333; background-color:#f5f5f5' cellpadding='0' cellspacing='0' width='360' height='353'>
<tbody>
<tr style='background-color:#e5e5e5' valign='middle'>
<td style='padding:2px 1px 0px 5px;'><a target='_blank' style='color:#333; text-decoration:none; font-weight:bold;' href='http://www.thedailyshow.com/'>The Daily Show With Jon Stewart</a></td>
<td style='padding:2px 5px 0px 5px; text-align:right; font-weight:bold;'>Mon &#8211; Thurs 11p / 10c</td>
</tr>
<tr style='height:14px;' valign='middle'>
<td style='padding:2px 1px 0px 5px;' colspan='2'><a target='_blank' style='color:#333; text-decoration:none; font-weight:bold;' href='http://www.thedailyshow.com/video/index.jhtml?videoId=230076&#038;title=end-times'>End Times</a></td>
</tr>
<tr style='height:14px; background-color:#353535' valign='middle'>
<td colspan='2' style='padding:2px 5px 0px 5px; width:360px; overflow:hidden; text-align:right'><a target='_blank' style='color:#96deff; text-decoration:none; font-weight:bold;' href='http://www.thedailyshow.com/'>www.thedailyshow.com</a></td>
</tr>
<tr valign='middle'>
<td style='padding:0px;' colspan='2'><embed style='display:block' src='http://media.mtvnservices.com/mgid:cms:item:comedycentral.com:230076' width='360' height='301' type='application/x-shockwave-flash' wmode='window' allowFullscreen='true' flashvars='autoPlay=false' allowscriptaccess='always' allownetworking='all' bgcolor='#000000'></embed></td>
</tr>
<tr style='height:18px;' valign='middle'>
<td style='padding:0px;' colspan='2'>
<table style='margin:0px; text-align:center' cellpadding='0' cellspacing='0' width='100%' height='100%'>
<tr valign='middle'>
<td style='padding:3px; width:33%;'><a target='_blank' style='font:10px arial; color:#333; text-decoration:none;' href='http://www.thedailyshow.com/full-episodes/index.jhtml'>Daily Show<br/> Full Episodes</a></td>
<td style='padding:3px; width:33%;'><a target='_blank' style='font:10px arial; color:#333; text-decoration:none;' href='http://www.indecisionforever.com'>Political Humor</a></td>
<td style='padding:3px; width:33%;'><a target='_blank' style='font:10px arial; color:#333; text-decoration:none;' href='http://www.thedailyshow.com/video/index.jhtml?videoId=228277&#038;title=Newt-Gingrich-Unedited-Interview'>Newt Gingrich Unedited Interview</a></td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/06/14/end-times/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GMail vs. Mail.app</title>
		<link>http://birdhouse.org/blog/2009/06/01/gmail-vs-mailapp/</link>
		<comments>http://birdhouse.org/blog/2009/06/01/gmail-vs-mailapp/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 15:30:03 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Geek]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3360</guid>
		<description><![CDATA[ Confession: I&#8217;ve never liked webmail &#8211; I was a hardcore Eudora user for ages, then spent five years with BeOS desktop mail clients, then a year with Entourage on the Mac before finally switching four years ago to Apple&#8217;s Mail.app, with its flawless IMAP implementation. Every time I&#8217;ve tried the &#8220;next generation&#8221; of webmail [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/06/gmail-1.png" height="72" width="153" border="0" align="left" hspace="7" vspace="4" alt="Gmail-1" /> Confession: I&#8217;ve never liked webmail &#8211; I was a hardcore Eudora user for ages, then spent five years with BeOS desktop mail clients, then a year with Entourage on the Mac before finally switching four years ago to Apple&#8217;s Mail.app, with its flawless IMAP implementation. Every time I&#8217;ve tried the &#8220;next generation&#8221; of webmail clients, they&#8217;ve felt anemic to me, and I&#8217;ve felt like my workflow slowed way down &#8212; not because they were slow <em>per se&#8217;</em>, but because of the dozens of small niceties you get with desktop clients that you don&#8217;t get with webmail. I&#8217;ve relegated webmail to something you use when you&#8217;re not at your own machine for some reason and/or aren&#8217;t able to take the two minutes it takes to configure IMAP at a foreign machine. </p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/06/mailapp-1.png" height="125" width="133" border="0" align="left" hspace="7" vspace="4" alt="Mailapp-1" /> That&#8217;s why I&#8217;ve always been amazed to see how many developers and gear-heads use GMail. These are tech-savvy people, who I&#8217;d think would have the same frustrations with webmail that I do. What are they seeing that I&#8217;m not seeing? I totally get the convenience factor of being able to access my mail through any web browser, anywhere. I wouldn&#8217;t mind having that, but so far it hasn&#8217;t seemed worth the sacrifices. I know GMail keeps getting better, so thought it was finally time to give myself over to GMail for a week and see how it goes. Here are some notes on that experience. </p>
<p>n.b.: I&#8217;m using Google&#8217;s official list of <a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;ctx=mail&amp;answer=6594">keyboard shortcuts</a>. I used the 3rd party tool <a href="http://www.apple.com/downloads/macosx/internet_utilities/addressbooktocsvexporter.html">A to G</a> to convert Apple&#8217;s Address Book to CSV, then imported 1200 contacts into GMail&#8217;s contact system.</p>
<p>My list of GMail gripes, with a few faint praises in the mix:</p>
<p>- <strong>No way to change the default reading font.</strong> Really??? The default reading/writing font is just too small to be comfortable (for me), and it&#8217;s ridiculous that something this straightforward and ubiquitous in desktop clients would not be there. How hard can it be to give the user a choice of common font faces and sizes? Does not compute.</p>
<p>- <strong>No way to quote previous text before replying.</strong> Every desktop mail client I&#8217;ve used lets you select a block of text in a message, then hit Reply. Only the selected text appears in the reply. This is so core to netiquette and to my every day workflow that it seems like a non-negotiable feature. And yet no webmail client I&#8217;ve tried supports it. Not even GMail. No wonder over-quoting is such a problem these days. Later&#8230; OK, I discovered that this &#8220;feature&#8221; is actually available under Settings | Labs. When I enabled it, it complained that it could &#8220;not be loaded,&#8221; and continues to complain every time I exit the Settings menu, though it did work correctly in my first test. Cool, but why is it in Labs, as if it&#8217;s some kind of optional convenience that only a few people might want? How can this not be part of the default package?  Core functionality.</p>
<p>- <strong>Inline photos.</strong> A family member sent 10 photos as attachments. When viewed in Mail.app they&#8217;re displayed inline, nice and large; GMail only shows thumbnails inline, though you can click &#8220;View all images&#8221; to see them full size on a separate page. There is of course no option to &#8220;Save all to iPhoto&#8221; in GMail. Since they were family photos, that&#8217;s exactly what I wanted to do.</p>
<p>- <strong>No preview pane.</strong> For realsies? I know of at least two webmail clients (RoundCube, which is available on Birdhouse, and Apple&#8217;s mac.com (errr, me.com)). If they can do it, why can&#8217;t one of the most popular webmail clients of them all? </p>
<p>- <strong>More clicks to view the next message.</strong> When done viewing one message, if you click Delete or Archive, you&#8217;re taken back to the full message list, which lacks a preview pane. So you then need to click again to view the next message. This kind of &#8220;more clicks/keystrokes to accomplish common tasks&#8221; is all over the place in GMail.</p>
<p>- <strong>No way to turn external mail checking on/off.</strong> I now have GMail configured to work as a POP client to two external accounts (would have configured it as IMAP, but GMail doesn&#8217;t support that, even though you can use external clients to talk IMAP to GMail &#8211; weird). Now I&#8217;d like to have GMail <em>stop</em> checking those two external accounts for a while, without removing all the config info. Too bad &#8211; the only way to make it stop is apparently to delete the account completely. Grrr&#8230;</p>
<p>- <strong>Poor conversation threading.</strong> GMail does an OK job at this &#8211; better than other webmail clients, but nowhere near as clean visually or as easy to navigate as threaded discussions in desktop mail apps. And because GMail shows a thread all on one page (thanks again to no preview pane), deleting individual messages out of the thread takes a lot more scrolling and clicking than it does in a desktop client. GMail&#8217;s threading is a pale imitation of technology we&#8217;ve had on the desktop for years. However, I really do like being able to see my own replies automatically in the context of the thread, even without having explicitly cc:&#8217;d myself, and without having to dig through the Sent folder. But the ease of expanding and collapsing a thread, of jumping to the next unread message in a thread, of deleting individual messages from a thread&#8230; all vastly superior in Mail.app.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/06/threadcollapse.png" height="67" width="624" border="0" hspace="7" vspace="4" alt="Threadcollapse" /><br />
<em>In Mail.app, a thread is indicated by the presence of an arrow in the left column.</em></p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/06/threadexpand.png" height="140" width="632" border="0" hspace="7" vspace="4" alt="Threadexpand" /><br />
<em>Cmd-RightArrow expands the thread; spacebar jumps you to the next unread message in the thread. The actual conversation is shown in the Preview pane. It&#8217;s easy to delete individual messages from the thread.<br />
</em></p>
<p>- <strong>Keyboard shortcuts.</strong> Yes, there are some. Yes, they work for the most part. But they&#8217;re not as ubiquitous or as clean to use as the keyboard shortcuts in a desktop client. I found myself doing a lot more mousing in GMail than I&#8217;m accustomed to doing in email.</p>
<p>- <strong>Adding contacts.</strong> I get a message from someone who&#8217;s not in my Contacts list. If there&#8217;s a way to add this person to my Contacts list on the fly, I&#8217;m not seeing it (yes, I looked). Mail.app makes this common process trivial and intuitive. </p>
<p>- <strong>Moving messages between accounts.</strong> One of the ways I rely heavily on IMAP is the ability to drag and drop messages between various mailboxes and servers. If I receive a message at work that I want to handle at home, I drag it from calmail to birdhouse, and vice versa. If I want to pull something out of cold storage (e.g. from a local mail store and put it back on a live mail server for handling), I can do that. GMail can be configured to talk to multiple accounts, but since it itself does not work like an IMAP client to foreign mail servers, it can&#8217;t do any kind of inter-server message moving. I guess the idea is that its model makes this kind of thing irrelevant, but it feels like a big missing piece of the modern mail experience.</p>
<p>- <strong>Integrated chat.</strong> Both GMail and Mail.app have this, but GMail clearly wins here when you&#8217;re at someone else&#8217;s computer since you don&#8217;t have to set up both the mail and chat clients (thanks @jrue for this point).</p>
<p>- <strong>&#8220;Send Again&#8221; feature.</strong> Not something you use a lot, but when you do, it&#8217;s a real time saver. Use this after sending a message to someone who&#8217;s address has died and you want to try again to the right address, or when you left someone off the original cc: list.  Mail.app and other desktop clients have it. GMail doesn&#8217;t.</p>
<p>- <strong>Breaks quoting.</strong> Let&#8217;s say you&#8217;ve got a paragraph of quoted text in an incoming message and you want to reply to it in two parts. In a desktop client, you put the cursor where you want to break the graf and hit Return. A new quote mark is automatically added to the beginning of the new line. Not in GMail &#8211; you end up with the first line that should be quoted suddenly unquoted. Later&#8230; turns out this does work properly in rich text mode in GMail, but not in plain text mode. But I prefer to stay in plain text mode, only switching to rich text mode when necessary.</p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/06/quotebroken.png" alt="quotebroken" title="quotebroken" width="407" height="84" class="alignnone size-full wp-image-3362" /><br />
<em>While replying in plain text mode in GMail, insert cursor in the middle of a paragraph and hit Return to start your reply. The new line lacks a starting mail quote mark, breaking netiquette and readability for the recipient.</em></p>
<p>- <strong>No Data Detectors.</strong> OK, this is only available in Mail.app, not all desktop mail clients, but it really is a killer feature. Roll over any date or time in any format, or any person&#8217;s name or email address, even in a plain text message, and you get a little drop-down menu that lets you quickly add that item to your calendar or address book. </p>
<p><img src="http://birdhouse.org/blog/wp-content/uploads/2009/06/datadetector-1.png" height="83" width="472" border="0" hspace="7" vspace="4" alt="Datadetector-1" /></p>
<p>Data detectors do an amazing job of figuring out all the right fields &#8212; almost magic (try it with messages referencing &#8220;tomorrow&#8221; or &#8220;next Tuesday.&#8221;) GMail does have an &#8220;Add Event&#8221; option but it&#8217;s nowhere near as intelligent or as slick, and it works for the whole message, not for individual text snippets within the message. Big win for Mail.app.</p>
<p>- <strong>Partial word searches.</strong> The search feature in GMail is nice, but is not better than the one in Mail.app. Yes, Google is a bit faster at returning results, but not by much (yes, Apple&#8217;s Spotlight is *that* fast). But here&#8217;s the kicker &#8211; Google and GMail can&#8217;t do partial-word searches. So if I&#8217;m looking for an email that I know includes the word &#8220;question&#8221; but I just type &#8220;quest&#8221; [Return] into GMail search, it turns up nothing! Wildcard searches <a href="http://getsatisfaction.com/google/topics/partial_word_search_problem_on_gmail">don&#8217;t work either</a>. Very frustrating. Even on their native search turf, Google loses to Apple. <strong>Update:</strong> There are also types of searches Mail.app can&#8217;t do, such as combined OR statements. So let&#8217;s call this one a draw. </p>
<p>- <strong>End-of-line key combo.</strong>  On the Mac, the standard keyboard shortcuts to jump the cursor to the start/end of the current line are Cmd-RightArrow and Cmd-LeftArrow. These don&#8217;t work in GMail. In fact, as far as I can tell there&#8217;s no keyboard short to do this on the Mac in GMail. Which amounts to one more reason GMail is a lot more mouse dependent than using Mail.app or other desktop client. Can&#8217;t blame this on rich text editors either &#8212; WordPress uses a TinyMCE variant, and Cmd-RightArrow works there just fine. GMail is just broken in this respect.</p>
<p>- <strong>Ads in my email.</strong> They just bug me. I totally understand that that&#8217;s how I pay for the service. I get that. I still don&#8217;t like looking at them. Irritating. In fact, I found the whole GMail experience more cluttered and just&#8230; less elegant than working with a desktop client.</p>
<p><strong>ADDED LATER</strong></p>
<p>- <strong>Multiple windows.</strong> Sometimes I like to have two or more messages open at once, plus a compose window, so I can copy/paste bits around and between messages, or for reference while writing something new. Easy to do in a desktop client. Assumed I could do similar in GMail by cmd-clicking messages to open them in various tabs, but nope &#8211; GMail doesn’t allow that &#8211; forces you to only be looking at one thing at a time. Is that a feature they haven’t implemented yet, or an intentional limitation? Feels like the latter.</p>
<p><strong>Upshot:</strong> I didn&#8217;t follow through on my promise to try GMail for a week. The frustration was too much to deal with, and I quit after four days. I&#8217;m back on Mail.app now. I probably missed out on some of GMail&#8217;s goodness, but overall, I left feeling exactly like I did going in. GMail has its advantages, but to me, it seems like they&#8217;re vastly outweighed by the absence of basic functionality and elegance present in all desktop mail clients (and by additional features in Mail.app) that I just missed too much. Feels good to be home.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/06/01/gmail-vs-mailapp/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Maker Faire 2009</title>
		<link>http://birdhouse.org/blog/2009/05/31/maker-faire-2009/</link>
		<comments>http://birdhouse.org/blog/2009/05/31/maker-faire-2009/#comments</comments>
		<pubDate>Sun, 31 May 2009 17:43:46 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Out there]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3351</guid>
		<description><![CDATA[There were stickers scattered randomly around this year&#8217;s Maker Faire:  &#8220;Last year was better.&#8221; The weird thing was that whoever made them would had to have printed them up before the fair began. How could they know in advance? What would have happened if this year had been better than ever? Unfortunately, the stickers [...]]]></description>
			<content:encoded><![CDATA[<p>There were stickers scattered randomly around this year&#8217;s <a href="http://makerfaire.com/">Maker Faire</a>:  &#8220;Last year was better.&#8221; The weird thing was that whoever made them would had to have printed them up before the fair began. How could they know in advance? What would have happened if this year had been better than ever? Unfortunately, the stickers were right.</p>
<p>We&#8217;ve attended all four years of Maker Faire now, so Miles has been there at ages 3, 4, 5 and 6 (does that qualify as a tradition?) I still think it&#8217;s one of the Bay Area&#8217;s most amazing explosions of talent and creativity &#8212; there&#8217;s nothing else like it. But this year there were noticeably fewer amazing giant steel sculptures, a much smaller presence from the incredible <a href="http://www.cyclecide.com/">Cyclecide</a>, more guard rails and safety precautions, more people (again), and more attendance from professional organizations. Year by year, the fair is starting to feel a bit less like a family-friendly version of Burning Man, a bit more like an opportunity for professional Lego collectors to network. </p>
<p>I don&#8217;t want to make too much of that though &#8211; Maker Faire most definitely has NOT started to suck. It&#8217;s still dazzling, inspiring, amazing. Just that it&#8217;s started to feel a bit&#8230; <em>safer</em> than it once did.</p>
<p>That said, Miles and I had an amazing day watching the Giant Mouse Trap, building inventions with computer scrap parts, learning about the SCA, &#8220;driving&#8221; the amazing snail car, watching the human llama wobble around, riding the wooden bikes (my fave part of every MF), digging on a thousand kinds of robots, taking on challenges at the Instructables booth, spending way too much time at the various Legos exhibits, eating great good food on a perfect spring day. And the R2D2 Miles wanted so badly to see last year finally showed up &#8211; the little Padouin was beaming with happiness. </p>
<p>This year&#8217;s photo gallery (63 images and 10 videos):</p>
<p><object width="500" height="375"><param name="flashvars" value="offsite=true&#038;lang=en-us&#038;page_show_url=%2Fphotos%2Fshacker%2Fsets%2F72157618949683987%2Fshow%2F&#038;page_show_back_url=%2Fphotos%2Fshacker%2Fsets%2F72157618949683987%2F&#038;set_id=72157618949683987&#038;jump_to="></param><param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649"></param><param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowFullScreen="true" flashvars="offsite=true&#038;lang=en-us&#038;page_show_url=%2Fphotos%2Fshacker%2Fsets%2F72157618949683987%2Fshow%2F&#038;page_show_back_url=%2Fphotos%2Fshacker%2Fsets%2F72157618949683987%2F&#038;set_id=72157618949683987&#038;jump_to=" width="500" height="375"></embed></object></p>
<p>Click icon at lower right after starting to view full-screen.<br />
<a href="http://www.flickr.com/photos/shacker/sets/72157618949683987/">View the whole set at Flickr</a> (includes captions you don&#8217;t get with the slideshow).</p>
<p>See also: my photos from Maker Faires <a href="http://www.flickr.com/photos/shacker/sets/72157604869914686/">2008</a>, <a href="http://www.flickr.com/photos/shacker/sets/72157600233456498/">2007</a> and <a href="http://www.flickr.com/photos/shacker/sets/72057594114433861/">2006</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/05/31/maker-faire-2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fidelity</title>
		<link>http://birdhouse.org/blog/2009/05/27/fidelity/</link>
		<comments>http://birdhouse.org/blog/2009/05/27/fidelity/#comments</comments>
		<pubDate>Thu, 28 May 2009 04:07:44 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3349</guid>
		<description><![CDATA[This week&#8217;s California Supreme Court Ruling to uphold the voters&#8217; recent decision to bake discrimination into the Constitution was tragic, though it was made for reasons that have little to do with the Supremes&#8217; actual position on gay marriage. 
That&#8217;s OK. Now we&#8217;ve got two years to ramp up a properly prepared campaign for the [...]]]></description>
			<content:encoded><![CDATA[<p>This week&#8217;s California Supreme Court Ruling to uphold the voters&#8217; recent decision to bake discrimination into the Constitution was tragic, though it was made for reasons that have little to do with the Supremes&#8217; actual position on gay marriage. </p>
<p>That&#8217;s OK. Now we&#8217;ve got two years to ramp up a properly prepared campaign for the 2010 elections, in which we can upend this topsy turvy, nonsensical situation and restore reason and compassion to our state. </p>
<p>Courage Campaign has <a href="http://www.couragecampaign.org/page/s/1million">launched a pledge campaign</a> to overturn Prop 8 by 2010. It may take all we can muster to turn this around, but it&#8217;s the duty of every person who considers themselves a fair, honest human being with a basic, non-negotiable conviction in basic equal rights. Please join us. </p>
<p>This excellent Fidelity video is already starting to air on TV across the state:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/qTFNlYp3n20&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/qTFNlYp3n20&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/05/27/fidelity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Price of Sex</title>
		<link>http://birdhouse.org/blog/2009/05/26/price-of-sex/</link>
		<comments>http://birdhouse.org/blog/2009/05/26/price-of-sex/#comments</comments>
		<pubDate>Wed, 27 May 2009 06:03:24 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Hosting]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3347</guid>
		<description><![CDATA[Birdhouse Hosting is proud to welcome a chilling, but expertly produced new web site by photojournalist Mimi Chakarova, priceofsex.org:
Chakarova has spent more than six years reporting on sex trafficking in Eastern Europe and parts of the Middle East. The site features a series of interviews with young women sold into prostitution against their will, multimedia [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hosting.birdhouse.org/">Birdhouse Hosting</a> is proud to welcome a chilling, but expertly produced new web site by photojournalist Mimi Chakarova, <a href="http://www.priceofsex.org/">priceofsex.org</a>:</p>
<p>Chakarova has spent more than six years reporting on sex trafficking in Eastern Europe and parts of the Middle East. The site features a series of interviews with young women sold into prostitution against their will, multimedia video pieces, reporting notes, previous work that launched on PBS&#8217; Frontline/World, NGO resources and ways to get involved. Chakarova says:</p>
<blockquote>Please spread the word and leave comments on the site. Your input is invaluable. And as always, I am grateful for your support and interest in my work.</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/05/26/price-of-sex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gemini Rising</title>
		<link>http://birdhouse.org/blog/2009/05/25/gemini-rising/</link>
		<comments>http://birdhouse.org/blog/2009/05/25/gemini-rising/#comments</comments>
		<pubDate>Mon, 25 May 2009 16:39:53 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3345</guid>
		<description><![CDATA[This week at Stuck Between Stations:
Roger Moore on the appearance of Metallica&#8217;s Lars Ulrich on the Rachel Maddow Show: Heavy Metal Drummer.
Scot on the greatest prog rock band you&#8217;ve never heard of: The mythical Gemini Rising takes to the web&#8217;s faux airwaves.
]]></description>
			<content:encoded><![CDATA[<p>This week at <a href="http://stuckbetweenstations.org/">Stuck Between Stations</a>:</p>
<p>Roger Moore on the appearance of Metallica&#8217;s Lars Ulrich on the Rachel Maddow Show: <a href="http://stuckbetweenstations.org/2009/05/24/heavy-metal-drummer/">Heavy Metal Drummer</a>.</p>
<p>Scot on the greatest prog rock band you&#8217;ve never heard of: The mythical <a href="http://stuckbetweenstations.org/2009/05/24/gemini-rising/">Gemini Rising</a> takes to the web&#8217;s faux airwaves.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/05/25/gemini-rising/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webcasting with Django</title>
		<link>http://birdhouse.org/blog/2009/05/20/webcasting-with-django/</link>
		<comments>http://birdhouse.org/blog/2009/05/20/webcasting-with-django/#comments</comments>
		<pubDate>Wed, 20 May 2009 19:16:12 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Web Dev]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3315</guid>
		<description><![CDATA[The Knight Digital Media Center, which runs on Django, hosts week-long workshops for working journalists who come from around the country to learn multimedia and internet technology skills.  We fill many of our lunch and dinner sessions with talks by journalism industry experts and pundits, and webcast their presentations live. After workshops are over, [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://multimedia.journalism.berkeley.edu/">Knight Digital Media Center</a>, which runs on <a href="http://www.djangoproject.com/">Django</a>, hosts week-long workshops for working journalists who come from around the country to learn multimedia and internet technology skills.  We fill many of our lunch and dinner sessions with talks by journalism industry experts and pundits, and webcast their presentations live. After workshops are over, we post the <a href="http://multimedia.journalism.berkeley.edu/webcasts/">archived video</a> for posterity. There&#8217;s more to handling multi-day, multi-part live and archived video with Django and a genuine streaming server than meets the eye, so thought I&#8217;d break it down.</p>
<p>An &#8220;event&#8221; can last any number of days, and can include any number of presentations, each of which may or may not include a webcast. While the event is in progress, you want the ability to advertise a single URL, where all of the live webcasts will happen. But for the archives, which is where the vast majority of viewing happens over the course of time, you want a separate page/URL for each presentation. <a href="http://multimedia.journalism.berkeley.edu/presentations/267/">Presentation pages</a> include details on that speaker, summaries of what was presented, and optional downloads of PowerPoint or Keynote presentations. Our Presentation model is foreign-keyed to a master Event model (or, in our case, the Workshop model).</p>
<p>Because they&#8217;re time-based, synchronous events, webcasts are different from typical web pages. There are five possible &#8220;states&#8221; a webcast page can be in at any given time, all of which require different things to be inserted into the view:</p>
<p><strong>Upcoming:</strong> The event is announced but there&#8217;s nothing yet to show. Tell user that webcast will be live at posted time (along with schedule).</p>
<p><strong>In progress: </strong> The event is occurring. Insert appropriate <code>object</code> code to embed live QuickTime stream.</p>
<p><strong>Concluded:</strong> The live webcast has ended, but the archives haven&#8217;t yet been prepared and posted (this can take us a few days). Tell user to come back soon.</p>
<p><strong>Archive:</strong> The archived video is prepared and available on the streaming server for posterity. Insert appropriate <code>object</code> code to display streamed archive file from QuickTime Streaming Server.</p>
<p><strong>External:</strong> We sometimes host events at other locations on campus, in which case UC Berkeley handles the webcasting rather than us. If so, we need to link from our events database to theirs. Insert appropriate message and link.</p>
<p>In Django, we represent these choices with the typical CHOICES construct:</p>
<p><code>webcast_state = models.CharField(max_length=4,choices=WEBCAST_STATE_CHOICES)</code></p>
<p>&#8230; which ends up looking like this in the Django admin:</p>
<p><img class="alignnone size-full wp-image-3318" title="webcast_state" src="http://birdhouse.org/blog/wp-content/uploads/2009/05/webcast_state.png" alt="webcast_state" width="413" height="150" /></p>
<p>Depending on the current state, different content (text or object/embed code) is inserted into the page in real time (using simple conditionals in Django templates). The Django admin thus becomes a handy tool our student helpers can use to make the master workshop page embed the right thing in the right place at the right time without requiring tech skills. Remember, during the course of a workshop week, all video is happening in the master Workshop page &#8211; later, streaming video archives will go into separate Presentation pages and be automatically linked to from the parent Workshop page.</p>
<h3>Stream Handles</h3>
<p>At the J-School, we use <a href="http://www.apple.com/quicktime/streamingserver/">QuickTime Streaming Server</a>, in part because it&#8217;s free, and in part because all of our  workstations and most of our servers are Macs. We&#8217;ve contemplated switching to Flash streaming, but the simplicity of keeping everything Mac-native keeps us on QTSS for now.</p>
<p>Embedding a stream from an external QTSS server is not quite as straightforward as embedding a typical QuickTime movie. Video comes from QTSS over the <code>rtsp://</code> protocol, rather than <code>http://</code>. And there&#8217;s the catch: <strong>You can&#8217;t embed an rtsp stream directly into a web page</strong> &#8212; instead, you need to embed a <em>fake</em> QuickTime movie (a &#8220;reference movie&#8221;), which is actually a text file with the <code>.mov</code> extension. That text file simply references the full URL of the rtsp stream coming from QTSS.  The contents of a reference movie file might look like this:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;?quicktime type="application/x-quicktime-media-link"?&gt;
&lt;embed src="rtsp://streamer.domain.edu/events/131.humanity_2.0.mov" /&gt;</pre>
<p>Here&#8217;s where things get interesting as far as Django is concerned. We don&#8217;t want to have to create a physical reference movie for every single stream we serve. And yet, at the HTML level, we have to embed something that looks like a reference to a physically external movie file, e.g.:</p>
<pre id="line135">&lt;<span class="start-tag">object</span><span class="attribute-name"> classid</span>=<span class="attribute-value">"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" </span><span class="attribute-name">
 width</span>=<span class="attribute-value">"480" </span><span class="attribute-name">height</span>=<span class="attribute-value">"376" </span><span class="attribute-name">
  codebase</span>=<span class="attribute-value">"http://www.apple.com/qtactivex/qtplugin.cab"</span>&gt;
 &lt;<span class="start-tag">param</span><span class="attribute-name"> name</span>=<span class="attribute-value">"SRC" </span><span class="attribute-name">value</span>=<span class="attribute-value">"<strong>/presentations/webcast-archive.227.ref.mov</strong>"</span>&gt;
 &lt;<span class="start-tag">param</span><span class="attribute-name"> name</span>=<span class="attribute-value">"AUTOPLAY" </span><span class="attribute-name">value</span>=<span class="attribute-value">"true"</span>&gt;
 &lt;<span class="start-tag">param</span><span class="attribute-name"> name</span>=<span class="attribute-value">"CONTROLLER" </span><span class="attribute-name">value</span>=<span class="attribute-value">"true"</span>&gt;
 &lt;<span class="start-tag">embed</span><span class="attribute-name"> src</span>=<span class="attribute-value">"<strong>/presentations/webcast-archive.227.ref.mov</strong>" </span><span class="attribute-name">
  width</span>=<span class="attribute-value">"480" </span><span class="attribute-name">height</span>=<span class="attribute-value">"376" </span><span class="attribute-name">autoplay</span>=<span class="attribute-value">"true" </span><span class="attribute-name">controller</span>=<span class="attribute-value">"true" </span><span class="attribute-name">
  pluginspage</span>=<span class="attribute-value">"http://www.apple.com/quicktime/download/"</span>&gt;
&lt;/<span class="end-tag">object</span>&gt;</pre>
<p>So how can we make Django think that <code>/presentations/webcast-archive.227.ref.mov</code> is an actual file on the server, which in turn contains the correct reference to the rtsp stream coming from the streaming server? In effect, it&#8217;s a &#8220;view within a view.&#8221;</p>
<p><a href="http://birdhouse.org/blog/wp-content/uploads/2009/05/webcast_setup.jpg" rel="lightbox"><img class="alignnone size-medium wp-image-3327" title="webcast_setup" src="http://birdhouse.org/blog/wp-content/uploads/2009/05/webcast_setup-533x400.jpg" alt="webcast_setup" width="533" height="400" /></a><br />
<em>Click for larger version</em></p>
<p>Displaying the presentation page is straightforward Django &#8211; I won&#8217;t get into that here. But here&#8217;s how the &#8220;view within a view&#8221; stuff works. In the object section of the presentation page template there is a reference to:</p>
<p><code>&lt;param name="SRC" value="/presentations/webcast-archive.{{object.id}}.ref.mov"&gt;</code></p>
<p>which resolves to something like:</p>
<p><code>&lt;param name="SRC" value="/presentations/webcast-archive.267.ref.mov"&gt;</code></p>
<p>When the browser hits that line, it requests <code>/presentations/webcast-archive.267.ref.mov</code> from the server, which in turn triggers this entry in <code>urls.py</code>:</p>
<pre>url(r'^presentations/webcast-archive.(?P&lt;pres_id&gt;\d+).ref.mov$',
'workshops.views.presentation_webcast_archive',
name='workshops_presentation_webcast_archive'),</pre>
<p>So after the presentation page has been rendered by Django and sent to the browser, a second (very simple) view, presentation_webcast_archive, is called, which is simply:</p>
<pre>
def presentation_webcast_archive(request, pres_id):
    """
    Generate a virtual QuickTime reference movie on the fly,
    to be embedded in presentation webcast pages.
    """

    pres = get_object_or_404(Presentation,id=pres_id) 

    return render_to_response( 'workshops/presentation_webcast_archive.txt',
        {
            'p': pres,
        }, context_instance=RequestContext(request),
    )
</pre>
<p>That view spits out the same presentation object to a different template, <code>presentation_webcast_archive.txt</code>, which consists of:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;?quicktime type="application/x-quicktime-media-link"?&gt;
&lt;embed src="rtsp://domain.edu/events/{{p.webcast_path}}/{{p.webcast_filename}}" /&gt;</pre>
<p>Where <code>webcast_path</code> and <code>webcast_filename</code> are fields on the model representing the physical location of the QuickTime media on the streaming server (not the web server). After a workshop week is over, staff only need to <a href="http://www.apple.com/quicktime/tutorials/hinttracks.html">hint</a> the saved archive files, upload them to a directory and filename on the streaming server,  enter those paths in the Django admin, and check the &#8220;Has Webcast&#8221; box. The rest is automatic.</p>
<p>In a previous, PHP-based version of this system, we had to prepare an actual reference movie for every archive stream we hosted. By using this &#8220;view within a view&#8221; technique, Django has let us remove that part of the workflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/05/20/webcasting-with-django/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spaghetti Dogs</title>
		<link>http://birdhouse.org/blog/2009/04/25/spaghetti-dogs/</link>
		<comments>http://birdhouse.org/blog/2009/04/25/spaghetti-dogs/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 18:08:19 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Out there]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3311</guid>
		<description><![CDATA[Had some freaky food fun today&#8230; cut hot dogs into segments, pushed pieces of dry spaghetti through, boiled. Despite the faces in these shots, Miles loved them, said they looked like Cerise Tinh from Star Wars&#8230; without a face. 

After clicking Play button, click icon at lower right of slideshow to view full-screen.
Flickr set
]]></description>
			<content:encoded><![CDATA[<p>Had some freaky food fun today&#8230; cut hot dogs into segments, pushed pieces of dry spaghetti through, boiled. Despite the faces in these shots, Miles loved them, said they looked like Cerise Tinh from Star Wars&#8230; without a face. </p>
<p><object width="400" height="300"><param name="flashvars" value="offsite=true&#038;lang=en-us&#038;page_show_url=%2Fphotos%2Fshacker%2Fsets%2F72157617307832246%2Fshow%2F&#038;page_show_back_url=%2Fphotos%2Fshacker%2Fsets%2F72157617307832246%2F&#038;set_id=72157617307832246&#038;jump_to="></param><param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=70933"></param><param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=70933" allowFullScreen="true" flashvars="offsite=true&#038;lang=en-us&#038;page_show_url=%2Fphotos%2Fshacker%2Fsets%2F72157617307832246%2Fshow%2F&#038;page_show_back_url=%2Fphotos%2Fshacker%2Fsets%2F72157617307832246%2F&#038;set_id=72157617307832246&#038;jump_to=" width="400" height="300"></embed></object></p>
<p>After clicking Play button, click icon at lower right of slideshow to view full-screen.</p>
<p><a href="http://www.flickr.com/photos/shacker/sets/72157617307832246/">Flickr set</a></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/04/25/spaghetti-dogs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Black Hole &#8211;&gt; Fluff</title>
		<link>http://birdhouse.org/blog/2009/04/19/black-hole-fluff/</link>
		<comments>http://birdhouse.org/blog/2009/04/19/black-hole-fluff/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 04:46:09 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Miles]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3307</guid>
		<description><![CDATA[Miles&#8217; cosmology, cont&#8217;d.:

&#8220;A ball of fluff falls into a black hole, and out comes me, a ball of fluff!&#8221;
]]></description>
			<content:encoded><![CDATA[<p>Miles&#8217; cosmology, cont&#8217;d.:</p>
<p><a rel="attachment wp-att-3308" href="http://birdhouse.org/blog/2009/04/19/black-hole-fluff/blackhole/"><img class="alignnone size-medium wp-image-3308" title="blackhole" src="http://birdhouse.org/blog/wp-content/uploads/2009/04/blackhole-533x400.jpg" alt="blackhole" width="533" height="400" /></a></p>
<p>&#8220;A ball of fluff falls into a black hole, and out comes me, a ball of fluff!&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/04/19/black-hole-fluff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gas vs. Charcoal</title>
		<link>http://birdhouse.org/blog/2009/04/18/gas-vs-charcoal/</link>
		<comments>http://birdhouse.org/blog/2009/04/18/gas-vs-charcoal/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 17:47:51 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3299</guid>
		<description><![CDATA[In some circles, the gas vs. charcoal grill debate is like red state/blue state, saints vs. atheist heathens. Charcoal purists swear there&#8217;s a noticeable taste difference, while gas users claim there is none, or that if there is, it&#8217;s minuscule compared to taste factors that come from the dry rub or marinade, cooking technique, and [...]]]></description>
			<content:encoded><![CDATA[<p>In some circles, the <a href="http://www.google.com/search?q=gas+vs.+charcoal&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:en-US:official&amp;client=firefox-a">gas vs. charcoal grill debate</a> is like red state/blue state, saints vs. atheist heathens. Charcoal purists swear there&#8217;s a noticeable taste difference, while gas users claim there is none, or that if there is, it&#8217;s minuscule compared to taste factors that come from the dry rub or marinade, cooking technique, and quality of meat. Some even <a href="http://www.essortment.com/food/charcoalnatural_sjei.htm">cite studies</a> &#8220;showing that there is no effective taste difference between food cooked with gas vs. charcoal.&#8221; Charcoal users claim that if you can&#8217;t taste the difference, you&#8217;re not paying attention. There&#8217;s also a big romance factor associated with charcoal &#8211; piling up, lighting, tending the coals is part of the ritual, and rituals are important. I can dig that, but happily trade it for the convenience of being able to come home from work late and start grilling immediately. And I&#8217;m just not sure I buy the taste difference thing, unless you&#8217;re wanting to make a real smoker.</p>
<p>I&#8217;ve found that some charcoal enthusiasts think gas grills don&#8217;t produce smoke at all&#8230; which is absolutely not true. A gas grill is not an oven! The smoke from gas grills can be voluminous (even scary), and comes from the burning off of fats and drippings from meat, as well as the carbonized residue of previous grilling sessions. Yep, it&#8217;s a different kind of smoke from charcoal smoke, but it&#8217;s definitely smoke.</p>
<p>Our family are gas peeps &#8211; we sort of skipped the charcoal phase and went straight for convenience. For us, the gas decision was partly environmental, wanting to sidestep or reduce particulate emissions that come from burning wood, for the same reason newer houses don&#8217;t even come with fireplaces.</p>
<blockquote>Charcoal grills <a href="http://www.eatingwell.com/eat_drink/kitchen_tips/best_grilling_tips.html">emit more carbon monoxide</a>, particulate matter and soot into the atmosphere, contributing to increased pollution and higher concentrations of ground-level ozone.</blockquote>
<p>In fact, <a href="http://environment.about.com/od/health/a/charcoal_grills.htm">in Canada</a>, charcoal is now a restricted product under the Hazardous Products Act. But the carbon footprint question is more complicated than it appears on the surface &#8211; charcoal may come from renewable forests, which in turn consume the same amount of CO2 as the grills they fuel produce. Then again, a lot of charcoal products are infused with chemicals to make it easier to light, burn longer, etc. <a href="http://www.slate.com/id/2193873/">Slate</a> has a great piece on the environmental factors in the gas vs. charcoal question.</p>
<p>Then there&#8217;s the cost factor &#8211; gas grills cost more, but reqire far less expenditure on fuel &#8211; a round of charcoal cooking can <a href="http://bbq.about.com/od/grills/a/aa121298.htm">cost up to $5.00</a> in briquettes, while gas might clock in at around $0.50 per session.</p>
<p>OK, poll time &#8211; do you do gas or charcoal? Let me know in the comments whether you can taste the difference.</p>
<div class='democracy'>
		<strong class="poll-question">What kind of grilling do you do?</strong></p>
<div class='dem-results'>
<form action='http://birdhouse.org/blog/wp-content/plugins/democracy/democracy.php' onsubmit='return dem_Vote(this)'>
<ul>
<li>
<input type='radio' id='dem-choice-107' value='107' name='dem_poll_23' />
					<label for='dem-choice-107'>Gas</label>
			</li>
<li>
<input type='radio' id='dem-choice-108' value='108' name='dem_poll_23' />
					<label for='dem-choice-108'>Charcoal</label>
			</li>
<li>
<input type='radio' id='dem-choice-109' value='109' name='dem_poll_23' />
					<label for='dem-choice-109'>Electric</label>
			</li>
<li>
<input type='radio' id='dem-choice-110' value='110' name='dem_poll_23' />
					<label for='dem-choice-110'>More than one</label>
			</li>
<li>
<input type='radio' id='dem-choice-111' value='111' name='dem_poll_23' />
					<label for='dem-choice-111'>Wood</label>
			</li>
</ul>
<input type='hidden' name='dem_poll_id' value='23' />
<input type='hidden' name='dem_action' value='vote' />
<input type='submit' class='dem-vote-button' value='Vote' />
			<a href='/blog/feed/?dem_action=view&amp;dem_poll_id=23' onclick='return dem_getVotes("http://birdhouse.org/blog/wp-content/plugins/democracy/democracy.php?dem_action=view&amp;dem_poll_id=23", this)' rel='nofollow' class='dem-vote-link'>View Results</a><br />
		</form>
</p></div>
</p></div>
<p>Here&#8217;s a pretty good side-by-side <a href="http://www.chow.com/stories/11087">comparison chart</a>, though it conveniently skips the environmental factors.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/04/18/gas-vs-charcoal/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>I&#8217;m a Hacker</title>
		<link>http://birdhouse.org/blog/2009/04/15/im-a-hacker/</link>
		<comments>http://birdhouse.org/blog/2009/04/15/im-a-hacker/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 15:15:47 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3296</guid>
		<description><![CDATA[The unfortunate but sometimes hilarious side-effect of having the last name &#8220;Hacker&#8221; &#8212; occasional emails like this one.
Email: queen5050pil@ymail.com
Message:
pls are you a hacker, if yes pls can you get for me cc with the balance and ATM pin visa and master cards or can you hack into any bank system mostly nigerian banks, pls reply [...]]]></description>
			<content:encoded><![CDATA[<p>The unfortunate but sometimes hilarious side-effect of having the last name &#8220;Hacker&#8221; &#8212; occasional emails like this one.</p>
<p><code>Email: queen5050pil@ymail.com<br />
Message:<br />
pls are you a hacker, if yes pls can you get for me cc with the balance and ATM pin visa and master cards or can you hack into any bank system mostly nigerian banks, pls reply asap thanks.</code></p>
<p>Srsly.</p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/04/15/im-a-hacker/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Magical Deer</title>
		<link>http://birdhouse.org/blog/2009/04/14/magical-deer/</link>
		<comments>http://birdhouse.org/blog/2009/04/14/magical-deer/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 02:28:45 +0000</pubDate>
		<dc:creator>shacker</dc:creator>
				<category><![CDATA[Out there]]></category>

		<guid isPermaLink="false">http://birdhouse.org/blog/?p=3293</guid>
		<description><![CDATA[No reason&#8230; just wonderful.

]]></description>
			<content:encoded><![CDATA[<p>No reason&#8230; just wonderful.</p>
<p><img class="alignnone size-full wp-image-3294" title="magical_deer" src="http://birdhouse.org/blog/wp-content/uploads/2009/04/magical_deer.gif" alt="magical_deer" width="400" height="314" /></p>
]]></content:encoded>
			<wfw:commentRss>http://birdhouse.org/blog/2009/04/14/magical-deer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
