<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Bloodpact Blogging</title>
	<link>http://www.egometry.com/bloodpact/</link>
	<language>en</language>
	<description>Bloodpact Blogging - http://www.egometry.com/bloodpact/</description>

<item>
	<title>Joshua McKenty: Come to Switzerland and Save the World (with Software)</title>
	<guid>http://www.cognition.ca/?p=227</guid>
	<link>http://feedproxy.google.com/~r/cognition/~3/N23GmPz7ELQ/come-to-switzerland-and-save-the-world-with-software.html</link>
	<description>&lt;div class=&quot;wp-caption alignright&quot;&gt;&lt;img class=&quot; &quot; title=&quot;Zurich, on the River&quot; src=&quot;http://farm5.static.flickr.com/4080/4921841668_fffa770998_d.jpg&quot; alt=&quot;Zurich on the River&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The view from the office&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;EDIT: Feel free to contact me by twitter DM as well: &lt;a href=&quot;http://twitter.com/jmckenty&quot;&gt;http://twitter.com/jmckenty&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As most of you have by now figured out from my FourSquare stream, I&amp;#8217;ve been spending a fair bit of time in Europe. In fact, I&amp;#8217;ve taken a sabbatical from NASA to work on the &lt;a href=&quot;http://globalquakemodel.org&quot;&gt;Global Earthquake Model&lt;/a&gt;. This international project is headquartered in Pavia, Italy, with the bulk of the development team in Zurich, Switzerland, at the &lt;a href=&quot;http://en.wikipedia.org/wiki/ETH_Zurich&quot;&gt;ETH university&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m helping to reboot the project. In fact, we&amp;#8217;re changing everything &amp;#8211; language (from exclusively Java to mostly Python), methodology (from a traditional waterfall approach to agile using Scrum), and development approach (continuous integration and test-driven development FTW).&lt;/p&gt;
&lt;p&gt;Everyone, by now, has heard about the Haiti earthquake. You know that more than 250,000 people (roughly 40% of the affected population) died. What you might not have realized, is that similar sized earthquakse in California routinely kill only dozens. The difference?&lt;/p&gt;
&lt;p&gt;Without earthquake models, you can&amp;#8217;t assess hazard.&lt;/p&gt;
&lt;p&gt;Without hazard assessment, you can&amp;#8217;t make building codes that are appropriate for the seismic risk.&lt;/p&gt;
&lt;p&gt;Without building codes (and the right kind of building reinforcement, even for traditional construction techniques), most of a large city turns into rubble.&lt;/p&gt;
&lt;p&gt;Without software, people die.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a quote from our &lt;a href=&quot;http://www.globalquakemodel.org/system/files/SED_GEM-Software_Engineer.pdf&quot;&gt;job posting&lt;/a&gt; (full link at http://www.globalquakemodel.org/system/files/SED_GEM-Software_Engineer.pdf):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;GEM, the Global Earthquake Model, is a non-profit, international effort to tackle the understanding of earthquake risk worldwide. In parallel with our scientific and diplomatic efforts, we are developing a unique, open-source software system that computes all aspects of earthquake hazard, risk, and impact. This is high-performance, scientific computing at its finest. And you could be a part of it.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re looking for only the best and brightest, regardless of where you currently are in the world, to come to Zurich and join a small, tight-knit team of engineers, scientists, and software developers. If you&amp;#8217;ve got the aptitude and attitude, we&amp;#8217;ll train you in the rest.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That&amp;#8217;s right &amp;#8211; we&amp;#8217;re writing open-source software to save lives. Who&amp;#8217;s with me?&lt;/p&gt;
&lt;span class=&quot;akst_link&quot;&gt;&lt;a href=&quot;http://www.cognition.ca/?p=227&amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot; id=&quot;akst_link_227&quot; class=&quot;akst_share_link&quot;&gt;Share This&lt;/a&gt;
&lt;/span&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=N23GmPz7ELQ:oqx9s8JmSrA:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=N23GmPz7ELQ:oqx9s8JmSrA:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?i=N23GmPz7ELQ:oqx9s8JmSrA:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=N23GmPz7ELQ:oqx9s8JmSrA:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/cognition/~4/N23GmPz7ELQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 24 Aug 2010 00:29:45 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: At Least Interview (or: How I Ended Up at IMVU)</title>
	<guid>http://chadaustin.me/?p=1588</guid>
	<link>http://chadaustin.me/2010/08/at-least-interview-or-how-i-ended-up-at-imvu/</link>
	<description>&lt;p&gt;Recent conversations have pointed out my career philosophy isn&amp;#8217;t as obvious as I thought.  Thus, I&amp;#8217;d like to share the story of how I joined IMVU and what it means to me and to those I interview.&lt;/p&gt;

&lt;h2&gt;Why Won&amp;#8217;t You Interview?&lt;/h2&gt;

&lt;p&gt;You wouldn&amp;#8217;t believe the number of times I&amp;#8217;ve tried and failed to get somebody to take a weekend and fly out to IMVU for an interview.  I don&amp;#8217;t understand: we&amp;#8217;ll happily pay you and your significant other to spend a vacation in San Francisco for the small price of a day&amp;#8217;s interview.&lt;/p&gt;

&lt;p&gt;There are three possible outcomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We make you an offer and you accept.&lt;/li&gt;
&lt;li&gt;We make you an offer and you decline.&lt;/li&gt;
&lt;li&gt;We don&amp;#8217;t make you an offer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What&amp;#8217;s the worst that could happen?  Maybe you&amp;#8217;ll be forced to actually decide whether IMVU is the right home for you.  Maybe IMVU won&amp;#8217;t be a fit and you&amp;#8217;ll feel a little worse for it.&lt;/p&gt;

&lt;p&gt;Either way you&amp;#8217;ll have a better sense of yourself and maybe you&amp;#8217;ll have stumbled upon a more fulfilling life.  Plus you&amp;#8217;ll have a free vacation!&lt;/p&gt;

&lt;h2&gt;I Could Have Joined IMVU 9 Months Earlier&lt;/h2&gt;

&lt;p&gt;I was halfway through my graduate degree at Iowa State, implementing a &lt;a href=&quot;http://chadaustin.me/hci_portfolio/&quot;&gt;functional GPU language&lt;/a&gt;.  I figured I was headed towards a job working on concurrent languages at Microsoft Research or something.  Indeed, that would have been fine!  I&amp;#8217;m still glad concurrent programming languages aren&amp;#8217;t a solved a problem &amp;#8211; I can still fantasize about someday contributing to the field.&lt;/p&gt;

&lt;p&gt;On July 2nd, 2004 (my birthday!), a guy named Eric Ries e-mails me out of the blue &amp;#8220;Are you the same Chad Austin from the boost and cal3d mailing lists?  Interested in some contract work?&amp;#8221;  He was working on some wack AOL Instant Messenger add-on that used BitTorrent as its installer and had a hideous website, so I wasn&amp;#8217;t terribly interested.  He persisted, and by GDC 2005, he convinced me to come interview.&lt;/p&gt;

&lt;p&gt;Once I met the founding team, I came to a few conclusions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;IMVU&amp;#8217;s founders were &lt;em&gt;smart&lt;/em&gt;.  I&amp;#8217;d be silly not to work with them.&lt;/li&gt;
&lt;li&gt;Coming from graduate school, I didn&amp;#8217;t expect much of a salary, so I could take a bunch of stock in exchange.&lt;/li&gt;
&lt;li&gt;If IMVU succeeded, win!&lt;/li&gt;
&lt;li&gt;If IMVU failed, at least I&amp;#8217;d learn a lot.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wasn&amp;#8217;t super excited about the product at first, but IMVU&amp;#8217;s founders convinced me to give them a shot, and it was definitely the right decision.&lt;/p&gt;

&lt;h2&gt;How I &amp;#8220;Sell&amp;#8221; to Candidates&lt;/h2&gt;

&lt;p&gt;When I interview candidates, I truly believe that IMVU is a great opportunity.  If the candidate is hesitant about committing to such a huge life change, I understand.  Moving across the country and taking a new job is a gigantic personal decision, and I can&amp;#8217;t make that decision for them.&lt;/p&gt;

&lt;p&gt;I never aggressively push IMVU, but I do my best to provide the data necessary to make the right decision.  &amp;#8220;I&amp;#8217;ve been here a while.  What information do you need to know whether IMVU is right for you?&amp;#8221;  I like to believe honesty is as effective as aggressive salesmanship.  :)&lt;/p&gt;

&lt;h2&gt;What This Means&lt;/h2&gt;

&lt;p&gt;I heartily endorse the &lt;a href=&quot;http://techcrunch.com/2009/08/05/other-companies-should-have-to-read-this-internal-netflix-presentation/&quot;&gt;philosophy espoused by NetFlix&lt;/a&gt;: periodically reconsider your place in the world.  I&amp;#8217;d be a hypocrite if I said otherwise.&lt;/p&gt;

&lt;p&gt;That said, I think our culture overvalues salary.  Money is but one (uncorrelated?) component of our motivation.  Since humans are notoriously bad at predicting what makes us happy, it&amp;#8217;s critical that we weigh facets such as personal freedom, your colleagues, social context, future opportunities, and how your work fits into your personal narrative.&lt;/p&gt;

&lt;p&gt;We once tried to hire a frighteningly smart man away from Google.  He interviewed but declined our generous offer, saying that his entire social life was tied into Google.  In hindsight, the sacrifice we asked of him is clear, and I respect his decision.&lt;/p&gt;

&lt;p&gt;In short, stay open-minded, but consciously consider what makes you happy.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/okZQ12A3NwE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 17 Aug 2010 08:51:43 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: svn: DB_VERSION_MISMATCH: Database environment version mismatch</title>
	<guid>http://www.egometry.com/?p=957</guid>
	<link>http://www.egometry.com/gruedorf/svn-db_version_mismatch-database-environment-version-mismatch/</link>
	<description>&lt;h2&gt;&amp;#8230;or Part 2 of &lt;a href=&quot;http://www.egometry.com/tech/could-not-open-the-requested-svn-filesystem/&quot; target=&quot;_blank&quot;&gt;&amp;#8220;Could not open the requested SVN filesystem&amp;#8221;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two years ago I ran into a problem with my SVN filesystem and got &amp;#8220;Could not open the requested SVN filesystem&amp;#8221; as the front-end error.&lt;/p&gt;
&lt;p&gt;This appears to be an annoying catch-all error for &amp;#8220;shit is broken with your SVN, dawg.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Last time, it was because I had SVNPath defined in my apache&amp;#8217;s httpd.conf file instead of SVNParentPath (when I had many repos in the same root directory.)  This time I did not have that problem, but I did have &lt;i&gt;the same error message&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;That is annoying.&lt;/p&gt;
&lt;p&gt;After several dead-ends, the vital kernel of information came from &lt;a href=&quot;http://mrooney.blogspot.com&quot; target=&quot;_blank&quot;&gt;Mr. Mike Rooney&amp;#8217;s&lt;/a&gt; suggestion to go to the host server itself and run:&lt;/p&gt;
&lt;pre&gt;
sudo svn ls file:///path/to/local/repo
&lt;/pre&gt;

&lt;p&gt;The two important parts here are that I&amp;#8217;m trying to access the bjorked repo from the local filesystem, so the webdav layer isn&amp;#8217;t being retarded at me and giving me the same enigmatic error message.  The second important part here is that I&amp;#8217;m running sudo to get past possible permission problems.&lt;/p&gt;
&lt;p&gt;That command produced the following output:&lt;/p&gt;
&lt;pre&gt;
$ sudo svn ls file:///path/to/local/repo/
svn: Unable to open an ra_local session to URL
svn: Unable to open repository 'file:///path/to/local/repo/'
svn: Berkeley DB error for filesystem '/path/to/local/repo/db' while opening environment:

svn: DB_VERSION_MISMATCH: Database environment version mismatch
svn: bdb: Program version 4.6 doesn't match environment version 4.4
&lt;/pre&gt;

&lt;p&gt;At this point, I used the tried and true google-the-unique-error-message technique.  After googling &amp;#8220;svn: DB_VERSION_MISMATCH: Database environment version mismatch&amp;#8221; (including the quotation marks for an exact search), I found &lt;a href=&quot;http://www.hermann-uwe.de/taxonomy/term/50&quot; target=&quot;_blank&quot;&gt;this blog post&lt;/a&gt; that solved my problem.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the punchline:&lt;/p&gt;
&lt;pre&gt;
$ cd /path/to/myrepo/db
$ db4.4_checkpoint -1
$ db4.4_recover
$ db4.4_archive
$ svnlook youngest ..
$ db4.6_archive -d
&lt;/pre&gt;

&lt;h2&gt;BUT&amp;#8230;&lt;/h2&gt;
&lt;p&gt;The double-punchline that screwed me for a while was the fact that the berekley db utils for 4.4 were unavailable via apt-get in modern times.  Thankfully, long-time &lt;a href=&quot;http://surreality.us&quot; target=&quot;_blank&quot;&gt;systems-administration bad-ass Ted Reed&lt;/a&gt; was here to suggest the following set of commands: &lt;/p&gt;
&lt;pre&gt;
$ wget http://mirrors.kernel.org/ubuntu/pool/universe/d/db4.4/libdb4.4_4.4.20-12_i386.deb
$ wget http://mirrors.kernel.org/ubuntu/pool/universe/d/db4.4/db4.4-util_4.4.20-12_i386.deb
$ dpkg -i libdb4.4_4.4.20-12_i386.deb
$ dpkg -i db4.4-util_4.4.20-12_i386.deb
&lt;/pre&gt;
&lt;p&gt;All of these commands (run as root or through sudo) grab the neccesary files from arcane places and got them installed.  After that, the previous blog post&amp;#8217;s wisdom could be applied.  From there, I was a chmod, a chgrp, and a chown away from actually being able to access my old repository again.
&lt;/p&gt;
&lt;p&gt;Of course, this was about 10 hours after where I expected to grab my old repo&amp;#8217;s contents&amp;#8230;&lt;/p&gt;</description>
	<pubDate>Sun, 15 Aug 2010 05:58:20 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: How to find debian apt-get packages and/or the right source?</title>
	<guid>http://www.egometry.com/?p=953</guid>
	<link>http://www.egometry.com/tech/how-to-find-debian-apt-get-packages-andor-the-right-source/</link>
	<description>&lt;p&gt;Ask http://packages.debian.org/&lt;/p&gt;
&lt;p&gt;Specifically the searchbox partway down the page under &amp;#8220;Search package directories&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Yeah, hat&amp;#8217;s about it.&lt;/p&gt;</description>
	<pubDate>Sun, 15 Aug 2010 02:29:49 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: How do you balance Immediate and Meta?</title>
	<guid>http://chadaustin.me/?p=1583</guid>
	<link>http://chadaustin.me/2010/07/how-do-you-balance-immediate-and-meta/</link>
	<description>&lt;p&gt;I like to split work into two types, Immediate and Meta, which I define as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Immediate&lt;/strong&gt;: work that moves us closer to an immediate goal.  Examples: bug fixes, development of a feature in a software application&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meta&lt;/strong&gt;: work that improves or changes how we perform Immediate work.  Examples: planning, refactoring, employee training, development of programming languages, and communication between teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clearly you cannot focus entirely on one or the other.  If we focused entirely on immediate work, we would all be programming in assembly language with no communication between engineers.  On the other hand, if we spent all of our time planning or writing better programming languages, we&amp;#8217;d never sell any product.&lt;/p&gt;

&lt;p&gt;Customers directly pay for the results of Immediate work and indirectly how fast you can deliver it.&lt;/p&gt;

&lt;p&gt;Meta is tooling and process.  ROI determines your investment in Meta.  At the conception of a startup, you don&amp;#8217;t know your business model or market, so investing in tooling is probably foolhardy.  You can&amp;#8217;t afford new programming languages or side innovations, so get &amp;#8216;er done.&lt;/p&gt;

&lt;p&gt;However, successfully raising funds changes that equation.  With a longer horizon, investing in your iteration loop and tools begins to make sense.  It seems Meta ROI is, roughly, &lt;code&gt;ExpectedImmediateTime * ImprovementFactor / CostOfImprovement&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, Meta work applies to itself.  Complex systems are like a dark cave &amp;#8212; every step down a path illuminates further steps.  You can also think of this effect as &amp;#8220;leveling up&amp;#8221;, like in a video game.  If your team begins Test-Driven Development or Continuous Deployment early, it will begin to see further improvements, compounding the benefits.  Process improvement has exponential return (as any Singularitarian is quick to mention).&lt;/p&gt;

&lt;p&gt;So how can you balance these types of work?  Let&amp;#8217;s discuss several approaches:&lt;/p&gt;

&lt;h3&gt;Start 100% Immediate and Asymptotically Approach 100% Meta&lt;/h3&gt;

&lt;p&gt;Upon learning to program, students invariably have the attitude &amp;#8220;How do I quickly solve the problem at hand?&amp;#8221;  After witnessing the limits of that attitude as their non-trivial programs collapse under their own complexity, their attitude shifts to &amp;#8220;How can I make programming easier?&amp;#8221;  From this you see such rarely-fruitful projects as new operating systems and programming languages.&lt;/p&gt;

&lt;p&gt;(This is the story of my life&amp;#8230;  I haven&amp;#8217;t finished writing a single game since I learned a language powerful enough to metaprogram.)&lt;/p&gt;

&lt;h3&gt;Always Balance 50% Immediate and 50% Meta&lt;/h3&gt;

&lt;p&gt;It seems like there should be an optimal balance of process improvement and immediate value creation.  Maybe that&amp;#8217;s true in the long run, but, in my experience, we punctuate work with process improvement.  Intel has its &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel_Tick-Tock&quot;&gt;Tick Tock&lt;/a&gt; approach.  IMVU periodically makes comparitively large investments in build processes, separated by periods of smooth execution.  Students go to school for part of the year &amp;#8212; process improvement &amp;#8212; and work in the summers or co-ops.  (However, I&amp;#8217;d argue that applying tick tock more directly to education would be beneficial: a year of school and a year of work.  That&amp;#8217;s another blog post.)&lt;/p&gt;

&lt;h3&gt;Nintendo&amp;#8217;s &amp;#8220;Spiral&amp;#8221; Analogy&lt;/h3&gt;

&lt;p&gt;If Nintendo focused entirely on immediate results, they would end up in a death spiral: financial pressure reduces available time, limited time reduces quality, poor quality causes lower game sales, and low game sales increases financial pressure.&lt;/p&gt;

&lt;p&gt;If you have the latitude to pay attention to process improvement, you will instead follow an &amp;#8220;Upward Spiral&amp;#8221;.  Quality and innovation drive sales, giving you more time to spend on quality and innovation.&lt;/p&gt;

&lt;h3&gt;I Don&amp;#8217;t Have the Answer&lt;/h3&gt;

&lt;p&gt;How do &lt;em&gt;you&lt;/em&gt; balance Immediate and Meta?  Please comment &amp;#8211; I&amp;#8217;d love to hear your thoughts.&lt;/p&gt;

&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/7BdV0-gJqQU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 30 Jul 2010 07:55:25 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: Extracting Color and Transparency from Flash</title>
	<guid>http://chadaustin.me/?p=1575</guid>
	<link>http://chadaustin.me/2010/07/extracting-color-and-transparency-from-flash/</link>
	<description>&lt;p&gt;The original source of this post is at the &lt;a href=&quot;http://engineering.imvu.com/2010/07/29/extracting-color-and-transparency-from-flash-2/&quot;&gt;IMVU engineering blog&lt;/a&gt;.  &lt;a href=&quot;http://engineering.imvu.com&quot;&gt;Subscribe now!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For clarity, I slightly oversimplified my previous discussion on &lt;a href=&quot;http://chadaustin.me/2010/07/efficiently-rendering-flash-in-a-3d-scene/&quot;&gt;efficiently rendering Flash in a 3D scene&lt;/a&gt;.  The sticky bit is extracting transparency information from the Flash framebuffer so we can  composite the overlay into the scene.&lt;/p&gt;

&lt;p&gt;Flash does not give you direct access to its framebuffer.  It does, with IViewObject::Draw, allow you to composite the Flash framebuffer onto a DIB section of your choice.&lt;/p&gt;

&lt;p&gt;Remembering your &lt;a href=&quot;http://keithp.com/~keithp/porterduff/p253-porter.pdf&quot;&gt;Porter-Duff&lt;/a&gt;, composition of source over dest is:&lt;/p&gt;

&lt;pre&gt;Color = SourceColor * SourceAlpha + DestColor * (1 - SourceAlpha)&lt;/pre&gt;

&lt;p&gt;If the source color is premultiplied, you get:&lt;/p&gt;

&lt;pre&gt;Color = SourceColor + DestColor * (1 - SourceAlpha)&lt;/pre&gt;

&lt;p&gt;Assuming we want premultiplied color and alpha from Flash for efficient rendering in the 3D scene, applying the above requires solving for FlashAlpha and FlashColor:&lt;/p&gt;

&lt;pre&gt;
RenderedColor = FlashColor * FlashAlpha + DestColor * (1 - FlashAlpha)

RenderedColor = FlashColor * FlashAlpha + DestColor - DestColor * FlashAlpha

RenderedColor - DestColor = FlashColor * FlashAlpha - DestColor * FlashAlpha

RenderedColor - DestColor = FlashAlpha * (FlashColor - DestColor)

FlashAlpha = (RenderedColor - DestColor) / (FlashColor - DestColor)
&lt;/pre&gt;

&lt;p&gt;If FlashColor and DestColor are equal, then FlashAlpha is undefined.  Intuitively, this makes sense.  If you render a translucent black SWF on a black background, you can&amp;#8217;t know the transparency data because all of the pixels are still black.  This doesn&amp;#8217;t matter, as I&amp;#8217;ll show in a moment.&lt;/p&gt;

&lt;p&gt;FlashColor is trivial:&lt;/p&gt;

&lt;pre&gt;
RenderedColor = FlashColor * FlashAlpha + DestColor * (1 - FlashAlpha)

RenderedColor - DestColor * (1 - FlashAlpha) = FlashColor * FlashAlpha

FlashColor = (RenderedColor - DestColor * (1 - FlashAlpha)) / FlashAlpha
&lt;/pre&gt;

&lt;p&gt;FlashColor is undefined if FlashAlpha is 0.  Transparency has no color.&lt;/p&gt;

&lt;p&gt;What do these equations give us?  We know RenderedColor, since it&amp;#8217;s the result of calling IViewObject::Draw.  We have control over DestColor, since we configure the DIB Flash is drawn atop.  What happens if we set DestColor to black (0)?&lt;/p&gt;

&lt;pre&gt;FlashColor = (RenderedColorOnBlack) / FlashAlpha&lt;/pre&gt;

&lt;p&gt;What happens if we set it to white (1)?&lt;/p&gt;

&lt;pre&gt;FlashColor = (RenderedColorOnWhite - (1 - FlashAlpha)) / FlashAlpha&lt;/pre&gt;

&lt;p&gt;Now we&amp;#8217;re getting somewhere!  Since FlashColor and FlashAlpha are constant, we can define a relationship between FlashAlpha and RenderedColorOnBlack and RenderedColorOnWhite:&lt;/p&gt;

&lt;pre&gt;
(RenderedColorOnBlack) / FlashAlpha = (RenderedColorOnWhite - (1 - FlashAlpha)) / FlashAlpha

RenderedColorOnBlack = RenderedColorOnWhite - 1 + FlashAlpha

FlashAlpha = RenderedColorOnBlack - RenderedColorOnWhite + 1

FlashAlpha = RenderedColorOnWhite - RenderedColorOnBlack
&lt;/pre&gt;

&lt;p&gt;So all we have to do is render the SWF on a white background and a black background and subtract the two to extract the alpha channel.&lt;/p&gt;

&lt;p&gt;Now what about color?  Just plug the calculated FlashAlpha into the following when rendering on black.&lt;/p&gt;

&lt;pre&gt;
FlashColor = (RenderedColor - DestColor * (1 - FlashAlpha)) / FlashAlpha

FlashColor = RenderedColorOnBlack / FlashAlpha
&lt;/pre&gt;

&lt;p&gt;Since we want premultiplied alpha:&lt;/p&gt;

&lt;pre&gt;FlashColor = RenderedColorOnBlack&lt;/pre&gt;

&lt;p&gt;Now that we know FlashColor and FlashAlpha for the overlay, we can copy it into a texture and render the scene!&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/SNfnRCYyL1E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 29 Jul 2010 21:14:08 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: Efficiently Rendering Flash in a 3D Scene</title>
	<guid>http://chadaustin.me/?p=1561</guid>
	<link>http://chadaustin.me/2010/07/efficiently-rendering-flash-in-a-3d-scene/</link>
	<description>&lt;p&gt;The original source of this post is at the &lt;a href=&quot;http://engineering.imvu.com/2010/07/29/efficiently-rendering-flash-in-a-3d-scene/&quot;&gt;IMVU engineering blog&lt;/a&gt;.  &lt;a href=&quot;http://engineering.imvu.com&quot;&gt;Subscribe now!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://chadaustin.me/2010/07/how-to-embed-flash-into-your-3d-application/&quot;&gt;Last time&lt;/a&gt;, I talked about how to embed Flash into your desktop application, for UI flexibility and development speed.  This time, I&amp;#8217;ll discuss efficient rendering into a 3D scene.&lt;/p&gt;

&lt;h2&gt;Rendering Flash as a 3D Overlay (The Naive Way)&lt;/h2&gt;

&lt;p&gt;At first blush, rendering Flash on top of a 3D scene sounds easy.  Every frame:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd183494(VS.85).aspx&quot;&gt;DIB section&lt;/a&gt; the size of your 3D viewport&lt;/li&gt;
&lt;li&gt;Render Flash into the DIB section with &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms688655(VS.85).aspx&quot;&gt;IViewObject::Draw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Copy the DIB section into an &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb205909(VS.85).aspx&quot;&gt;IDirect3DTexture9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Render the texture on the top of the scene&lt;/li&gt;
&lt;/ol&gt;

&lt;div id=&quot;attachment_1562&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://aegisknight.org/wp-uploads/Flash-Rendering.png&quot;&gt;&lt;img src=&quot;http://aegisknight.org/wp-uploads/Flash-Rendering.png&quot; alt=&quot;&quot; title=&quot;Naive Flash Rendering&quot; width=&quot;247&quot; height=&quot;524&quot; class=&quot;size-full wp-image-1562&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Naive Flash Rendering&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Ta da!  But your frame rate dropped to 2 frames per second?  Ouch.  It turns out this implementation is horribly slow.  There are a couple reasons.&lt;/p&gt;

&lt;p&gt;First, asking the Adobe flash player to render into a DIB isn&amp;#8217;t a cheap operation.  In our measurements, drawing even a simple SWF takes on the order of 10 milliseconds.  Since most UI doesn&amp;#8217;t animate every frame, we should be able to cache the captured framebuffer.&lt;/p&gt;

&lt;p&gt;Second, main memory and graphics memory are on different components in your computer.  You want to avoid wasting time and bus traffic by unnecessarily copying data from the CPU to the GPU every frame.  If only the lower-right corner of a SWF changes, we should limit our memory copies to that region.&lt;/p&gt;

&lt;p&gt;Third, modern GPUs are fast, but not everyone has them.  Let&amp;#8217;s say you have a giant mostly-empty SWF and want to render it on top of your 3D scene.  On slower GPUs, it would be ideal if you could limit your texture draws to the region of the screen that are non-transparent.&lt;/p&gt;

&lt;h2&gt;Rendering Flash as a 3D Overlay (The Fast Way)&lt;/h2&gt;

&lt;p&gt;Disclaimer: I can&amp;#8217;t take credit for these algorithms.  They were jointly developed over years by many smart engineers at IMVU.&lt;/p&gt;

&lt;p&gt;First, let&amp;#8217;s reduce an embedded Flash player to its principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flash exposes an IShockwaveFlash [link] interface through which you can load and play movies.&lt;/li&gt;
&lt;li&gt;Flash maintains its own frame buffer.  You can read these pixels with IViewObject::Draw.&lt;/li&gt;
&lt;li&gt;When a SWF updates regions of the frame buffer, it notifies you through IOleInPlaceSiteWindowless::InvalidateRect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, we&amp;#8217;d like the Flash overlay system to fit within these performance constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each SWF is rendered over the entire window.  For example, implementing a ball that bounces around the screen or a draggable UI component should not require any special IMVU APIs.&lt;/li&gt;
&lt;li&gt;If a SWF is not animating, we do not copy its pixels to the GPU every frame.&lt;/li&gt;
&lt;li&gt;We do not render the overlay in transparent regions.  That is, if no Flash content is visible, rendering is free.&lt;/li&gt;
&lt;li&gt;Memory consumption (ignoring memory used by individual SWFs) for the overlay usage is O(framebuffer), not O(framebuffer * SWFs).  That is, loading three SWFs should not require allocation of three screen-sized textures.&lt;/li&gt;
&lt;li&gt;If Flash notifies of multiple changed regions per frame, only call IViewObject::Draw once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without further ado, let&amp;#8217;s look at the fast algorithm:&lt;/p&gt;

&lt;div id=&quot;attachment_1564&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://aegisknight.org/wp-uploads/Fast-Flash-Rendering.png&quot;&gt;&lt;img src=&quot;http://aegisknight.org/wp-uploads/Fast-Flash-Rendering.png&quot; alt=&quot;&quot; title=&quot;Fast Flash Rendering&quot; width=&quot;563&quot; height=&quot;808&quot; class=&quot;size-full wp-image-1564&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Fast Flash Rendering&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Flash notifies us of visual changes via IOleInPlaceSiteWindowless::InvalidateRect.  We take any updated rectangles and add them to a per-frame dirty region.  When it&amp;#8217;s time to render a frame, there are four possibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The dirty region is empty and the opaque region is empty.  This case is basically free, because nothing need be drawn.&lt;/li&gt;

&lt;li&gt;The dirty region is empty and the opaque region is nonempty.  In this case, we just need to render our cached textures for the non-opaque regions of the screen.  This case is the most common.  Since a video memory blit is fast, there&amp;#8217;s not much we could do to further speed it up.&lt;/li&gt;

&lt;li&gt;The dirty region is nonempty.  We must IViewObject::Draw into our Overlay DIB, with one tricky bit.  Since we&amp;#8217;re only storing one overlay texture, we need to render each loaded Flash overlay SWF into the DIB, not just the one that changed.  Imagine an animating SWF underneath another translucent SWF.  The top SWF must be composited with the bottom SWF&amp;#8217;s updates.  After rendering each SWF, we scan the updated DIB for a minimalish opaque region.  Why not just render the dirty region?  Imagine a SWF with a bouncing ball.  If we naively rendered every dirty rectangle, eventually we&amp;#8217;d be rendering the entire screen.  Scanning for minimal opaque regions enables recalculation of what&amp;#8217;s actually visible.&lt;/li&gt;

&lt;li&gt;The dirty region is nonempty, but the updated pixels are all transparent.  If this occurs, we no longer need to render anything at all until Flash content reappears.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This algorithm has proven efficient.  It supports multiple overlapping SWFs while minimizing memory consumption and CPU/GPU draw calls per frame.  Until recently, we used Flash for several of our UI components, giving us a standard toolchain and a great deal of flexibility.  Flash was the bridge that took us from the dark ages of C++ UI code to UI on which we could actually iterate.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/RrSakCTGQII&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 29 Jul 2010 16:49:38 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: How to Embed Flash Into Your 3D Application</title>
	<guid>http://chadaustin.me/?p=1550</guid>
	<link>http://chadaustin.me/2010/07/how-to-embed-flash-into-your-3d-application/</link>
	<description>&lt;p&gt;The original source of this post is at the &lt;a href=&quot;http://engineering.imvu.com/2010/07/29/how-to-embed-flash-into-your-3d-application/&quot;&gt;IMVU engineering blog&lt;/a&gt;.  &lt;a href=&quot;http://engineering.imvu.com&quot;&gt;Subscribe now!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;[I wrote this post last year when IMVU still used Flash for a significant portion of our UI. Even though we now embed Gecko, I believe embedding Flash is still valuable.]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Writing user interfaces is hard.  Writing usable interfaces is harder.  Yet, the design of your interface &lt;em&gt;is your product&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Products are living entities.  They always want to grow, adapting to their users as users adapt to them.  In that light, why build your user interface in a static technology like C++ or Java?  It won&amp;#8217;t be perfect the first time you build it, so prepare for change.&lt;/p&gt;

&lt;p&gt;IMVU employs two technologies for rapidly iterating on and refining our client UIs: Flash and Gecko/HTML.  Sure, integrating these technologies has a sizable up-front cost, but the iteration speed they provide easily pays for them.  Rapid iteration has some obvious benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;reduces development cost&lt;/li&gt;
&lt;li&gt;reduces time to market&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;and some less-obvious benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;better product/market fit: when you can change your UI, you will.&lt;/li&gt;
&lt;li&gt;improved product quality: little details distinguish mediocre products from great products.  make changing details cheap and your Pinto will become a Cadillac.&lt;/li&gt;
&lt;li&gt;improved morale: both engineers and designers &lt;em&gt;love&lt;/em&gt; watching their creations appear on the screen right before them. it&amp;#8217;s why so many programmers create games!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I will show you how integrating Flash into a 3D application is easier than it sounds.&lt;/p&gt;


&lt;h2&gt;Should I use Adobe Flash or Scaleform GFx?&lt;/h2&gt;

&lt;p&gt;The two most common Flash implementations are Adobe&amp;#8217;s ActiveX control (which has a &lt;a href=&quot;http://www.adobe.com/products/player_census/flashplayer/version_penetration.html&quot;&gt;97% installed base!&lt;/a&gt;) and Scaleform GFx.&lt;/p&gt;

&lt;p&gt;Adobe&amp;#8217;s control has perfect compatibility with their tool chain (go figure!) but is closed-source and good luck getting help from Adobe.&lt;/p&gt;

&lt;p&gt;Scaleform GFx is an alternate implementation of Flash designed to be embedded in 3D applications, but, last I checked, is not efficient on machines without GPUs.  (Disclaimer: this information is two years old, so I encourage you to make your own evaluation.)&lt;/p&gt;

&lt;p&gt;IMVU chose to embed Adobe&amp;#8217;s player.&lt;/p&gt;

&lt;h2&gt;Deploying the Flash Runtime&lt;/h2&gt;

&lt;p&gt;Assuming you&amp;#8217;re using Adobe&amp;#8217;s Flash player, how will you deploy their runtime?  Well, given Flash&amp;#8217;s install base, you can get away with loading the Flash player already installed on the user&amp;#8217;s computer.  If they don&amp;#8217;t have Flash, just require that they install it from your download page.  Simple and easy.&lt;/p&gt;

&lt;p&gt;Down the road, when Flash version incompatibilities and that last 5% of your possible market becomes important, you can request &lt;a href=&quot;http://www.adobe.com/licensing/&quot;&gt;permission from Adobe&lt;/a&gt; to deploy the Flash player with your application.&lt;/p&gt;

&lt;h2&gt;Displaying SWFs&lt;/h2&gt;

&lt;p&gt;IMVU displays Flash in two contexts: traditional HWND windows and 2D overlays atop the 3D scene.&lt;/p&gt;

&lt;div id=&quot;attachment_1551&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://aegisknight.org/wp-uploads/imvu_flash_window.png&quot;&gt;&lt;img src=&quot;http://aegisknight.org/wp-uploads/imvu_flash_window.png&quot; alt=&quot;&quot; title=&quot;IMVU Flash Window&quot; width=&quot;679&quot; height=&quot;353&quot; class=&quot;size-full wp-image-1551&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;IMVU Flash Window&lt;/p&gt;&lt;/div&gt;

&lt;div id=&quot;attachment_1568&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://aegisknight.org/wp-uploads/imvu_flash_overlay1.png&quot;&gt;&lt;img src=&quot;http://aegisknight.org/wp-uploads/imvu_flash_overlay1.png&quot; alt=&quot;&quot; title=&quot;IMVU Flash Overlay&quot; width=&quot;475&quot; height=&quot;566&quot; class=&quot;size-full wp-image-1568&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;IMVU Flash Overlay&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;If you want to have something up and running in a day, buy &lt;a href=&quot;http://www.f-in-box.com/&quot;&gt;f_in_box&lt;/a&gt;.  Besides its awesome name, it&amp;#8217;s cheap, comes with source code, and the support forums are fantastic.  It&amp;#8217;s a perfect way to bootstrap.  After a weekend of playing with f_in_box, Dusty and I had a YouTube video playing in a texture on top of our 3D scene.&lt;/p&gt;

&lt;p&gt;Once you run into f_in_box&amp;#8217;s limitations, you can use the IShockwaveFlash and IOleInPlaceObjectWindowless COM interfaces directly.  See Igor Makarav&amp;#8217;s &lt;a href=&quot;http://www.codeproject.com/KB/COM/flashcontrol.aspx?fid=321012&quot;&gt;excellent tutorial&lt;/a&gt; and CFlashWnd class.&lt;/p&gt;

&lt;h2&gt;Rendering Flash as an HWND&lt;/h2&gt;

&lt;p&gt;For top-level UI elements use f_in_box or CFlashWnd directly.  They&amp;#8217;re perfectly suited for this.  Seriously, it&amp;#8217;s just a few lines of code.  Look at their samples and go.&lt;/p&gt;

&lt;h2&gt;Rendering Flash as a 3D Overlay&lt;/h2&gt;

&lt;p&gt;Rendering Flash to a 3D window gets a bit tricky&amp;#8230;  Wait for Part 2 of this post!&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/i6CHF0f3130&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 29 Jul 2010 16:46:58 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: Turducken For Real Men Is Made Of Death</title>
	<guid>http://www.egometry.com/?p=944</guid>
	<link>http://www.egometry.com/egometry/turducken-for-real-men-is-made-of-death/</link>
	<description>&lt;pre&gt;
&amp;lt;Hyptosis&amp;gt; Nice, there was a copper head asleep ontop of the turnoff to our 
           main water vein.
&amp;lt;Hyptosis&amp;gt; And, ontop of the snake
&amp;lt;Hyptosis&amp;gt; I shit you not
&amp;lt;Hyptosis&amp;gt; A fucking Brown Recluse
&amp;lt;Hyptosis&amp;gt; It was like a poison cocktail
&amp;lt;gru&amp;gt; Did you kill them both?
&amp;lt;gru&amp;gt; Or did you decide &quot;Nah, no need to turn off the water.&quot;
&amp;lt;Hyptosis&amp;gt; I flick the spider out of the way and tossed the snake into the grass
&amp;lt;Hyptosis&amp;gt; Then turned the water off
&amp;lt;chrisa&amp;gt; I feel like you live in &quot;MANmerica&quot; and I live in some pansy ass
         settlement within it&lt;/pre&gt;
&lt;p&gt;
&lt;p&gt;From &lt;a href=&quot;irc://irc.lunarnet.org:4444/#sancho&quot; target=&quot;_new&quot;&gt;#sancho&lt;/a&gt; on &lt;a href=&quot;irc://irc.lunarnet.org:4444/#sancho&quot; target=&quot;_new&quot;&gt;irc.lunarnet.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lorestrome.com/&quot; target=&quot;_new&quot;&gt;Hyptosis&amp;#8217;s homepage&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://nullcode.org/&quot; target=&quot;_new&quot;&gt;chrisa&amp;#8217;s homepage&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 28 Jul 2010 20:12:21 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: Book Review: E-Myth Revisited</title>
	<guid>http://chadaustin.me/?p=1547</guid>
	<link>http://chadaustin.me/2010/07/book-review-e-myth-revisited/</link>
	<description>&lt;p&gt;E-Myth Revisited was written in 1995, but its concepts date to 1977, when Michael Gerber founded E-Myth Worldwide.  I found the book somewhat dated in light of agile development&amp;#8217;s popularity and the rise of the Internet.  To ensure that I understand Gerber&amp;#8217;s arguments, I will summarize them here.  To be clear, these are my interpretations of the book&amp;#8217;s arguments.  My understanding may not match Gerber&amp;#8217;s.  For concision&amp;#8217;s sake, I will write this post as if they are my opinions, even though I may not agree with what I&amp;#8217;m writing.&lt;/p&gt;

&lt;h2&gt;Part 1. The E-Myth and the American Small Business&lt;/h2&gt;

&lt;pre&gt;
Chapter 1 - The Entrepreneurial Myth
Chapter 2 - The Entrepreneur, the Manager, and the Technician
Chapter 3 - Infancy: The Technician's Phase
Chapter 4 - Adolescence: Getting Some Help
Chapter 5 - Beyond the Comfort Zone
Chapter 6 - Maturity and the Entrepreneurial Perspective
&lt;/pre&gt;

&lt;p&gt;Gerber&amp;#8217;s E-Myth refers to the way we envision and glorify the creation of a successful business: a person with a great idea and inhuman talents works alone against all odds, gaining significant wealth.&lt;/p&gt;

&lt;p&gt;(Before we get much further, I want to clarify one point that confused me.  The term E-Myth has nothing to do with electronics or the internet; the E in E-Myth means Entrepreneur.)&lt;/p&gt;

&lt;p&gt;Gerber&amp;#8217;s small business research uncovered an important trend: most small business are created because a technically-proficient employee decides they can do a better job alone, making more money with more freedom.  However, creating a business requires three personalities: Entrepreneur, Technician, and Manager.  I find it helpful to think instead of dominant desires: Vision, Implementation, and Structure.  Thus, small business entrepreneurs focus too much on Implementation and too little on Vision and Structure.&lt;/p&gt;

&lt;p&gt;Further, assuming the business takes off, it will require a sound structure to grow.  Businesses must be able to absorb new employees and continue to function in the case that the founder sells the business or moves on.  If a Technician founds a business and focuses overly on Implementation, she will never have the time to consider how to hire effective employees that share her vision.  She also won&amp;#8217;t consider the reason she&amp;#8217;s in business to begin with &amp;#8211; why would customers choose her business over another?  What does she want to do with her life?&lt;/p&gt;

&lt;p&gt;This leads into Part 2.&lt;/p&gt;

&lt;h2&gt;Part 2. The Turn-Key Revolution: A New View of Business&lt;/h2&gt;

&lt;pre&gt;
Chapter 7 - The Turn-Key Revolution
Chapter 8 - The Franchise Prototype
Chapter 9 - Working &lt;em&gt;on&lt;/em&gt; Your Business, Not &lt;em&gt;in&lt;/em&gt; It
&lt;/pre&gt;

&lt;p&gt;An entrepreneur&amp;#8217;s business is a product.  Unless she wants to work on the same company for the rest of her life, she will eventually want to sell (privately or publicly) or franchise.  The success of franchises in America demonstrates a model by which a business can be created and scaled without enormous capital or risk.  To found a business, consider your talents and desires.  Then ask how you can enact those desires by teaching your talents to potentially-unskilled employees.  For example, franchising your business requires documenting every tiny detail: dress codes, cleanliness standards, and the words used to greet customers.  You set the vision and your documentation conveys it.  Without explicit documentation, your vision will not survive implementation by others.  (Again, I&amp;#8217;d like to mention that I may not necessarily agree with Gerber.)&lt;/p&gt;

&lt;p&gt;By explicitly working &lt;em&gt;on&lt;/em&gt; your business instead of &lt;em&gt;in&lt;/em&gt; it, you are forced to consider these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do customers interact with my business?&lt;/li&gt;
&lt;li&gt;How do my customers interact with my products?&lt;/li&gt;
&lt;li&gt;How do I hire employees to carry out my vision?&lt;/li&gt;
&lt;li&gt;What happens if I sell my business?&lt;/li&gt;
&lt;li&gt;How does starting a business further my life goals?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Part 3: Building a Small Business That Works&lt;/h2&gt;

&lt;pre&gt;
Chapter 10 - The Business Development Process
Chapter 11 - Your Business Development Program
Chapter 12 - Your Primary Aim
Chapter 13 - Your Strategic Objective
Chapter 14 - Your Organizational Strategy
Chapter 15 - Your Management Strategy
Chapter 16 - Your People Strategy
Chapter 17 - Your Marketing Strategy
Chapter 18 - Your Systems Strategy
Chapter 19 - A Letter to Sarah
&lt;/pre&gt;

&lt;p&gt;
Before you begin, why are you in business?  What do you hope to achieve?  Document these desires in a Life Plan so you know what you&amp;#8217;re working towards and can measure overall progress.
&lt;/p&gt;

&lt;p&gt;How much money will I need?  How much time?  What do I hope to learn?  How do I want people to think about me?  How much money will I make?  Creating a business requires vision, but you require vision for yourself, too.&lt;/p&gt;

&lt;p&gt;Before you hire anybody, write an organizational chart for your company as envisioned years down the road.  Even though there&amp;#8217;s only one employee at the outset, the chart may contain dozens of roles.  However, the chart gives you a framework into which to hire new employees and clarify said roles&amp;#8217; responsibilities and success metrics.&lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t predicate your business on hiring the best employees possible.  You won&amp;#8217;t be able to find or afford them.  Instead, build a System for incorporating and training employees into your vision.&lt;/p&gt;

&lt;p&gt;Know that customers are irrational.  Know that they&amp;#8217;re not buying your product &amp;#8211; they&amp;#8217;re buying the experience your business offers.  Know that nothing escapes your customers&amp;#8217; senses.  Aspects as minor as colors, font sizes, the shapes of logos, wording, and timing can affect your customers&amp;#8217; purchasing decisions.  Customer needs may be real, but customers purchase based on perceived needs.&lt;/p&gt;

&lt;p&gt;Measure and understand your customers&amp;#8217; demographics and psychographics.  This data will help you make good decisions.&lt;/p&gt;

&lt;p&gt;Marketing is the most important function of your business.  Marketing is the reason businesses exist.  Success requires meeting the perceived needs of a market, which means the market must know you exist.  How will you obtain customers?  How will you satisfy them?  How will you convince them to return?&lt;/p&gt;


&lt;h2&gt;Chad&amp;#8217;s Perspective&lt;/h2&gt;

E-Myth Revisited&amp;#8217;s biggest takeaways are:

&lt;ol&gt;
&lt;li&gt;Creating a business around your technical proficiencies is a mistake.  Instead consider your customers.&lt;/li&gt;
&lt;li&gt;Think of a business as a product that can sustain itself and provide you with the income or freedom you desire.  You are your first customer.&lt;/li&gt;
&lt;li&gt;Your comfort zone is too small to start a business &amp;#8211; don&amp;#8217;t let that stop you!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, the book&amp;#8217;s age shows.  E-Myth Revisited fails entirely to address the possibility that your business is in the wrong market and thus cannot survive.  In today&amp;#8217;s environment, I think it&amp;#8217;s more important to rapidly build a business that fails quickly or reacts to customer desires and market pressures.&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t empathize with the notion that you can&amp;#8217;t hire the best employees.  Gerber too often uses the example of McDonald&amp;#8217;s.  While McDonald&amp;#8217;s is wildly successful in its market, small internet-based business can scale with just a few highly-skilled individuals.  That said, it&amp;#8217;s worth asking up front what level of talent you require to scale your business.  I wish the book had focused more on non-food-service industries.&lt;/p&gt;

&lt;p&gt;If you have any startup experience at all, I would avoid E-Myth Revisited.  If you&amp;#8217;re inexperienced and you&amp;#8217;re considering creating a business, it&amp;#8217;s a fine introduction to the issues you&amp;#8217;ll face.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/JIyc4QenMuE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 26 Jul 2010 06:12:09 +0000</pubDate>
</item>
<item>
	<title>Joshua McKenty: OpenStack  Where were going, and why</title>
	<guid>http://www.cognition.ca/?p=225</guid>
	<link>http://feedproxy.google.com/~r/cognition/~3/b9IIhxfLW-U/openstack-nasa-nebula-joshua-mckenty-and-history.html</link>
	<description>&lt;p&gt;I didn&amp;#8217;t sleep much on Sunday night. By the time I headed for bed, the news was out, and the twittubes were flooded.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Desperate to get sleep, but I&amp;#8217;m terrified to wake up to 1,000 new bug reports. It&amp;#8217;s like streaking the quad, but with code. #openstack &lt;a title=&quot;Twitter Status for @jmckenty&quot; href=&quot;http://twitter.com/jmckenty/status/18898545442&quot;&gt;@jmckenty&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;There was &lt;a title=&quot;NASA Chief Cloud Architect discusses Open Stack&quot; href=&quot;http://bartongeorge.net/2010/07/16/nasa%E2%80%99s-chief-cloud-architect-talks%C2%A0openstack/&quot;&gt;a video up from an interview&lt;/a&gt; I had given the week before.&lt;/p&gt;
&lt;p&gt;There were over 100 developers camped out in the &lt;a href=&quot;irc://irc.freenode.net/#openstack&quot;&gt;#openstack&lt;/a&gt; channel, asking probing questions. Most of them were politely worded versions of: &amp;#8220;What the hell were you thinking?&amp;#8221;&lt;/p&gt;
&lt;p&gt;Patches started coming in. Then &lt;a href=&quot;http://bits.blogs.nytimes.com/2010/07/20/the-recipe-for-clouds-goes-open-source/&quot;&gt;a New York Times blog post&lt;/a&gt;. More bug reports. More patches. More press.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignleft&quot;&gt;&lt;img title=&quot;Original Nebula Logo&quot; src=&quot;http://www.cloudbook.net/images/companies/nebula_logo.jpg&quot; alt=&quot;Original Nebula Logo&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Original Nebula Logo&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I&amp;#8217;d love to say that we shared a moment of solidarity as a team, toasted ourselves, and wrote more code. But truthfully, half of the NASA Nebula team were on a red-eye flight to DC, to run another set of training workshops for new Nebula users. Some were holed up with the legal teams, trying to figure out how to take the Nova example (brute-force software release) and use it to reshape NASA&amp;#8217;s open source software release policy. Vish was bravely manning IRC, answering the flood of questions.&lt;/p&gt;
&lt;p&gt;And in a classic case of nostalgia, I started thinking back over the crazy history of this &amp;#8220;thing&amp;#8221; that has had more names, than developers.&lt;/p&gt;
&lt;p&gt;The code name of the &amp;#8220;compute&amp;#8221; component in Open Stack is called &amp;#8220;Nova&amp;#8221;. While, if you had the appropriate access to NASA internal systems, you could find early references to the &amp;#8220;Novae&amp;#8221; task in Nebula development (which was originally the PXE and Puppet-based configuration management system we used for deploying Nebula to physical hardware), the earliest public record of nova is this:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/rocketqueen/3596245017/&quot; title=&quot;NASA nebula bonding lunch by rr0cketqueen, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2462/3596245017_69dc40455f.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;NASA nebula bonding lunch - We Are the Nova&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8220;NASA Nebula Bonding Lunch &amp;#8211; We Are the Nova&amp;#8221;&lt;/p&gt;
&lt;p&gt;Which is possibly one of the worst photos of me on the internet. C&amp;#8217;est la via.&lt;/p&gt;
&lt;p&gt;While in Austin, Texas last week, at the first Open Stack Developer&amp;#8217;s Summit, I had an opportunity to give a brief presentation about NASA Nebula &amp;#8211; why we were in the Cloud business, some of the history that led us to this point, etc. While I never prepare slide decks to be standalone (I prefer to use them as audio-visual aids to the substance of the event, which is obviously paying attention to &lt;em&gt;me&lt;/em&gt;), you can have a look at the whole thing:&lt;/p&gt;
&lt;div id=&quot;__ss_4796103&quot;&gt;&lt;strong&gt;&lt;a title=&quot;The Space Penguin Odyssey&quot; href=&quot;http://www.slideshare.net/joshuamckenty/the-space-penguin-odyssey&quot;&gt;The Space Penguin Odyssey&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;It was based, loosely, on an internal memo I sent a while back to some members of the Nebula team (excerpts below):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;There are, literally, a ton of people on the Nebula team now. Which is awesome. But it also mean there are dozens of you that I&amp;#8217;ve never had a chance to interact with personally, who may have missed a lot of our early (ancient) discussions about WHY we&amp;#8217;re all working so damn hard.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;It&amp;#8217;s not about the money.&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;Which is to say, Nebula is not, primarily, about cost recovery. It&amp;#8217;s not (mostly) about saving money, for missions, projects, or the Agency at large.&lt;/div&gt;
&lt;div&gt;And on the flip side, we&amp;#8217;re not DOING this just because it&amp;#8217;s our job. Nebula is not the place for &amp;#8220;work to rule&amp;#8221; &amp;#8211; if you don&amp;#8217;t wake up every morning with a burning desire to get to your keyboard and roll the Nebula ball forward, then there are honestly better places and projects for you to be working on.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;It&amp;#8217;s not about being on the &amp;#8220;cutting edge&lt;/strong&gt;&amp;#8220;.&lt;/div&gt;
&lt;div&gt;We get a ton of press on Nebula, most of it excited over how &lt;em&gt;innovative NASA&lt;/em&gt;has become, how we&amp;#8217;re embracing new technologies, how we&amp;#8217;re leading the government forward. And all of that is great &amp;#8211; but that&amp;#8217;s not why we&amp;#8217;re doing it. This is not innovation, for the sake of innovation.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;It&amp;#8217;s about the Science.&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;I haven&amp;#8217;t really been at NASA long enough to have a good grasp of its long and illustrious history. So in the same fashion that I get away with practicing Computer Science without having formally &lt;em&gt;studied &lt;/em&gt;it, I have to work from first principles. In this case, the first principles are a happy little document titled, the &amp;#8220;Space Act&amp;#8221; (Specifically the Declaration of Policy and Purpose, section 102):&lt;/div&gt;
&lt;div&gt;Sec. 102.  (a) The Congress hereby declares that it is the policy of the United States that activities in space should be devoted to &lt;strong&gt;peaceful purposes for the benefit of all mankind.&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;(7) Cooperation by the United States with other nations and groups of nations in work done pursuant to this Act and in the peaceful application of the results thereof;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;(8) The most effective utilization of the scientific and engineering resources of the United States, with close cooperation among all interested agencies of the United States in order to avoid unnecessary duplication of effort, facilities, and equipment;&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;So I&amp;#8217;d just like to point out that the &lt;em&gt;mission statement of the Agency, includes specifically section 102(d)(8) &amp;#8211; &lt;/em&gt;is to cooperate with other agencies in order to make effective utilization of scientific and engineering resources. AKA&amp;#8230; Cloud Computing.&lt;/div&gt;
&lt;div&gt;Open Source, by which I mean participation in an open source &lt;em&gt;process&lt;/em&gt;, as well as the release of source code under an open license, is an activity NASA can partake of under section 102(a). It is &lt;em&gt;way more meaningful&lt;/em&gt; than most of the rest of what we&amp;#8217;re doing.&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;Some of you may have noticed that I&amp;#8217;m no longer involved with NASA Nebula in a full-time capacity. They don&amp;#8217;t need me anymore. But I&amp;#8217;ve still got a two-year roadmap of challenges that I&amp;#8217;d love to see Open Stack address, and I&amp;#8217;ll be posting that to &lt;a href=&quot;https://blueprints.launchpad.net/openstack&quot;&gt;Launchpad&lt;/a&gt; and the &lt;a href=&quot;http://wiki.openstack.org/&quot;&gt;Open Stack wiki&lt;/a&gt; just as soon as I can.&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;We ain&amp;#8217;t done yet.&lt;/strong&gt;&lt;/div&gt;
&lt;span class=&quot;akst_link&quot;&gt;&lt;a href=&quot;http://www.cognition.ca/?p=225&amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot; id=&quot;akst_link_225&quot; class=&quot;akst_share_link&quot;&gt;Share This&lt;/a&gt;
&lt;/span&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=b9IIhxfLW-U:k4CIKSFB1_E:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=b9IIhxfLW-U:k4CIKSFB1_E:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?i=b9IIhxfLW-U:k4CIKSFB1_E:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=b9IIhxfLW-U:k4CIKSFB1_E:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/cognition/~4/b9IIhxfLW-U&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 22 Jul 2010 06:34:51 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: Experiments in rendering a Tiled Map in javascript/html</title>
	<guid>http://www.egometry.com/?p=936</guid>
	<link>http://www.egometry.com/gruedorf/experiments-in-rendering-a-tiled-map-in-javascripthtml/</link>
	<description>&lt;div&gt;
&lt;p&gt;&lt;a title=&quot;Sophia Game mk1.&quot; rel=&quot;lightbox[pics936]&quot; href=&quot;http://www.egometry.com/i/2010/07/SophiaGame.png&quot;&gt;&lt;img class=&quot;attachment wp-att-937 alignleft&quot; src=&quot;http://www.egometry.com/i/2010/07/SophiaGame.thumbnail.png&quot; alt=&quot;Sophia Game mk1.&quot; width=&quot;192&quot; height=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;	&lt;span&gt;&lt;br /&gt;
&lt;br /&gt;Sophia&amp;#8217;s first tiles!&lt;br /&gt;Embrace the pixels!&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Sophia has been chomping at the bit to make more games.  Since it&amp;#8217;s been going on &lt;a href=&quot;http://www.egometry.com/gruedorf/the-magical-meaning-of-m/&quot;&gt;two years since I last flexed my gamemaking muscles fully&lt;/a&gt;, and since I rather adore Sophia, I&amp;#8217;ve been chasing this rainbow.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been ever more intrigued by the idea of a pure html/javascript game engine of late, and have started taking existing, established tools (like mapeditor.org&amp;#8217;s tiled) and putting them into the browser.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.egometry.com/files/gruedorf_challenge/070/&quot; target=&quot;_new&quot;&gt;Here&amp;#8217;s the result: (currently firefox-only)&lt;/a&gt;. To fully get the pleasure, inspect elements on this example in firebug.&lt;/p&gt;
&lt;p&gt;The idea is simple: html/js has affordances baked-in to parse xml documents.  This can handle traditional map data.  css sprite-sheet techniques have been used for years now, which directly mimic old tilset/vsp-style assets.  Combine the two&amp;#8230; and you have a effen map.  Throw in browser optimizations for visible/hidden elements, and we should have a relatively cheap rendering method.&lt;/p&gt;
&lt;p&gt;The above test is fairly simple: one 30&amp;#215;30 map, one layer.  It loads instantaneously fast.  It&amp;#8217;s tiles are a single gif sized 304&amp;#215;144.  Fairly economical.  I decided to shove each of these boys into a div for now and use the background-image css spriting technique to get a &amp;#8220;purist&amp;#8221; tiling implementation going.&lt;/p&gt;
&lt;p&gt;I opted against using canvas for now because I wanted to see how far I could get without it.  So far so good, but I&amp;#8217;ve not yet really stressed the system.  The next jump will be to take some of my epic 6-layer maps from SotS, translate them into xml, and see how they fair in the browser.&lt;/p&gt;
&lt;p&gt;Of the code I wrote, I suppose the &amp;#8220;sauce&amp;#8221; was a fairly common offset calculation.  Although this sort of endeavor may not be so common in the modern age, it&amp;#8217;s pretty commonplace to those of us who labored in 320&amp;#215;240 back in DOS.  Get off my lawn.&lt;/p&gt;
&lt;pre&gt;
var tileset = {
    tileWidth: 16,
    tileHeight: 16,
    setWidth: 304,
    setHeight: 144,

    getCoordsfromIdx : function( idx ) {
        var idx = parseInt(idx);
        idx--; //tmx is 1-based, not 0-based.  We need to sub 1 to get to a proper mapping.
        //idx--;

        var perRow = this.setWidth / this.tileWidth;

        var x = idx % perRow;
        var y = (idx / perRow);

        return [
            -(parseInt(x)*parseInt(this.tileWidth)),
            -(parseInt(y)*parseInt(this.tileHeight))
        ];
    }
}
&lt;/pre&gt;
&lt;p&gt;This is converting a single tile index into two coordinates for the renderer to consume.  For instance, if you want tile 2, it takes a &amp;#8217;2&amp;#8242; at the top, does some maths, and tells you that tile 2&amp;#8242;s offset is 16 pixels in from the top-left corner, and 0 pixels down (ie, on the top row).  Some strange quirks of this code: I had to decrement the idx, because Tiled&amp;#8217;s xml format is 1-based, not 0 (ie, the first tile, the one at (0,0), is index 1, not index 0); and I negate the two numbers I return because the consumer of these coordinates is a css background-position style, and that&amp;#8217;s how they work.&lt;/p&gt;
&lt;p&gt;Also of note was a small hiccup when I uploaded this to my server.  My sandbox had no trouble serving a .tmx file as Content-Type: text/xml, but my big-boy server threw a conniption about it.  I didn&amp;#8217;t realize that was a problem until I threw some debugger statements into the code that &amp;#8220;should&amp;#8217;ve just worked&amp;#8221; and found that all of the proper stuff was in the responseText attribute, but responseXML was null.  So I renamed the mapfile to .xml on the server and everything worked fine.&lt;/p&gt;
&lt;p&gt;I guess next step, before trying to stress the system with a super macho map, is to figure out why this isn&amp;#8217;t working in Safari/Chrome/IE/Opera/Whatever&amp;#8230;&lt;/p&gt;</description>
	<pubDate>Fri, 09 Jul 2010 09:53:38 +0000</pubDate>
</item>
<item>
	<title>Chuck Rector: How to use YUI Slider</title>
	<guid>tag:blogger.com,1999:blog-3327768276254607141.post-4961418503040888572</guid>
	<link>http://choosetheforce.blogspot.com/2010/06/how-to-use-yui-slider.html</link>
	<description>&lt;h2&gt;Once upon a time...&lt;/h2&gt;&lt;p&gt;At &lt;a href=&quot;http://www.imvu.com/&quot;&gt;IMVU&lt;/a&gt;, we've come to rely heavily on &lt;a href=&quot;http://developer.yahoo.com/yui/&quot;&gt;YUI Library&lt;/a&gt;. We use it in the website for features such as the avatar card, the message widget, and the music store. It also plays a major supporting role in the user interface of our 3D client application (we embed &lt;a href=&quot;https://developer.mozilla.org/en/xulrunner&quot;&gt;XULRunner&lt;/a&gt;).&lt;/p&gt;
#examples { width: 440px; margin: 0; padding: 0; margin-left: auto; margin-right: auto; } #examples td { vertical-align: bottom; margin-right: 10px; }&lt;table id=&quot;examples&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/avatar_card.png&quot;&gt;&lt;img title=&quot;The avatar card&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/avatar_card_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/message_widget.png&quot;&gt;&lt;img title=&quot;The message widget&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/message_widget_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/music_store.png&quot;&gt;&lt;img title=&quot;The music store&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/music_store_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/3d_client.png&quot;&gt;&lt;img title=&quot;The 3D client&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/3d_client_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;a href=&quot;http://www.imvu.com/jobs/index_eng.php&quot;&gt;IMVU's agile atmosphere&lt;/a&gt; is such that the day we discover a new and cool technology can be the same day we ship product which includes that new and cool technology. As a result, we don't always RTFM. We learn by doing. We learn by failing. It's exhilarating, although sometimes the road is a bumpy one. &lt;a href=&quot;http://developer.yahoo.com/yui/slider/&quot;&gt;YUI's Slider component&lt;/a&gt; was one of the bumps along the way.&lt;/p&gt;

&lt;h2&gt;It's easy, right?&lt;/h2&gt;

&lt;p&gt;Our 3D application has a tabbed interface, not unlike all popular web browsers. Internally, we refer to these tabs as &lt;em&gt;modes&lt;/em&gt;. In our Settings mode, we needed a slider for adjusting the volume of voice chat. We chose YUI's Slider to satisfy that need:&lt;/p&gt;

#settings_mode_chat_volume { width: 200px; margin-left: auto; margin-right: auto; }&lt;div id=&quot;settings_mode_chat_volume&quot;&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/settings_mode_chat_volume.png&quot;&gt;&lt;img title=&quot;The settings mode chat volume slider&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/settings_mode_chat_volume_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;The code was simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div id=&quot;sliderbg&quot;&gt;
   &amp;lt;div id=&quot;sliderthumb&quot;&gt;&amp;lt;img src=&quot;thumb.png&quot; /&gt;&amp;lt;/div&gt;
&amp;lt;/div&gt;

YAHOO.widget.Slider.getHorizSlider(
   'sliderbg', 'sliderthumb', 0, 200
);&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, we found that the slider's thumb was always 20 pixels out of alignment! It fell too far off the left edge, the right edge, or didn't go far enough. The hacks and programming acrobatics that ensued in attempts to compensate were as far from simplicity as they were from sanity.&lt;/p&gt;

&lt;h2&gt;It's easy if you pay attention.&lt;/h2&gt;

&lt;p&gt;Fast forward a week or more later, and I decided to crack open the YUI Slider documentation. It took me less than five minutes of reading to realize exactly how we were &lt;a href=&quot;http://www.doingitwrong.com/&quot;&gt;doing it wrong&lt;/a&gt;. They key passage was this:&lt;/p&gt;

&lt;blockquote&gt;&quot;In typical implementations you will need to &lt;strong&gt;make the background width equal to the total number of pixels you want the slider to be able to move plus the width of the thumb&lt;/strong&gt; element.&quot;&lt;/blockquote&gt;

&lt;p&gt;It was accompanied by the following diagram:&lt;/p&gt;
#sliderlayout { width: 448px; margin-left: auto; margin-right: auto; }&lt;div id=&quot;sliderlayout&quot;&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2884316/IMVU/sliderlayout.png&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Who knows why the initial maximum value had been set to 200. Everyone who came after assumed it was correct. It's a nice and even number. How could it be wrong? We failed to consider the relevance of the source art's dimensions:&lt;/p&gt;
#voice_volume_art { width: 400px; margin: 0; padding: 0; margin-left: auto; margin-right: auto; } #voice_volume_art td { margin-right: 20px; } #voice_volume_background { width: 280px; } #voice_volume_thumb { width: 100px; }&lt;table id=&quot;voice_volume_art&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/voice_volume_background.png&quot;&gt;&lt;img id=&quot;voice_volume_background&quot; title=&quot;The voice volume background graphic&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/voice_volume_background.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://dl.dropbox.com/u/2884316/IMVU/voice_volume_thumb.png&quot;&gt;&lt;img id=&quot;voice_volume_thumb&quot; title=&quot;The voice volume thumb graphic&quot; src=&quot;http://dl.dropbox.com/u/2884316/IMVU/voice_volume_thumb.png&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The background was 237x24 and the thumb was 17x24. This of course meant that the maximum value we should have been using was 237 - 17 = &lt;strong&gt;2&lt;span&gt;20&lt;/span&gt;&lt;/strong&gt;. Suddenly a certain magic number wasn't so magical anymore.&lt;/p&gt;

&lt;h2&gt;Art isn't fartsy. It's important!&lt;/h2&gt;

&lt;p&gt;If you're mindful of the dimensions of your source art and the simple math described above, you'll have no problem using YUI's Slider component.&lt;/p&gt;

&lt;p&gt;Subsequent to this discovery, I re-cut our source art and removed the padding around the edges of our chat volume background and thumb art. This wasn't strictly necessary, but it allowed the use of a maximum value of 200. And 200 is such a nice and even number! I'm a software engineer. I have my reasons...&lt;/p&gt;

&lt;p&gt;Below are some examples of correct and incorrect maximum values for their associated background and thumb art. I also threw in something a little more interesting for fun. View the source for details.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://is.gd/cN5dc&quot;&gt;http://is.gd/cN5dc&lt;/a&gt;&lt;/p&gt;

iframe { width: 100%; border: 0; height: 350px; }
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3327768276254607141-4961418503040888572?l=choosetheforce.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 12 Jun 2010 22:40:00 +0000</pubDate>
	<author>noreply@blogger.com (卡车 Chuck)</author>
</item>
<item>
	<title>Chad Austin: More Thoughts on ibb</title>
	<guid>http://chadaustin.me/?p=1543</guid>
	<link>http://chadaustin.me/2010/06/more-thoughts-on-ibb/</link>
	<description>&lt;p&gt;There were some great comments on my &lt;a href=&quot;http://chadaustin.me/2010/03/your-version-control-and-build-systems-dont-scale-introducing-ibb/&quot;&gt;introduction to ibb&lt;/a&gt; and they&amp;#8217;re worthy of discussion.&lt;/p&gt;

&lt;h2&gt;On the Performance of ReadDirectoryChangesW&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://chadaustin.me/2010/03/your-version-control-and-build-systems-dont-scale-introducing-ibb/comment-page-1/#comment-21408&quot;&gt;Brandon Ehle&lt;/a&gt; is absolutely right when he says ReadDirectoryChangesW is not free.  In fact, many modern applications monitor directory trees for changes, so, on a fast disk such as my Intel SSD, &amp;#8220;svn up&amp;#8221; might quickly create and destroy thousands of zero-byte lockfiles.  When I have Visual Studio and ibb_server running, I have witnessed them peg a core each to handle the filesystem events.&lt;/p&gt;

&lt;p&gt;While filesystem monitors consumes a great deal of CPU in aggregate, the important metric to consider is latency.  That is, it doesn&amp;#8217;t actually matter that my CPU is pegged while I &amp;#8220;svn up&amp;#8221;: the factor limiting my efficiency is the sheer number of system calls to the OS.  Cores are cheap and getting cheaper, but &lt;a href=&quot;http://chadaustin.me/2009/02/latency-vs-throughput/&quot;&gt;latency in computing systems isn&amp;#8217;t improving&lt;/a&gt;.  Put another way, each ReadDirectoryChangesW adds a small constant amount of work to what is already an O(files) process: the root problem is that svn up needs to create and destroy thousands of lockfiles.  (I assume a small constant set of tools running at any given time.  Assigning one core per tool seems realistic enough.)&lt;/p&gt;

&lt;p&gt;Since common-case latency is the primary constraint we must optimize, converting O(n) to O(1) is a huge win.  O(n) to O(k*n) for some small constant k isn&amp;#8217;t as important.&lt;/p&gt;

&lt;p&gt;I might also argue that O(n) use cases should be eliminated if possible.  &amp;#8220;svn up&amp;#8221; already knows the changeset from the server &amp;#8211; if it knew the changeset on the client without locking and scanning every directory, it would become O(changeset + localchanges).&lt;/p&gt;

&lt;h2&gt;What if you stop ibb_server and rebuild?&lt;/h2&gt;

&lt;p&gt;Then the next build is O(n) like SCons or Make, but there&amp;#8217;s no reason it needs to be slower.  Build signatures should definitely be cached in a local database so subsequent builds merely require scanning all files in the DAG.  Recompiling from scratch upon every reboot would be a dealbreaker.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/71zT3BG1XqQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 12 Jun 2010 08:53:39 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: Scalable Build Systems: An Analysis of Tup</title>
	<guid>http://chadaustin.me/?p=1530</guid>
	<link>http://chadaustin.me/2010/06/scalable-build-systems-an-analysis-of-tup/</link>
	<description>&lt;p&gt;I previously argued that any tool whose running time is proportional with the number of files in a project &lt;a href=&quot;http://chadaustin.me/2010/03/your-version-control-and-build-systems-dont-scale-introducing-ibb/&quot;&gt;scales quadratically with time&lt;/a&gt;.  Bluem00 on &lt;a href=&quot;http://news.ycombinator.com/item?id=1167238&quot;&gt;Hacker News&lt;/a&gt; pointed me towards &lt;a href=&quot;http://gittup.org/tup/&quot;&gt;Tup&lt;/a&gt;, a scalable build system with goals similar to &lt;a href=&quot;http://github.com/chadaustin/ibb&quot;&gt;ibb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mike Shal, Tup&amp;#8217;s author, wrote &lt;a href=&quot;http://gittup.org/tup/build_system_rules_and_algorithms.pdf&quot;&gt;Build System Rules and Algorithms&lt;/a&gt;, formalizing the algorithmic deficiencies with existing build systems and describing Tup&amp;#8217;s implementation, a significant improvement over the status quo.  I would like to document my analysis of Tup and whether I think it replaces &lt;a href=&quot;http://github.com/chadaustin/ibb&quot;&gt;ibb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before we get started, I&amp;#8217;d like to thank Mike Shal for being receptive to my comments.  I sent him a draft of my analysis and his responses were thoughtful and complete.  With his permission, I have folded his thoughts into the discussion below.&lt;/p&gt;

&lt;p&gt;Is Tup suitable as a general-purpose build system?  Will it replace SCons or Jam or Make anytime soon?  Should I continue working on ibb?&lt;/p&gt;

&lt;p&gt;Remember our criteria for a scalable build system, one that enables test-driven development at arbitrary project sizes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O(1) no-op builds&lt;/li&gt;
&lt;li&gt;O(changes) incremental builds&lt;/li&gt;
&lt;li&gt;Accessible dependency DAG atop which a variety of tools can be built&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without further ado, my thoughts on Tup follow:&lt;/p&gt;

&lt;h2&gt;Syntax&lt;/h2&gt;

&lt;p&gt;Tup defines its own declarative syntax, similar to Make or Jam.  At first glance, the Tup syntax looks semantically equivalent to Make.  From the &lt;a href=&quot;http://gittup.org/tup/examples.html&quot;&gt;examples&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
: hello.c |&gt; gcc hello.c -o hello |&gt; hello
&lt;/pre&gt;

&lt;p&gt;Read the dependency graph from left to right:  hello.c is compiled by gcc into a hello executable.  Tup supports variable substitution and limited flow control.&lt;/p&gt;

&lt;p&gt;Build systems are inherently declarative, but I think Tup&amp;#8217;s syntax has two flaws:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inventing a new syntax unnecessarily slows adoption: by implementing GNU Make&amp;#8217;s syntax, Tup would be a huge drop-in improvement to existing build systems.&lt;/li&gt;
&lt;li&gt;Even though specifying dependency graphs is naturally declarative, I think a declarative syntax is a mistake.  Build systems are a first-class component of your software and your team&amp;#8217;s workflow.  You should be able to develop them in a well-known, high-level language such as Python or Ruby, especially since those languages come with rich libraries.  As an example, SCons gets this right: it&amp;#8217;s trivial for me to write CPU autodetection logic for parallel builds in a build script if that makes sense.  Or I can extend SCons&amp;#8217;s Node system to download source files from the web.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Implementation Language&lt;/h2&gt;

&lt;p&gt;Tup is 15,000 lines of C.  There&amp;#8217;s no inherent problem with C, but I do think a community-supported project is more likely to thrive in a faster and safer language, such as Python or Ruby.  Having worked with teams of engineers, it&amp;#8217;s clear that most engineers can safely work in Python with hardly any spin-up time.  I can&amp;#8217;t say the same of C.&lt;/p&gt;

&lt;p&gt;Git is an interesting case study: The core performance-sensitive data structures and algorithms are written in C, but many of its interesting features are written in Perl or sh, including git-stash, git-svn, and git-bisect.  Unlike Git, I claim Python and Ruby are plenty efficient for the entirety of a scalable build system.  Worst case, the dependency graph could live in C and everything else could stay in Python.&lt;/p&gt;

&lt;h2&gt;Scanning Implicit Dependencies&lt;/h2&gt;

&lt;p&gt;The Tup paper mentions offhand that it&amp;#8217;s trivial to monitor a compiler&amp;#8217;s file accesses and thus determine its true dependencies for generating a particular set of outputs.  The existing implementation uses a LD_PRELOAD shim to monitor all file accesses attempted by, say, gcc, and treats those as canonical input files.  Clever!&lt;/p&gt;

&lt;p&gt;This is a great example of lateral, scrappy thinking.  It has a couple huge advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No implicit dependencies (such as C++ header file includes) need be specified &amp;#8212; if all dependencies come from the command line or a file, Tup will know them all.&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s easy to implement.  Tup&amp;#8217;s ldpreload.c is a mere 500 lines.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And a few disadvantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Any realistic build system must treat Windows as a first-class citizen.  Perhaps, on Windows, Tup could use something like &lt;a href=&quot;http://research.microsoft.com/en-us/projects/detours/&quot;&gt;Detours&lt;/a&gt;. I&amp;#8217;ll have to investigate that.&lt;/li&gt;

&lt;li&gt;Intercepting system calls is reliable when the set of system calls is known and finite.  However, there&amp;#8217;s nothing stopping the OS vendor from adding &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa363853(VS.85).aspx&quot;&gt;new system calls&lt;/a&gt; that modify files.&lt;/li&gt;

&lt;li&gt;Incremental linking / external PDB files: these Visual C++ features both read and write the same file in one compile command.  SCons calls this a SideEffect: commands that share a SideEffect cannot parallelize.  A build system that does not support incremental linking or external symbols would face resistance among Visual C++ users.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And some open questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I haven&amp;#8217;t completely thought this through, but it may be important to support user-defined dependency scanners that run before command execution, enabling tools such as graph debugging.&lt;/li&gt;
&lt;li&gt;I don&amp;#8217;t have a realistic example, but imagine a compiler that reads spurious dependency changes from run to run; say, a compiler that only checks its license file on every other day.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stepping back, I think the core build system should not be responsible for dependency scanning.  By focusing on dependency graph semantics and leaving dependency scanning up to individual tools (which may or may not use LD_PRELOAD or similar techniques), a build system can generalize to uses beyond compiling software, as I mentioned in my previous blog post.&lt;/p&gt;

&lt;h2&gt;Dependency Graph&lt;/h2&gt;

&lt;p&gt;Tup&amp;#8217;s dependency DAG contains two types of nodes: Commands and Files.  Files depend on Commands and Commands depend on other Files.  I prefer Tup&amp;#8217;s design over SCons&amp;#8217;s DAG-edges-are-commands design for two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It simplifies the representation of multiple-input multiple-output commands.&lt;/li&gt;
&lt;li&gt;Some commands, such as &amp;#8220;run-test foo&amp;#8221; or &amp;#8220;search-regex some.*regex&amp;#8221; depend on source files but produce no files as output. Since they fit naturally into the build DAG, commands are a first-class concept.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Build Reliability&lt;/h2&gt;

&lt;p&gt;Tup, like SCons, places a huge emphasis on build reliability.  This is key and I couldn&amp;#8217;t agree more.  In the half-decade I&amp;#8217;ve used SCons, I can count the number of broken builds on one hand.  Sadly, many software developers are used to typing &amp;#8220;make clean&amp;#8221; or clicking &amp;#8220;full rebuild&amp;#8221; when something is weird.  What a huge source of waste!  Developers should trust the build system as much as their compiler, and the build system should go out of its way to help engineers specify complete and accurate dependencies.&lt;/p&gt;

&lt;p&gt;Reliable builds imply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Changes are tracked by file &lt;em&gt;contents&lt;/em&gt;, not timestamps.&lt;/li&gt;
&lt;li&gt;The dependency graph, including implicit dependencies such as header files and build commands, is complete and accurate by default.&lt;/li&gt;
&lt;li&gt;Compiler command lines are included in the DAG.  Put another way: if the command used to build a file changes, the file must be rebuilt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tup takes a strict functional approach and formalizes build state as a set of files and their contents.  (I would argue build state also includes file metadata such as file names and timestamps, at least if the compiler uses such information.)  If the build state does not change between invocations, then no work must be done.&lt;/p&gt;

&lt;p&gt;Tup even takes build reliability one step further than SCons:  If you rename a target file in the build script, Tup actually deletes the old built target before rebuilding the new one.  Thus, you will never have stale target executables lying around in your build tree.&lt;/p&gt;

&lt;p&gt;Nonetheless, there are situations where a project may choose to sacrifice absolute reliability for significant improvements in build speed, such as incremental linking discussed above.&lt;/p&gt;

&lt;h2&gt;Core vs. Community&lt;/h2&gt;

&lt;p&gt;A build system is a critical component of any software team&amp;#8217;s development process.  Since every team is different, it&amp;#8217;s essential that a build system is flexible and extensible.  SCons, for example, correctly chose to implement build scripts in a high-level language (Python) with a declarative API for specifying nodes and edges in the dependency graph.&lt;/p&gt;

&lt;p&gt;However, I think SCons did not succeed at separating its core engine from its community.  SCons tightly couples the underlying dependency graph with support for tools like Visual C++, gcc, and version control.  The frozen and documented SCons API is fairly high-level while the (interesting) internals are treated as private APIs.  It should be the opposite: a dependency graph is a narrow, stable, and general API.  By simplifying and documenting the DAG API, SCons could enable broader uses, such as unit test execution.&lt;/p&gt;

&lt;h2&gt;Configuration&lt;/h2&gt;

&lt;p&gt;Like Tup&amp;#8217;s author, I agree that build autoconfiguration (such as autoconf or SCons&amp;#8217;s Configure support) should not live in the core build system.  Autoconfiguration is simply an argument that build scripts should be specified in a general programming language and that the community should develop competing autoconfiguration systems.  If a particular autoconfiguration system succeeds in the marketplace, then, by all means, ship it with your build tool.  Either way, it shouldn&amp;#8217;t have access to any internal APIs.  Configuration mechanisms are highly environment-sensitive and are best maintained by the community anyway.&lt;/p&gt;

&lt;h2&gt;DAG post-process optimizations&lt;/h2&gt;

&lt;p&gt;Another argument for defining a build tool in a general-purpose language is to allow user-defined DAG optimizations and sort orders.  I can think of two such use cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visual C++ greatly improves compile times when multiple C++ files are specified on one command line.  In fact, the benefit of batched builds can exceed the benefit of PCH.  A DAG optimizer would search for a set of C++ source files that produce object files in the same directory and rewrite the individual command lines into one.&lt;/li&gt;

&lt;li&gt;When rapidly iterating, it would be valuable for a build system or test runner to sort such that the most-recently-failed compile or test runs first.  However, when hunting test interdependencies as part of a nightly build, you may want to shuffle test runs.  On machines with many cores but slow disks, you want to schedule expensive links as soon as possible to mitigate the risk that multiple will execute concurrently and thrash against your disk.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Tup is a significant improvement over the status quo, and I have personally confirmed its performance &amp;#8212; it&amp;#8217;s lightning fast and it scales to arbitrary project sizes.&lt;/p&gt;

&lt;p&gt;However, without out-of-the-box Windows support, a mainstream general-purpose language, and a model for community contribution, I don&amp;#8217;t see Tup rapidly gaining traction.  With the changes I suggest, it could certainly replace Make and perhaps change the way we iterate on software entirely.&lt;/p&gt;

&lt;p&gt;Next, I intend to analyze &lt;a href=&quot;http://code.google.com/p/prebake/&quot;&gt;prebake&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/540JNPByr5I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 10 Jun 2010 10:01:04 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: How to Make a DVD with the Flip UltraHD</title>
	<guid>http://chadaustin.me/?p=1524</guid>
	<link>http://chadaustin.me/2010/06/how-to-make-a-dvd-with-the-flip-ultrahd/</link>
	<description>&lt;p&gt;Now that my wife and I have a child, we make frequent use of our &lt;a href=&quot;http://www.theflip.com/en-us/Products/ultra.aspx#/home&quot;&gt;Flip UltraHD&lt;/a&gt; video camera.  Our intention is to film precious moments of our lives, burn physical DVDs, and mail them to our families strewn across the east coast and midwest.  Sounds old-fashioned, but it&amp;#8217;s convenient for our audience.&lt;/p&gt;

&lt;p&gt;I will explain DVD creation for Mac users and for Windows users.&lt;/p&gt;

&lt;h2&gt;Flip -&gt; DVD on a Mac&lt;/h2&gt;

&lt;p&gt;For those of you blessed with a recent Mac, creating a DVD from the Flip is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy MP4 files from Flip to your computer (not strictly necessary, though iDVD is much snappier if the videos are on your hard drive)&lt;/li&gt;
&lt;li&gt;Open iDVD, select Magic iDVD&lt;/li&gt;
&lt;li&gt;Rename your movies to reflect their contents (optional, but makes the DVD a little nicer)&lt;/li&gt;
&lt;li&gt;Drag movies into the iDVD window&lt;/li&gt;
&lt;li&gt;Create project&lt;/li&gt;
&lt;li&gt;Tweak title, button fonts, text&lt;/li&gt;
&lt;li&gt;Burn to disc image&lt;/li&gt;
&lt;li&gt;Use Disk Utility to burn as many copies as you want!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Flip -&gt; DVD on Windows Vista/7&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;First of all, Windows DVD Maker doesn&amp;#8217;t support Flip&amp;#8217;s MP4 files directly.  It will crash or hang if you try.&lt;/li&gt;
&lt;li&gt;Download the Adobe Flash CS4 trial&lt;/li&gt;
&lt;li&gt;Use Adobe Media Encoder to convert the Flip videos to AVI or some such.&lt;/li&gt;
&lt;li&gt;Add to Windows DVD Maker.&lt;/li&gt;
&lt;li&gt;Configure title and menus.&lt;/li&gt;
&lt;li&gt;Wait an evening for Windows DVD Maker to casually burn your DVD to disc.&lt;/li&gt;
&lt;li&gt;Frown because the audio and video are no longer synchronized.  Also the video is corrupted.&lt;/li&gt;
&lt;li&gt;Buy a Mac and use iDVD after all.&lt;/li&gt;
&lt;/ol&gt;

&lt;br /&gt;

&lt;p&gt;I wrote this post months ago but I was waiting to figure out how to create DVDs on Windows&amp;#8230;  At some point, it&amp;#8217;s worth simply buying a Mac Mini and using that instead.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/_mZEgEQU2ek&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 07 Jun 2010 08:12:21 +0000</pubDate>
</item>
<item>
	<title>Joshua McKenty: Launched NOVA  Apache-Licensed Cloud Computing, in Python</title>
	<guid>http://www.cognition.ca/2010/05/launched-nova-apache-licensed-cloud-computing-in-python.html</guid>
	<link>http://feedproxy.google.com/~r/cognition/~3/oSDImvVrjmw/launched-nova-apache-licensed-cloud-computing-in-python.html</link>
	<description>&lt;p&gt;It&amp;#8217;s live, it&amp;#8217;s buggy, it&amp;#8217;s beta.&lt;br /&gt;
Check it out:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://novacc.org&quot;&gt;http://novacc.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;From the website:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Nova is a cloud computing fabric controller (the main part of an &lt;a href=&quot;http://en.wikipedia.org/wiki/IaaS&quot; target=&quot;_blank&quot;&gt;IaaS&lt;/a&gt; system) built to match the popular AWS &lt;a href=&quot;http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/&quot; target=&quot;_blank&quot;&gt;EC2&lt;/a&gt; and &lt;a href=&quot;http://docs.amazonwebservices.com/AmazonS3/latest/API/&quot; target=&quot;_blank&quot;&gt;S3&lt;/a&gt; APIs. It is written in &lt;a href=&quot;http://python.org/&quot; target=&quot;_blank&quot;&gt;Python&lt;/a&gt;, using the &lt;a href=&quot;http://www.tornadoweb.org/&quot; target=&quot;_blank&quot;&gt;Tornado&lt;/a&gt;and &lt;a href=&quot;http://twistedmatrix.com/trac/wiki/TwistedProject&quot; target=&quot;_blank&quot;&gt;Twisted&lt;/a&gt; frameworks, and relies on the standard &lt;a href=&quot;http://www.amqp.org/confluence/display/AMQP/Advanced+Message+Queuing+Protocol&quot; target=&quot;_blank&quot;&gt;AMQP messaging protocol&lt;/a&gt;, and the &lt;a href=&quot;http://code.google.com/p/redis/&quot; target=&quot;_blank&quot;&gt;Redis&lt;/a&gt; distributed KVS.&lt;/p&gt;
&lt;p&gt;Nova is intended to be easy to extend, and adapt.&lt;/p&gt;&lt;/blockquote&gt;
&lt;span class=&quot;akst_link&quot;&gt;&lt;a href=&quot;http://www.cognition.ca/?p=222&amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot; id=&quot;akst_link_222&quot; class=&quot;akst_share_link&quot;&gt;Share This&lt;/a&gt;
&lt;/span&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=oSDImvVrjmw:mM-QmB59A_c:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=oSDImvVrjmw:mM-QmB59A_c:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?i=oSDImvVrjmw:mM-QmB59A_c:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/cognition?a=oSDImvVrjmw:mM-QmB59A_c:qj6IDK7rITs&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/cognition?d=qj6IDK7rITs&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/cognition/~4/oSDImvVrjmw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 28 May 2010 07:42:16 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Making a local web server public with localtunnel</title>
	<guid>http://blogrium.wordpress.com/?p=178</guid>
	<link></link>
	<description>These days it&amp;#8217;s fairly common to run a local environment for web development. Whether you&amp;#8217;re running Apache, Mongrel, or the App Engine SDK, we&amp;#8217;re all starting to see the benefits of having a production-like environment right there on your laptop so you can iteratively code and debug your app without deploying live, or even needing [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blogrium.wordpress.com&amp;blog=447831&amp;post=178&amp;subd=blogrium&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 11 May 2010 23:25:53 +0000</pubDate>
</item>
<item>
	<title>Michael Rooney: Is Intel the answer to Broadcom wireless problems?</title>
	<guid>tag:blogger.com,1999:blog-3369913276619133519.post-582733570029186482</guid>
	<link>http://feedproxy.google.com/~r/mrooney/~3/9xsVsfxZcfM/is-intel-answer-to-broadcom-wireless.html</link>
	<description>While I love my Dell XPS 1330 as an Ubuntu laptop, I've been growing quite tired of my Broadcom wireless card that came in it (I swore it had Intel wifi when I bought it). It requires downloading drivers to work (this can lead to a bit of a bootstrapping problem), and seems to frequently drop connections or have issues connecting.&lt;br /&gt;&lt;br /&gt;I'm assuming this is due to Broadcom's poor drivers, particularly 64-bit (I remember kernel panics and lack of WPA2 in the not-too-distant past), and was assuming an Intel card would clear my problems right up.&lt;br /&gt;&lt;br /&gt;Has anyone had problems with Broadcom and fixed them by switching to Intel? If so, could you offer any suggestions as to if I might want the Intel 4965, 5100, or 5300 card?&lt;br /&gt;&lt;br /&gt;Thanks, dear Ubuntu Planet and other readers!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3369913276619133519-582733570029186482?l=mrooney.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/mrooney/~4/9xsVsfxZcfM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 26 Apr 2010 22:41:51 +0000</pubDate>
	<author>noreply@blogger.com (Michael)</author>
</item>
<item>
	<title>Jeff Lindsay: SXSW Talk on WebHooks and the Evented Web</title>
	<guid>http://blog.webhooks.org/?p=206</guid>
	<link>http://blog.webhooks.org/2010/04/15/sxsw-talk-on-webhooks-and-the-evented-web/</link>
	<description>&lt;p&gt;I haven&amp;#8217;t been posting here lately, but lots of amazing things have been happening in the world of webhooks. At SXSW I gave my latest version of a talk to explain webhooks, and I went on to describe the greater &amp;#8220;evented web&amp;#8221; that they unleash. It also explains some of the motivation I have behind all this. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/webhooks.wordpress.com/206/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/webhooks.wordpress.com/206/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.webhooks.org&amp;blog=5379000&amp;post=206&amp;subd=webhooks&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 15 Apr 2010 18:32:22 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Be wrong to be right</title>
	<guid>http://progrium.livejournal.com/237131.html</guid>
	<link>http://progrium.livejournal.com/237131.html</link>
	<description>You can be right more often when you learn to admit you are wrong. &lt;br /&gt;&lt;br /&gt;If you're actually wrong but persist that you're right, you just remain wrong. Whereas if you admit to being wrong, you become right. You also learn from being wrong and therefore are that much more likely to be right in the future.&lt;br /&gt;&lt;br /&gt;It's perhaps counter-intuitive, but that's life. If you *really* care about being right, you'll admit to being wrong.</description>
	<pubDate>Tue, 23 Mar 2010 08:58:38 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: Your Version Control and Build Systems Dont Scale</title>
	<guid>http://chadaustin.me/?p=1508</guid>
	<link>http://chadaustin.me/2010/03/your-version-control-and-build-systems-dont-scale-introducing-ibb/</link>
	<description>&lt;p&gt;Let&amp;#8217;s spend a minute and talk about the performance of a tool you use every day: your build system.  For this purpose, they&amp;#8217;re all the same, so let&amp;#8217;s assume you use GNU Make.  For a no-op build, what is Make&amp;#8217;s running time?  You know, that O(N) stuff.&lt;/p&gt;

&lt;p&gt;If you said &lt;code&gt;O(Files)&lt;/code&gt;, you&amp;#8217;re right.  Every time you type &lt;code&gt;make&lt;/code&gt; and press enter, it scans every file in the project, looking for out-of-date sources.  That doesn&amp;#8217;t sound so bad.  Linear algorithms are good, right?&lt;/p&gt;

&lt;p&gt;Oh, but projects grow over time, typically in proportion with the number of engineers (even if some are &lt;a href=&quot;http://twitter.com/chadaustin/status/8623778614&quot;&gt;net&lt;/a&gt; &lt;a href=&quot;http://twitter.com/chadaustin/status/8624762041&quot;&gt;negative&lt;/a&gt;).  Since projects grow:&lt;/p&gt;

&lt;pre&gt;
O(Files) = O(Engineers * Time)
&lt;/pre&gt;

&lt;p&gt;Assuming you&amp;#8217;re successful, your team is probably growing too:&lt;/p&gt;

&lt;pre&gt;
O(Engineers) = O(Time)
&lt;/pre&gt;

&lt;p&gt;Applying some substitutions:&lt;/p&gt;

&lt;pre&gt;
O(Make) = O(Files) = O(Engineers * Time) = O(Time^2)
&lt;/pre&gt;

&lt;p&gt;A no-op make is &lt;em&gt;quadratic&lt;/em&gt; in the duration of the project?!&lt;/p&gt;

&lt;p&gt;Exhibit A, Mozilla:&lt;/p&gt;

&lt;pre&gt;
Chad@laptop /c/xulrunner/mozilla-central/obj-xulrunner
$ time make
rm -f -rf ./dist/sdk
[tons of output snipped]
make[1]: Leaving directory `/c/xulrunner/mozilla-central/obj-xulrunner'

real    21m31.526s
user    4m13.292s
sys     9m15.066s
&lt;/pre&gt;

&lt;p&gt;21.5 MINUTES!  This is a no-op build!  I changed nothing from the last build!&lt;/p&gt;

&lt;p&gt;Mozilla&amp;#8217;s build is an especially egregious example, but it&amp;#8217;s not uncommon for nontrivial Make, SCons, or Jam no-op builds to exceed 15 seconds.  Every time you run SCons, for example, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;loads Python,&lt;/li&gt;
&lt;li&gt;imports a bunch of Python code,&lt;/li&gt;
&lt;li&gt;creates an entire dependency graph in memory,&lt;/li&gt;
&lt;li&gt;scans all files for changes,&lt;/li&gt;
&lt;li&gt;determines what to build,&lt;/li&gt;
&lt;li&gt;builds it,&lt;/li&gt;
&lt;li&gt;and throws all of those intermediate results away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Am I the only person who thinks this situation is insane?  We&amp;#8217;re spending all of our time improving &lt;a href=&quot;http://www.scons.org/wiki/GoFastButton&quot;&gt;constant&lt;/a&gt; &lt;a href=&quot;http://gamesfromwithin.com/the-quest-for-the-perfect-build-system-part-2&quot;&gt;factors&lt;/a&gt; rather than addressing fundamentally quadratic build algorithms.&lt;/p&gt;

&lt;p&gt;No-op builds should be &lt;code&gt;O(1)&lt;/code&gt; and instantaneous, and most other builds should be &lt;code&gt;O(WhateverChanged)&lt;/code&gt;.  What if I told you this is possible?&lt;/p&gt;

&lt;h2&gt;Introducing IBB: I/O-Bound Build&lt;/h2&gt;

&lt;p&gt;Dusty, one of the best engineers I know, once told me that C compilers are now fast enough that they&amp;#8217;re I/O-bound, not CPU-bound as you&amp;#8217;d expect.  This was inspiration for a &lt;del&gt;build system&lt;/del&gt; dependency engine architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A long-running server process that contains a complete dependency graph between files, including the commands required to update targets from sources.&lt;/li&gt;
&lt;li&gt;An ultra-tiny C program that communicates build requests to the build server.&lt;/li&gt;
&lt;li&gt;A background thread that watches for filesystem updates (via &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx&quot;&gt;ReadDirectoryChangesW&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/File_alteration_monitor&quot;&gt;libfam&lt;/a&gt;) and updates the dependency graph in memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have built a prototype of ibb&amp;#8217;s architecture, and its code is available on &lt;a href=&quot;http://github.com/chadaustin/ibb&quot;&gt;my github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In ibb, a no-op build takes constant time, no matter the size of the project.  I tested with Noel Llopis&amp;#8217;s &lt;a href=&quot;http://gamesfromwithin.com/the-quest-for-the-perfect-build-system&quot;&gt;build system stress test&lt;/a&gt; and no-op builds are merely &lt;b&gt;50 milliseconds&lt;/b&gt;.  Take that, everyone else!&lt;/p&gt;

&lt;h2&gt;A Faster Grep&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s say you wanted to run a regular expression across your entire codebase.  On Windows, you&amp;#8217;ll spend all of your time in kernel calls, even if the files are in cache.  However, remember that modern memory bandwidths are measured in GB/s&amp;#8230;&lt;/p&gt;

&lt;p&gt;ibb&amp;#8217;s &lt;a href=&quot;http://github.com/chadaustin/ibb/blob/master/example/search/main.ibb&quot;&gt;file search&lt;/a&gt; implementation can run a regular expression across 200 MB of PHP and JavaScript in &lt;b&gt;100 milliseconds&lt;/b&gt;.  It copies file data into memory on the first run and rapidly scans across that memory on future runs.  It could just as easily mmap and use OS&amp;#8217;s disk cache to avoid kernel calls.&lt;/p&gt;

&lt;h2&gt;Minimal Test Runner&lt;/h2&gt;

&lt;p&gt;Carl Masak&amp;#8217;s inspirational &lt;a href=&quot;http://use.perl.org/~masak/journal/39639&quot;&gt;addictive TDD harness&lt;/a&gt; is also possible with ibb.  If you can determine which unit tests depend on which source files (via an __import__ hook in Python, say), you can run appropriate tests immediately after saving a source file.&lt;/p&gt;

&lt;h2&gt;Version Control&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve watched both git and Subversion fall apart as a codebase grows.  git is so faaast&amp;#8230;  until you import a 20 GB repository.  Then it&amp;#8217;s &lt;code&gt;O(Files)&lt;/code&gt; just like everything else.&lt;/p&gt;

&lt;pre&gt;
$ time git status
# On branch master
nothing to commit (working directory clean)

real    0m9.603s
user    0m0.858s
sys     0m7.378s
&lt;/pre&gt;

&lt;p&gt;10 seconds to see what files I&amp;#8217;ve modified.  Ouch.&lt;/p&gt;

&lt;p&gt;Imagine if ibb could keep track of which files have changed&amp;#8230;&lt;/p&gt;

&lt;h2&gt;What This Means For You&lt;/h2&gt;

&lt;p&gt;Running tests, grepping code, and building binaries from source are equivalent problems.  ibb&amp;#8217;s architecture supports lightning-fast implementations of all of the above.&lt;/p&gt;

&lt;p&gt;By converting an &lt;code&gt;O(Time^2)&lt;/code&gt; build, test runner, or version control system to &lt;code&gt;O(1)&lt;/code&gt;, we eliminate hours of costly engineer time and encourage good habits like committing often and frequently running tests, no matter the age of the project.  Frankly, instant feedback feels great.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s crazy to me that this architecture isn&amp;#8217;t standard practice across development tools.&lt;/p&gt;

&lt;p&gt;Take &lt;a href=&quot;http://github.com/chadaustin/ibb&quot;&gt;ibb&amp;#8217;s concepts or code&lt;/a&gt;, integrate it with your engineering processes, and improve the quality of your team&amp;#8217;s life today.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/eisD9teKN2c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 04 Mar 2010 08:02:18 +0000</pubDate>
</item>
<item>
	<title>Michael Rooney: Why I Switched from Ubuntu One back to Dropbox</title>
	<guid>tag:blogger.com,1999:blog-3369913276619133519.post-1825431327919946565</guid>
	<link>http://feedproxy.google.com/~r/mrooney/~3/AvTvOZQ1ZpI/why-i-switched-from-ubuntu-one-back-to.html</link>
	<description>As many of you surely know, Dropbox and Ubuntu One are applications to keep files on your desktop in sync across multiple computers, and backed up in the cloud. After using Dropbox for a year or so on Ubuntu, the Ubuntu One project came out and I thought I'd move over to it. I assumed it would be easier to set up, being pre-installed, and could integrate better with the file manager and other applications, being made specifically for Ubuntu.&lt;br /&gt;&lt;br /&gt;After about 6 months of using Ubuntu One, I found it to be too much of a regression compared to Dropbox and switched back. I thought I'd detail why here for the usefulness of others and to hopefully provide some constructive criticism to the Ubuntu One team which overall is doing good work. So here's why I went back to Dropbox:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Better Nautilus integration&lt;/b&gt;&lt;br /&gt;The nautilus (file manager) integration in Dropbox feels very mature and polished. Normally I'd say this is to be expected since Ubuntu One is much younger, but since the nautilus aspect of Dropbox is open-source, there didn't seem to be much of an excuse for the Ubuntu One team to not use it as a starting point or at least as inspiration. Whenever I added files to my Ubuntu One folder, no matter how large or how many, they instantly had the checkbox emblem which implies to me they are in sync, even though they couldn't possibly be uploaded that quickly. In Dropbox, the files show an animated progress emblem until they are actually uploaded, and show this again when they are being updated. I wasn't able to trust the status of files with Ubuntu One, and that wasn't a good feeling.&lt;br /&gt;&lt;br /&gt;Sharing files in Dropbox is also a lot easier via Nautilus, but that deserves it's own point.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Easier file sharing&lt;/b&gt;&lt;br /&gt;In my typical use cases of file sharing, I want to go from having a file in mind to someone else seeing that file as quickly as possible, be it in an instant message, chatroom (IRC/Jabber), or email to a friend or two. Dropbox makes this a breeze; drag a file into the &quot;Public&quot; folder in your Dropbox directory, and right-click on it and select &quot;Dropbox &gt; Copy Public Link&quot;. Now you have a publicly accessible link to your file in your clipboard!&lt;br /&gt;&lt;br /&gt;I never quite figured out how to do this in Ubuntu One; it seems you have to share files with specific people who also are running Ubuntu One (which really compounds the non-cross-platform issue) via the web interface by typing in an email address. This is a cool idea, but seems way over-engineered as a starting point. This was even brought up at the last UDS in an Ubuntu One session but was brushed off; they sadly seemed more interested in engineering complex sharing UIs than getting feedback to ensure they were solving actual problems.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sane notifications&lt;/b&gt;&lt;br /&gt;I think &lt;a href=&quot;https://bugs.launchpad.net/ubuntuone-client/+bug/462747&quot;&gt;bug 462747&lt;/a&gt; is what ultimately drove me to drop Ubuntu One. It notifies you not once but twice for every file you change; once to tell you it is syncing the file and another to tell you it is done. Regarding the first notification, I probably already know that I changed that file; regarding the second, if I'm really curious about the status of the synchronization, a quick glance at the applet should tell me what I need to know. This was mildly annoying as is, but it does this for hidden files like vim swap files too. Every time I would open or save a file in vim (and I save early and often), I got two notifications about syncing the hidden swap file!&lt;br /&gt;&lt;br /&gt;Dropbox was much more sane regarding notifications; whenever I would turn on or sit down at a computer, it would show &lt;b&gt;one&lt;/b&gt; notification telling me how many files it synced from other machines or, if there was just one changed file, the name of it. Beautiful!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Better web UI&lt;/b&gt;&lt;br /&gt;The web user interface for Dropbox felt a lot easier to use, and I often had problems where the Ubuntu One web view would show deleted files or not show files I knew were there that were added days ago. Sometimes I had to collapse and expand a folder a time or two to get it to show the right contents. This led to a similar problem that I mentioned with the nautilus integration; it wasn't a UI I could trust to be accurate as was therefore essentially useless. The Dropbox UI was always accurate, and had some nice extras which could prove to be lifesavers like getting past versions of files.&lt;br /&gt;&lt;br /&gt;I also experienced some other issues including &lt;a href=&quot;https://bugs.launchpad.net/ubuntuone-client/+bug/498444&quot;&gt;bug 498444&lt;/a&gt; which caused Ubuntu One applet to start up with the exclamation icon, giving the impression of not syncing files. If I wanted to edit or view a file that might have changed remotely, I had to manually tell the applet to try syncing again after startup to make sure the file was latest version (or else I could silently end up with .u1conflict file, but that's another issue). Additionally, although the transparency is praiseworthy, &lt;a href=&quot;http://twitter.com/UbuntuOne/status/9498991639&quot;&gt;all&lt;/a&gt; &lt;a href=&quot;http://twitter.com/UbuntuOne/status/9331800792&quot;&gt;these&lt;/a&gt; &lt;a href=&quot;http://twitter.com/UbuntuOne/status/9292086471&quot;&gt;tweets&lt;/a&gt; &lt;a href=&quot;http://twitter.com/UbuntuOne/status/9020860066&quot;&gt;about&lt;/a&gt; &lt;a href=&quot;http://twitter.com/UbuntuOne/status/8963442390&quot;&gt;recent&lt;/a&gt; &lt;a href=&quot;http://twitter.com/UbuntuOne/status/7755587471&quot;&gt;issues&lt;/a&gt; or &lt;a href=&quot;http://twitter.com/UbuntuOne/status/8870678995&quot;&gt;downtime&lt;/a&gt; do not inspire confidence.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;That being said&lt;/b&gt;&lt;br /&gt;Ubuntu One does have a few things going for it, however. It is installed by default which means it is the easiest cloud sync/backup solution to get started with for an Ubuntu user. And thanks to CouchDB and a package manager, Ubuntu can ship applications that make it trivial to sync their data with Ubuntu One out of the box. If I can tell all the applications I care about to sync with Ubuntu One (bookmarks, notes, podcasts, basic OS settings/appearance) from one configuration UI, that's going to be pretty compelling.&lt;br /&gt;&lt;br /&gt;While I currently can't in good conscience recommend Ubuntu One to a friend (and plenty of my friends don't even use Ubuntu), I do have high hopes for the project; it is young and if they can work out some of the above issues, many of them being personal show-stoppers, while providing application and OS integration, Ubuntu One (and perhaps Ubuntu itself) could become too compelling to not use for many people. For now however, Dropbox is the solution which stays out of my way, allows me to solve my problems, and just works.&lt;br /&gt;&lt;br /&gt;If you are using Ubuntu One or Dropbox, certainly chime in on what the critical features are for you and why you chose one over the other!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3369913276619133519-1825431327919946565?l=mrooney.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/mrooney/~4/AvTvOZQ1ZpI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 22 Feb 2010 23:01:53 +0000</pubDate>
	<author>noreply@blogger.com (Michael)</author>
</item>
<item>
	<title>Jeff Lindsay: The latest from Wozniak</title>
	<guid>http://progrium.livejournal.com/236161.html</guid>
	<link>http://progrium.livejournal.com/236161.html</link>
	<description>&quot;My latest idea that I've been expressing is that there's no real value to humanity in creating technology like computers. What really matters and makes a difference is when you do something nice for someone else, like tying the shoe of a child. Or bringing smiles to any stranger.&quot;</description>
	<pubDate>Wed, 17 Feb 2010 05:33:25 +0000</pubDate>
</item>
<item>
	<title>Chuck Rector: Poisonous devices</title>
	<guid>tag:blogger.com,1999:blog-3327768276254607141.post-4653380857422514326</guid>
	<link>http://choosetheforce.blogspot.com/2010/02/poisonous-devices.html</link>
	<description>&lt;h2&gt;Phones&lt;/h2&gt;

&lt;p&gt;Sometimes, it's nice when friends and family call. I've even been pleasantly surprised by strangers before. Other times, people call me for the wrong reasons and at the wrong times. I used to believe that when phones ring they must be answered, but that's no longer the case. A phone is an assistive device. If it's not assisting me then what value does it provide?&lt;/p&gt;

&lt;p&gt;I used to be terrified of phones. After a part-time job which required a lot of phone time with strangers, that terror went away. Except that in hindsight I don't think it did. It was always stressful. I simply grew to accept that stress.&lt;/p&gt;

&lt;p&gt;Over the years I've been tuning my phone usage. I used to answer every call because it was about facing my fear. Then I answered every call because... that's just what you do. It's a phone! Then I realized that it's not my job to answer the phone. This was an important realization for me, because that part-time job had programmed me to believe that it was. I began answering the phone less and less.&lt;/p&gt;

&lt;p&gt;These days, I hardly ever answer my phone. One huge source of stress: gone.&lt;/p&gt;

&lt;p&gt;This sometimes means I miss calls from friends and family, but ultimately the people I know and love have many ways to reach me. If a chat on the phone is absolutely necessary, it will happen. Eventually. If it's a call from a stranger about random crap I don't care about, guess what: I win. You are unlikely to call me again.&lt;/p&gt;

&lt;p&gt;One of my favorite things to do is to turn off my phone. Especially when I go to sleep. Often I'll turn it off when I get home after work as well. And it's fantastic. Especially the part where I'm never jarred awake in the middle of the night.&lt;/p&gt;

&lt;h2&gt;Clocks&lt;/h2&gt;

&lt;p&gt;I used to have a watch and I would look at it all the time. If I'm at the bus stop waiting for the bus, I'm checking my watch. If I'm at work and wishing that lunch would come, I'm checking my watch. If I'm wishing work is over so I can go home, I'm checking my watch. If I'm waiting for a friend to come over, if I'm waiting for a show to come on, if I'm trying not to stay up too late...&lt;/p&gt;

&lt;p&gt;I decided that looking at clocks is stressful. How about I just change how I'm living so I don't need to look at them? That's what I do now. I engineer my life to alleviate stress and to optimize fun and learning.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I don't look at bus schedules anymore. Instead, I get enough sleep, wake up refreshed, and walk over to the bus stop when I'm good and ready. This is usually hours before I need to be at work, so I'm never in a rush. I listen to music while I wait, enjoy the cool morning air, and watch the birds while I munch on an apple. Some mornings are foggy and wet and some are bright and warm. I notice and appreciate them because I'm not late for work, I'm not tapping my toe, and I'm not constantly looking at my watch.&lt;/li&gt;
&lt;li&gt;There are dozens of ways to alleviate stress at work, and I ruthlessly identify and crush them. As a result, I'm not wishing lunch would come quickly so I can get a moment's relief. I'm not wishing the day would end so I can go home and get a few more moments of relief. I've made my work incredibly satisfying. When lunch rolls around, it's usually a happy surprise. Same thing for the end of the day. So much so that I come into the office on weekends because it's an enjoyable part of my life that I want to experience daily.&lt;/li&gt;
&lt;li&gt;It turns out that once I alleviated so much stress in other parts of my life, I also alleviated boredom. For me, boredom was the end result of living in a constant state of stress. This may not make immediate sense, but when I was in a constant state of stress, I was always doing one of two things: stressing or recovering. In that mode of living, I was never actually spending time on myself, either by having fun or by feeding my mind with fulfilling personal learning. Even when I thought I was doing these things, I really wasn't. In that severe state of stress, I believe there was no fun or personal learning. There was a heavy weight which pushed me down and which permeated everything I did. What I thought was fun or learning was instead &quot;escape&quot;. Enter boredom: when escape velocity was not sufficient to outmatch stress.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whenever I think about clocks, I think about the rabbit from Alice in Wonderland. I don't want to be That Guy, running around, worrying his head off, with precious little time to spend on himself. I'm valuable to myself, so I make plenty of time for me.&lt;/p&gt;

&lt;h2&gt;Alarms&lt;/h2&gt;

&lt;p&gt;Alarms are like clocks, plus a punch in the face. If I don't like waking up in the middle of the night when I'm not done sleeping, then I don't like waking up in the morning when I'm not done sleeping either. How about I just get enough sleep so that I don't need an alarm?&lt;/p&gt;

&lt;p&gt;I have also learned that caffeine is the catalyst for my own personal hell (another poisonous device!) It kicks off a vicious cycle. I drink caffeine. I am amped. I come down off the high. I drink more. It's late and I'm full of energy and my body's burning calories so I eat. I now have even more energy. I stay up late. I have to get into work early so I set an alarm. Too few hours later, my alarm punches me in the face. I drink caffeine to jump start my system. And away we go...&lt;/p&gt;

&lt;p&gt;As I mentioned, I turn my phone off when I go to sleep. It's not entirely a coincidence that my phone is also my alarm (iPhone.) I turn it off with purpose. When I'm sleeping, phone calls and alarms are equivalent. Depriving myself of sleep does not improve my life. I control my phone, therefore I choose to improve my life by turning it off when I'm sleeping.&lt;/p&gt;

&lt;p&gt;Alarms should be used for alarming circumstances. Like fires. Not burning to death is a good way to add value to my life. Other alarms, not so much.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3327768276254607141-4653380857422514326?l=choosetheforce.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 14 Feb 2010 11:46:00 +0000</pubDate>
	<author>noreply@blogger.com (卡车 Chuck)</author>
</item>
<item>
	<title>Chuck Rector: Right the wrongs</title>
	<guid>tag:blogger.com,1999:blog-3327768276254607141.post-1887807750003621505</guid>
	<link>http://choosetheforce.blogspot.com/2010/02/right-wrongs.html</link>
	<description>&lt;p&gt;It's difficult and painful and time-consuming to switch from a habitual lifestyle of bitching over to one of fixing, but it's possible to change. My first impulse when encountering foreign and confusing code has always been to complain about it to someone, immediately. It's such a dumb and mindless thing to do, but I've done it a million times. On some level it's about camaraderie. Wah-wah, it sucks, let me cry on your shoulder. You understand how awful this is, right?&lt;/p&gt;

&lt;p&gt;My first attempts at correcting this behavior focused on the wrong thing: demeanor. It's not bitching if I'm calm, collected, and diplomatic when I say it right? It's okay if I try to trick myself into thinking I made an attempt, but was mostly silently seething to myself, and then came to you for help right? What a passive-agressive waste of someone else's time. There's help and then there's hand-holding. Instead, my focus needed to be on solving problems, not the injustice of hard ones and trying to foist them on others.&lt;/p&gt;

&lt;p&gt;This video &lt;a href=&quot;http://www.youtube.com/watch?v=k2h2lvhzMDc&quot;&gt;http://www.youtube.com/watch?v=k2h2lvhzMDc&lt;/a&gt; (Ed Catmull, Pixar) reminded me of useless bitching (the kind I envision &quot;mediocre teams&quot; would participate in) and that my programmed response in the face of difficulty should be one of reason and action rather than victimization. It's not that someone intended to punch me in the face with their code, it's that the target has shifted and I need to correct course. It's not about personal vendetta, it's about what works and what doesn't work.&lt;/p&gt;

&lt;p&gt;This is my reminder to myself to be intelligent and thoughtful and to right wrongs rather than wallow, sidestep, or avoid. I righted wrongs today, and it's awesome.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3327768276254607141-1887807750003621505?l=choosetheforce.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 12 Feb 2010 00:03:00 +0000</pubDate>
	<author>noreply@blogger.com (卡车 Chuck)</author>
</item>
<item>
	<title>Michael Rooney: wxBanker 0.7: simple personal finance</title>
	<guid>tag:blogger.com,1999:blog-3369913276619133519.post-4269198340218823775</guid>
	<link>http://feedproxy.google.com/~r/mrooney/~3/8tIxeqNnkG8/wxbanker-07-simple-personal-finance.html</link>
	<description>Your favorite personal finance application, &lt;a href=&quot;https://launchpad.net/wxbanker&quot;&gt;wxBanker&lt;/a&gt;, has turned 0.7!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/S29A7hvLBVI/AAAAAAAAAbg/d0PZdNtqyqI/s1600-h/wxBanker-0.7a.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/S29A7hvLBVI/AAAAAAAAAbg/d0PZdNtqyqI/s400/wxBanker-0.7a.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5435634666672162130&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This release comes about 2 months after the previous release, and focuses on usability and user experience issues that I obtained from watching people use wxBanker as well as from Launchpad bugs (thanks &lt;a href=&quot;https://bugs.launchpad.net/wxbanker/+bug/496878&quot;&gt;Arty&lt;/a&gt;!). Let's take a look at some of the changes, starting with the account control:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/S28ugG2hSQI/AAAAAAAAAbQ/iIskUB1WYi0/s1600-h/wxbanker-6-7-accountctrl.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/S28ugG2hSQI/AAAAAAAAAbQ/iIskUB1WYi0/s400/wxbanker-6-7-accountctrl.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5435614404389456130&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the right we have the new account chooser in 0.7. The main change is using radio buttons for the accounts instead of links. This is a much better, already understood method for choosing accounts, and will also fit in with themes better. The last item is now &quot;All accounts&quot; and is selectable, making it easy to get a view of all your transactions and search in them.&lt;br /&gt;&lt;br /&gt;The &quot;Hide zero-balance accounts&quot; option has moved to the View menu, and now has a keyboard shortcut. I've also removed the total number of accounts from the header, as well as the colons after the account names, to reduce clutter. Finally, everything has been given a bit more padding and the buttons have been slightly rearranged.&lt;br /&gt;&lt;br /&gt;Additionally, the previous graphing library has been replaced by cairoplot (thanks &lt;a href=&quot;https://blueprints.launchpad.net/wxbanker/+spec/replaceable-plot-renderers&quot;&gt;Karel&lt;/a&gt;!), which looks much more attractive. Let's check it out:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_HU7L5oFDSeA/S286U7l8uqI/AAAAAAAAAbY/ztBe-P27WY4/s1600-h/wxBanker-0.7b.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_HU7L5oFDSeA/S286U7l8uqI/AAAAAAAAAbY/ztBe-P27WY4/s400/wxBanker-0.7b.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5435627406528133794&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Summary view allows you to see a graph of your balance over time, and you can view a graph of a specific account or all accounts by using the account chooser on the left (previously the graph had its own account chooser, that was silly!).&lt;br /&gt;&lt;br /&gt;And in case you missed the 0.6 announcement, that version brought recurring transactions, XDG directory support, and more intuitive behavior regarding deleting/editing transfer transactions.&lt;br /&gt;&lt;br /&gt;For downloads and the full list of features and bug-fixes, check out the &lt;a href=&quot;https://launchpad.net/wxbanker/0.7/0.7&quot;&gt;release page&lt;/a&gt;. You can also add &lt;a href=&quot;https://launchpad.net/~wxbanker-users/+archive/ppa&quot;&gt;the PPA&lt;/a&gt; for easy installation and upgrades.&lt;br /&gt;&lt;br /&gt;If you'd like to stay in the loop join the &lt;a href=&quot;https://launchpad.net/~wxbanker-users&quot;&gt;wxBanker Users team&lt;/a&gt; (and announcement mailing list) on Launchpad, follow &lt;a href=&quot;http://twitter.com/wxbanker&quot;&gt;wxBanker on Twitter&lt;/a&gt;, or hang out in #wxbanker on irc.freenode.net.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3369913276619133519-4269198340218823775?l=mrooney.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/mrooney/~4/8tIxeqNnkG8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 07 Feb 2010 18:15:00 +0000</pubDate>
	<author>noreply@blogger.com (Michael)</author>
</item>
<item>
	<title>Chuck Rector: I am posting to my blog. Stop.</title>
	<guid>tag:blogger.com,1999:blog-3327768276254607141.post-2781556933171699107</guid>
	<link>http://choosetheforce.blogspot.com/2010/02/i-am-posting-to-my-blog-stop.html</link>
	<description>&lt;p&gt;I am kind of amused by people who end their emails with their name. Your name is in my contact list. I can read the From: field. I know who you are.&lt;/p&gt;

&lt;p&gt;Even more amusing is when they end it with a single letter. Is that supposed to be a signature? I don't get it. If you're going to use a signature, make it cool.&lt;/p&gt;

&lt;p&gt;For example, there's this guy who &quot;signs&quot; all of his CSS with this:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;c(~)&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;It's a mug of beer with a handle and sloshitude inside, see? Awesome.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3327768276254607141-2781556933171699107?l=choosetheforce.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 02 Feb 2010 17:52:00 +0000</pubDate>
	<author>noreply@blogger.com (卡车 Chuck)</author>
</item>
<item>
	<title>Jeff Lindsay: On Knowledge</title>
	<guid>http://progrium.livejournal.com/235792.html</guid>
	<link>http://progrium.livejournal.com/235792.html</link>
	<description>Despite conventional wisdom, knowledge is not just a collected body of facts. This is because that's exactly what information is, so knowledge must be something else. In fact, it's so much more.&lt;br /&gt;&lt;br /&gt;First of all, I argue that knowledge must be validated to be knowledge. You might hear about wrong information, but rarely do you hear about wrong knowledge. In fact, you commonly hear knowledge associated with truth. This is because knowledge is acquired through experience, the validation of consistency against reality. As they say, you never know until you try. &lt;br /&gt;&lt;br /&gt;I also argue that knowledge is not real until it is learned. In a sense, knowledge doesn't exist outside of a person. We talk about our collected body of knowledge, but we're really talking about people and the knowledge they have, or had when they were alive. Anything else is merely information, potential knowledge that has yet to be validated and internalized. Although we trust certain information to be validated &quot;knowledge&quot; since it was once acquired by someone else, it's only an assumption until you have learned it (experienced it) for yourself.&lt;br /&gt;&lt;br /&gt;Whether you buy that or not, we all seem to agree that knowledge is power. This is revealing about knowledge when you consider that power is defined as the capacity to cause change. This implies that the nature of knowledge is biased towards the idea of how-to. Although we consider the declarative what-is-true knowledge of, say, mathematics, to be knowledge, it is only a shorthand for the proof behind it, and the process of deriving a proof is obviously a question of how-to.&lt;br /&gt;&lt;br /&gt;The idea that knowledge is concerned with change and *how* things happen is important in contrast to why things happen. The fundamental difference between how and why is that how is concerned with structure and process, while why is concerned with function and meaning. The how of something can be determined without context through analysis. How does it work? Take it apart and find out! The why of something is highly dependent on context and synthesis. Why do we have xyz? You'll *never* know from taking xyz apart. Meaning comes from the outside. It accumulates not as knowledge, but as understanding.&lt;br /&gt;&lt;br /&gt;A probably more significant implication of knowledge being about change and process, is its relation to computer science. Not computer science as in the specific field of study, but computer science as the essence of computation. Perhaps, philosophy of computation. What computation and programming are about is the notion of formalizing intuitions about . . . process. &lt;br /&gt;&lt;br /&gt;Harold Abelson, co-developer of MIT's introductory computer science course, says computer science is not even so much about the computer. &quot;When a field is just getting started, it's easy to confuse the essence of that field with the tools that you use.&quot; I think the big significance of computation is not computation at all . . . it's about a means to formally talk about knowledge itself.&lt;br /&gt;&lt;br /&gt;We have general language as a formal expression of information and data, and we have basically programming and computers as a formal expression of knowledge and process. This leads me to wonder: what will we develop that allows us to formally express understanding and meaning? What kind of revolution will that be?</description>
	<pubDate>Tue, 02 Feb 2010 17:36:18 +0000</pubDate>
</item>
<item>
	<title>Michael Rooney: Automating translation template generation and check-ins for Launchpad</title>
	<guid>tag:blogger.com,1999:blog-3369913276619133519.post-9058984383653396016</guid>
	<link>http://feedproxy.google.com/~r/mrooney/~3/yZY-qKeOmgQ/automating-translation-template.html</link>
	<description>I &lt;a href=&quot;http://mrooney.blogspot.com/2009/07/launchpad-is-now-automatic-magical.html&quot;&gt;previously wrote&lt;/a&gt; about how excited I was for the automated translation import and export features of Launchpad. Launchpad will automatically notice when you commit a translation template and import it, making it available for translation online. Generous translators will then contribute translations, and Launchpad will commit them back to your project.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_HU7L5oFDSeA/S2fxD3QRaNI/AAAAAAAAAbI/AfTFW4D9U7s/s400/thumbsup.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5433576524119894226&quot; /&gt;&lt;br /&gt;Okay, so this is pretty good! However for this process to work well, the translation template needs to be generated manually by a developer whenever there are changes to strings. Otherwise, translators are working on potentially outdated strings; some are perhaps not in the application anymore, and there are likely some strings which aren't in the template yet.&lt;br /&gt;&lt;br /&gt;After forgetting to generate and commit my template until shortly before a release more than once (and thus having poor translation coverage on newly added strings), I decided to automate this part of the process as well. All it took was a relatively small script to generate the template, and then if there were any changes, commit and push to the branch configured for automatic import in Launchpad. The following script does just that, by searching for any files using gettext calls starting with _(&quot; or _(', and passing them to xgettext.&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;set -e&lt;br /&gt;ack-grep &quot;_\([\&quot;\']&quot; -l | xargs xgettext --output=wxbanker/po/wxbanker.pot&lt;br /&gt;ACTUALCHANGES=&quot;`bzr diff | grep \&quot;^[\-\+]msg\&quot; | wc -l`&quot;&lt;br /&gt;if [[ &quot;$ACTUALCHANGES&quot; != &quot;0&quot; ]]; then&lt;br /&gt;  bzr ci -m &quot;automated generation of translation template&quot;&lt;br /&gt;  bzr push :parent&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note that if you aren't using Python, you may need to tweak the regular expression supplied to ack-grep. Once the template is generated, the diff is piped through grep to grab any changes to actual messages and make sure there was at least one. Otherwise there would always be changes due to the timestamp in the template, causing useless commits.&lt;br /&gt;&lt;br /&gt;I then threw this script into a &lt;a href=&quot;http://hudson-ci.org/&quot;&gt;Hudson&lt;/a&gt; job, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;Continuous Integration server&lt;/a&gt; I use for &lt;a href=&quot;https://launchpad.net/wxbanker&quot;&gt;wxBanker&lt;/a&gt;. I configured this particular job to run nightly, pulling down the latest bzr branch beforehand, and emailing me on any failures.&lt;br /&gt;&lt;br /&gt;It seems to be working quite well and ensures translators are always translating the latest strings and leaves nothing for me to forget, smoothing out the release process.&lt;br /&gt;&lt;br /&gt;If this sounds interesting to you but you're not familiar with Launchpad as a translation system, check out &lt;a href=&quot;http://blog.launchpad.net/general/trying-out-launchpad-translations&quot;&gt;http://blog.launchpad.net/general/trying-out-launchpad-translations&lt;/a&gt; and feel free to ask any questions here. If you do have experience with translations, how do you handle generating translation templates and then integrating the translations?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3369913276619133519-9058984383653396016?l=mrooney.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/mrooney/~4/yZY-qKeOmgQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 02 Feb 2010 01:35:52 +0000</pubDate>
	<author>noreply@blogger.com (Michael)</author>
</item>
<item>
	<title>Jessy Cowan-Sharp: Culture of Yes</title>
	<guid>http://blog.quaternio.net/?p=515</guid>
	<link>http://blog.quaternio.net/2010/01/06/culture-of-yes/</link>
	<description>Washington, DC&amp;#8217;s recently released open government directive has a lot of us in the open government community stoked about the mandate we are finally being given, collectively and formally, to make government more transparent and accessible. 
The three tenets of participation, transparency, and collaboration are particularly relevant because, while they are couched in specific deliverables [...]</description>
	<pubDate>Wed, 06 Jan 2010 21:30:45 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: The Completionists Guide to Sims 3 iPhone</title>
	<guid>http://chadaustin.me/?p=1495</guid>
	<link>http://chadaustin.me/2010/01/the-completionists-guide-to-sims-3-iphone/</link>
	<description>&lt;p&gt;I play simulation games in two phases: first, I tackle the often-repetitive mechanics, unlocking every option and building up money so that I can creatively decorate my house or farm or whatever.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ea.com/games/the-sims-3-iphone&quot;&gt;Sims 3 for iPhone&lt;/a&gt; was no different.  Having accomplished nearly everything in the game, I will share a strategy for completing all 73 goals and acquiring the best job: $600 per day at the Pawn Shop.&lt;/p&gt;

&lt;h2&gt;The Objective&lt;/h2&gt;

&lt;p&gt;To open the pawn shop, you must complete the following 73 goals:&lt;/p&gt;

&lt;h3&gt;Goals for all Sims (55)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Try fishing&lt;/li&gt;
&lt;li&gt;Try cooking&lt;/li&gt;
&lt;li&gt;Buy fishing kit&lt;/li&gt;
&lt;li&gt;Buy watering can&lt;/li&gt;
&lt;li&gt;Buy repair kit&lt;/li&gt;
&lt;li&gt;Buy a stove&lt;/li&gt;
&lt;li&gt;Buy a bath&lt;/li&gt;
&lt;li&gt;Gain a skill point at cooking&lt;/li&gt;
&lt;li&gt;Gain a skill point at fishing&lt;/li&gt;
&lt;li&gt;Gain a skill point at repairing&lt;/li&gt;
&lt;li&gt;Meet a new Sim&lt;/li&gt;
&lt;li&gt;Befriend a Sim&lt;/li&gt;
&lt;li&gt;Begin a romantic relationship&lt;/li&gt;
&lt;li&gt;Make an enemy&lt;/li&gt;
&lt;li&gt;Make a Sim laugh&lt;/li&gt;
&lt;li&gt;Annoy a Sim&lt;/li&gt;
&lt;li&gt;Insult a Sim&lt;/li&gt;
&lt;li&gt;Creep-out another Sim&lt;/li&gt;
&lt;li&gt;Slap a Sim&lt;/li&gt;
&lt;li&gt;Get a job&lt;/li&gt;
&lt;li&gt;Buy something&lt;/li&gt;
&lt;li&gt;Catch a fish&lt;/li&gt;
&lt;li&gt;Catch a trout&lt;/li&gt;
&lt;li&gt;Catch a salmon&lt;/li&gt;
&lt;li&gt;Catch a catfish&lt;/li&gt;
&lt;li&gt;Repair something&lt;/li&gt;
&lt;li&gt;Discover a new recipe&lt;/li&gt;
&lt;li&gt;Cook something&lt;/li&gt;
&lt;li&gt;Cook grilled cheese&lt;/li&gt;
&lt;li&gt;Cook steak &amp;#038; veggies&lt;/li&gt;
&lt;li&gt;Cook minestrone&lt;/li&gt;
&lt;li&gt;Grow something&lt;/li&gt;
&lt;li&gt;Grow carrots&lt;/li&gt;
&lt;li&gt;Grow corn&lt;/li&gt;
&lt;li&gt;Grow tomato&lt;/li&gt;
&lt;li&gt;Watch TV&lt;/li&gt;
&lt;li&gt;Kick over a Trash Can&lt;/li&gt;
&lt;li&gt;Sleep in another Sim&amp;#8217;s bed&lt;/li&gt;
&lt;li&gt;Use another Sim&amp;#8217;s shower&lt;/li&gt;
&lt;li&gt;Use another Sim&amp;#8217;s toilet&lt;/li&gt;
&lt;li&gt;Get a better couch&lt;/li&gt;
&lt;li&gt;Get a better TV&lt;/li&gt;
&lt;li&gt;Accumulate $1000&lt;/li&gt;
&lt;li&gt;Catch 15 fish&lt;/li&gt;
&lt;li&gt;Harvest 30 crops&lt;/li&gt;
&lt;li&gt;Stay entertained for three days&lt;/li&gt;
&lt;li&gt;Stay fed for three days&lt;/li&gt;
&lt;li&gt;Stay rested for three days&lt;/li&gt;
&lt;li&gt;Stay clean for three days&lt;/li&gt;
&lt;li&gt;Meet all the Sims in town&lt;/li&gt;
&lt;li&gt;Make a Sim jealous of you&lt;/li&gt;
&lt;li&gt;Sleep in three other Sim&amp;#8217;s beds&lt;/li&gt;
&lt;li&gt;WooHoo with someone&lt;/li&gt;
&lt;li&gt;Get a promotion&lt;/li&gt;
&lt;li&gt;Reach the top of the career ladder&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Maniac Personal Goals (4)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use everyone&amp;#8217;s toilet at least once&lt;/li&gt;
&lt;li&gt;Use everyone&amp;#8217;s shower at least once&lt;/li&gt;
&lt;li&gt;Creep out five people&lt;/li&gt;
&lt;li&gt;Watch three people sleeping&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Sleaze Personal Goals (2)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Be romantically involved with three Sims&lt;/li&gt;
&lt;li&gt;WooHoo eight times in one day&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Power Seeker Personal Goals (3)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Accumulate $5000&lt;/li&gt;
&lt;li&gt;Own the best house&lt;/li&gt;
&lt;li&gt;Own the best TV, stereo and stove&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Nice Guy Personal Goals (2)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Get married&lt;/li&gt;
&lt;li&gt;Be liked by all the Sims in town&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Jerk Personal Goals (4)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Be disliked by all the Sims in town&lt;/li&gt;
&lt;li&gt;Slap four people&lt;/li&gt;
&lt;li&gt;Insult five people&lt;/li&gt;
&lt;li&gt;Kick over all the trash cans in town&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Jack of All Trades Personal Goals (3)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Achieve the highest fishing skill level&lt;/li&gt;
&lt;li&gt;Achieve the highest repairing skill level&lt;/li&gt;
&lt;li&gt;Achieve the highest cooking skill level&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are six Sim classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jack of All Trades&lt;/li&gt;
&lt;li&gt;Nice Guy&lt;/li&gt;
&lt;li&gt;Jerk&lt;/li&gt;
&lt;li&gt;Sleaze&lt;/li&gt;
&lt;li&gt;Power Seeker&lt;/li&gt;
&lt;li&gt;Maniac&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As previously mentioned, you will need to complete every Goal to unlock the Pawn Shop.  Of the 73 total Goals, 55 randomly appear as Wishes, no matter which Sim class you choose, and they&amp;#8217;re generally easy to complete.&lt;/p&gt;

&lt;p&gt;On the other hand, each Sim&amp;#8217;s Personal Goals are relatively difficult.  You&amp;#8217;ll need to create at least six Sims, one of each type.  For the optimal path through the game, you should complete their personal goals from hardest to easiest.  I will give an efficient play sequence below.&lt;/p&gt;

&lt;h2&gt;Play Order&lt;/h2&gt;

&lt;h3&gt;Jack of All Trades&lt;/h3&gt;

&lt;p&gt;Create six Sims, and designate one as your &amp;#8220;main&amp;#8221; Sim.  Your main Sim is the one with which you most identify.&lt;/p&gt;

&lt;p&gt;Your main Sim is a Jack of All Trades (you&amp;#8217;ll later need its Repair skill at the Pawn Shop).  Play him or her first, building up skill levels as rapidly as possible.  Learn to fish, because fishing is the best way to make money.  As you accumulate money, buy as many of the cheapest stereos you can afford, filling your house.  Each time you enter the house to eat or rest, turn them all on.  Eventually, they will start breaking down, allowing you to practice repairing.&lt;/p&gt;

&lt;p&gt;Practicing cooking is easy &amp;#8211; simply buy bread, cheese, and the Grilled Cheese recipe and make it over and over again.&lt;/p&gt;

&lt;p&gt;Once fishing, repairing, and cooking are level 5, save, quit and move to the next Sim.&lt;/p&gt;

&lt;h3&gt;Power Seeker&lt;/h3&gt;

&lt;p&gt;Your second Sim is your Power Seeker.  Fish until you have $5000 and tool around town until you have the option to upgrade your house twice and buy the most expensive TV, stereo, and stove.  Furniture and home upgrades simply take time.  This is a good opportunity to accumulate general Goals.&lt;/p&gt;

&lt;p&gt;At this point, you should have most of the 55 general Goals.&lt;/p&gt;

&lt;h3&gt;The Other Sim Types&lt;/h3&gt;

&lt;p&gt;Sleaze, Nice Guy, Jerk, and Maniac have fairly easy Personal Goals.  The order in which you complete them does not matter.&lt;/p&gt;

&lt;p&gt;At this point, you should have almost all of the Personal Goals.  If not, keep playing &amp;#8212; they&amp;#8217;ll eventually show up.&lt;/p&gt;

&lt;h3&gt;Goal Tips&lt;/h3&gt;

&lt;p&gt;If you need the &amp;#8220;Buy XXX&amp;#8221; goal but you already have XXX, then try selling it.  Eventually the Goal should appear as a Wish.  Lock it in and repurchase the item.&lt;/p&gt;

&lt;p&gt;If you need the &amp;#8220;Gain a skill point at XXX&amp;#8221; goal and you&amp;#8217;re maxed out, switch to a Sim that is not maxed out.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re having trouble Meeting all Sims, double-check all of the houses at different times of the day.  I&amp;#8217;ve noticed Bernie can be hard to find.  Most Sims are sleeping in the middle of the night &amp;#8211; try breaking into their houses, waking them up, and meeting them.&lt;/p&gt;

&lt;p&gt;If you need to befriend a Sim but you&amp;#8217;re already friends with all of the Sims, start a new Sim or insult a Sim until it becomes an enemy, then befriend him or her.&lt;/p&gt;

&lt;p&gt;The best way to annoy, insult, and creep-out other Sims is to find a house with two Sims (e.g. Marcell and Theresa), barge in, and start flirting with one of them.  Both will be creeped out and annoyed, and the flirting will insult the other and make him or her jealous.  If that doesn&amp;#8217;t work, start using their toilet, shower, and fridge.&lt;/p&gt;

&lt;h2&gt;Tips and Tricks&lt;/h2&gt;

&lt;p&gt;Fishing is the best way to make money.  Each tuna sells at QuickMart for $100, and salmon for $65.&lt;/p&gt;

&lt;p&gt;Besides the Pawn Shop, working at the Town Hall is the best.  It&amp;#8217;s easy to get promotions (both Ruth and the Town Hall are nearby) and you just need to be friends with everyone in town.  As Vice President, you can make $300 per day.&lt;/p&gt;

&lt;p&gt;Creating romantic relationships is easy.  It sounds rude, but keep pestering the Sim with Flirt, Tender Embrace, Hot Smooch, and WooHoo.  You should be able marry a Sim within two conversations.&lt;/p&gt;

&lt;p&gt;Too many WooHoos and your Sim will die!  Don&amp;#8217;t overdo it in the bedroom!&lt;/p&gt;

&lt;p&gt;If you get married, give your spouse a phone call and invite him or her over.  Once your spouse arrives, you can invite him or her to move in.&lt;/p&gt;

&lt;p&gt;Since the Town Hall is right by your house, it&amp;#8217;s the best job until the Pawn Shop is open.&lt;/p&gt;

&lt;h2&gt;The Sims&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nina&lt;/li&gt;
&lt;li&gt;Ruth&lt;/li&gt;
&lt;li&gt;Johnny&lt;/li&gt;
&lt;li&gt;Kia&lt;/li&gt;
&lt;li&gt;Jake&lt;/li&gt;
&lt;li&gt;Maggie&lt;/li&gt;
&lt;li&gt;Jack&lt;/li&gt;
&lt;li&gt;Jill&lt;/li&gt;
&lt;li&gt;Walter&lt;/li&gt;
&lt;li&gt;Luke&lt;/li&gt;
&lt;li&gt;Bernie&lt;/li&gt;
&lt;li&gt;Marcell&lt;/li&gt;
&lt;li&gt;Theresa&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The Jobs&lt;/h2&gt;

&lt;h3&gt;Town Hall (boss: Ruth)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Campaign Intern ($100/day) M-F 8:30-18:00&lt;/li&gt;
&lt;li&gt;City Council Member ($150/day) M-F 8:30-18:00&lt;/li&gt;
&lt;li&gt;Local Representative ($200/day) M-F 9:00-18:00&lt;/li&gt;
&lt;li&gt;Mayor ($250/day) M-F 10:00-18:00&lt;/li&gt;
&lt;li&gt;Vice President ($300/day) M-F 10:00-17:00&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Corsican Bistro (boss: Marcell)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kitchen Scullion ($100/day) M-F 10:30-18:30&lt;/li&gt;
&lt;li&gt;Ingredient Taster ($150/day) M-F 10:30-18:30&lt;/li&gt;
&lt;li&gt;Line Chef ($200/day) Tue-Sat 11:00-17:00&lt;/li&gt;
&lt;li&gt;Sous-Chef ($250/day) Tue-Sat 11:00-17:00&lt;/li&gt;
&lt;li&gt;Chef de Cuisine ($300/day) Tue-Fri 11:00-17:00&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Laboratory (boss: Kia)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test Subject ($100/day) M-F 9:00-16:00&lt;/li&gt;
&lt;li&gt;Lab Tech ($150/day) M-F 09:00-16:00&lt;/li&gt;
&lt;li&gt;Fertilizer Analyst ($200/day) M-F 09:00-16:00&lt;/li&gt;
&lt;li&gt;Carnivorous Plant Tender ($250/day) M-F 09:00-16:00&lt;/li&gt;
&lt;li&gt;Genetic Resequencer ($300/day) M-F 10:00-16:00&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Quickmart (boss: Bernie)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Filing Clerk ($100/day) M-F 08:30-18:30&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s not worth getting promotions at Quickmart.  Bernie is a dick and you have to work there FOREVER before he&amp;#8217;ll promote you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Pawn Shop (boss: Nina)&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Con Artist ($300/day) M-F 16:30-23:55&lt;/li&gt;
&lt;li&gt;Safecracker ($400/day) M-F 16:30-23:55&lt;/li&gt;
&lt;li&gt;Cat Burglar ($500/day) M-F 17:00-23:55&lt;/li&gt;
&lt;li&gt;Master Thief ($600/day) M-F 17:00-23:00&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;In the End&lt;/h2&gt;

&lt;p&gt;With the information given above, you should have no problem achieving 73 goals and as much money as you need to decorate your dream home.&lt;/p&gt;

&lt;p&gt;If you get stuck at any point, feel free to leave a comment on this page and I&amp;#8217;ll update the document.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/3jQmia_I1bg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 05 Jan 2010 03:56:25 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: Avoid Manual Initialization</title>
	<guid>http://chadaustin.me/?p=1487</guid>
	<link>http://chadaustin.me/2010/01/avoid-manual-initialization/</link>
	<description>&lt;p&gt;Too many software libraries require that you manually initialize them before use.  As illustration:&lt;/p&gt;

&lt;pre&gt;
library.initialize()
window = library.createLibraryObject()
&lt;/pre&gt;

&lt;p&gt;Why require your users to remember initialization busywork?  createLibraryObject should initialize the library, refcounting the initialization if necessary.&lt;/p&gt;

&lt;p&gt;The primary benefit is cognitive.  If a library requires initialization, its objects and functions have an additional, externally-visible behavior: &amp;#8220;If not initialized, return error.&amp;#8221;&lt;/p&gt;

&lt;p&gt;If the library&amp;#8217;s internal state is managed implicitly, it does not leak out of the API.  createLibraryObject should lazily initialize the library on object construction.  Optionally, on object destruction, it can deinitialize the library.&lt;/p&gt;

&lt;p&gt;A secondary benefit of lazy initialization is performance: interactive desktop applications rarely need immediate access to all of its subsystems.  By deferring as much initialization as possible, application startup time is reduced.&lt;/p&gt;

&lt;p&gt;[This post is a test of my new host: &lt;a href=&quot;http://prgmr.com/xen/&quot;&gt;prgmr.com&lt;/a&gt;]&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/8W6-l9uG03c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 01 Jan 2010 07:20:39 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: Verge Files Directory</title>
	<guid>http://www.egometry.com/?p=934</guid>
	<link>http://www.egometry.com/gruedorf/verge-files-directory/</link>
	<description>&lt;p&gt;If all went well, this will only show up on my gruedorf feed and not on the main site rss feed.&lt;/p&gt;
&lt;p&gt;Yesterday, I got the file directory view completed for beta.verge-rpg.com.  See it at &lt;a href=&quot;http://beta.verge-rpg.com/downloads/directory/&quot;&gt;http://beta.verge-rpg.com/downloads/directory/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next up will be the file redirects!  Whee.&lt;/p&gt;
&lt;p&gt;Hey Kildorf, where&amp;#8217;s your post?&lt;/p&gt;</description>
	<pubDate>Wed, 30 Dec 2009 08:53:06 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: Gruedorf: Sandbox Sitta</title>
	<guid>http://www.egometry.com/?p=931</guid>
	<link>http://www.egometry.com/gruedorf/gruedorf-sandbox-sitta/</link>
	<description>&lt;p&gt;This week I completed the autoschema tool that&amp;#8217;s been long overdue to maintain a healthy database state across the four sandboxes used for development.&lt;/p&gt;
&lt;p&gt;I also cleaned up layout errors and corrected a bug in screenshot uploading.  Also improved the search result page.&lt;/p&gt;
&lt;p&gt;Three minor files section tasks left: A directory link/listing, build the legacy 301 redirect table, and give the files frontpage some polish.&lt;/p&gt;
&lt;p&gt;Next major task after that: the Gallery Controller.&lt;/p&gt;</description>
	<pubDate>Wed, 30 Dec 2009 06:47:26 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: How to argue the case for webhooks</title>
	<guid>http://blog.webhooks.org/?p=202</guid>
	<link>http://blog.webhooks.org/2009/12/22/how-to-argue-for-webhooks/</link>
	<description>&lt;p&gt;&lt;strong&gt;Push/callbacks are better than polling.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This should be an easy argument. It&amp;#8217;s not just more efficient, it&amp;#8217;s more real-time. I once heard something like 40% of delicious.com requests returned 304 Not Modified. I imagine similar numbers for other popular sites. The more real-time you try to be with polling, the worse it gets. Don&amp;#8217;t call us, we&amp;#8217;ll call you. It&amp;#8217;s more efficient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RPC solutions provide more value than messaging solutions.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Although you can argue that RPC can be powered by messaging, and messaging can be used for RPC, the point is that they are different mindsets. RPC is about triggering code that &lt;em&gt;does&lt;/em&gt; something. Messaging is about putting a piece of data in another bucket. When you try to call somebody, you usually don&amp;#8217;t want to get their voicemail, right? This analogy goes even further in that, like voicemail, it must be checked on the other end. Messaging just pushes polling somewhere else. &lt;/p&gt;
&lt;p&gt;More importantly, the focus on triggering code is central to this value proposition. Generative systems are more valuable than sterile systems. When did the web get interesting? When it became about more than just static content, and code was put in the loop to generate dynamic content. The point is that if you prioritize code to receive a message before humans, you open up many more possibilities. &lt;/p&gt;
&lt;p&gt;RPC is about making things happen. Messaging stops short short of that by just moving data around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTTP is the defacto RPC protocol.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HTTP is everywhere. There are powerful free servers, clients in every major programming environment, and people know it well. It&amp;#8217;s proven and it just works. HTTTP&amp;#8217;s simple design also allows it to be extremely versatile. It&amp;#8217;s basically the TCP of the application layer.&lt;/p&gt;
&lt;p&gt;However, the best thing is that HTTP &lt;em&gt;is&lt;/em&gt; RPC. This subtle fact has been true ever since CGI was introduced. We&amp;#8217;ve gone through building RPC on top of it with XML-RPC and SOAP, but wisely settled on a form of RPC that&amp;#8217;s just HTTP and is even aligned with HTTP semantics: REST. &lt;/p&gt;
&lt;p&gt;If HTTP is RPC and HTTP is everywhere, it &lt;em&gt;is&lt;/em&gt; our defacto RPC protocol. Especially for web applications that breath HTTP, it almost doesn&amp;#8217;t make sense to think of any kind of inter-application communication that isn&amp;#8217;t HTTP. Turtles all the way down!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTTP RPC + Indirection = Webhooks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;David Wheeler said, &amp;#8220;All problems in computer science can be solved by another level of indirection.&amp;#8221; Webhooks, and all callbacks, are about taking a procedure call and performing it on a variable function. This is indirection and this is very powerful. This is why Unix pipes work. STDIN and STDOUT are not hardcoded values, they&amp;#8217;re variables that you can control. &lt;/p&gt;
&lt;p&gt;Now imagine if all the web applications you used had extension points that you could effectively hook together with &lt;em&gt;any&lt;/em&gt; other application. Well, that&amp;#8217;s what webhooks are about. &lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/webhooks.wordpress.com/202/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/webhooks.wordpress.com/202/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.webhooks.org&amp;blog=5379000&amp;post=202&amp;subd=webhooks&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 22 Dec 2009 23:28:58 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Webhooks finally explained for regular people!</title>
	<guid>http://blog.webhooks.org/?p=198</guid>
	<link>http://blog.webhooks.org/2009/12/16/webhooks-finally-explained-for-regular-people/</link>
	<description>&lt;p&gt;Although it&amp;#8217;s not the most compelling story, &lt;a href=&quot;http://blogrium.wordpress.com/2009/12/12/twitter-as-a-stockbroker-with-webhooks/&quot;&gt;this blog post&lt;/a&gt; is a terribly effective analogy. So effective, non-techies can read it and &amp;#8220;get webhooks&amp;#8221; &amp;#8230; in some cases leading them to rally for webhooks as much as I do! The analogy focuses on a non-computer, real-world analogy based on telephone calls. Then it follows up with a more concrete example that helps explain the possibilities:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;A concrete example of a story made possible from webhooks that might be a useful scenario for many of you involves Twitter. Let’s say Twitter supported webhook callbacks for when somebody follows you. Right now you get an email, and from there you can decide what to do manually: follow them back, block them, or do nothing. I used to go out of my way to block users that I knew were spam bots, but now there’s so many it’s not worth the time. And of course I also generally follow back people that I actually know. If Twitter would simply call a script of mine whenever somebody followed me passing along the user ID, I could very easily run this logic in a PHP script or a simple App Engine app. Or perhaps I’d use Scriptlets (ahem, which was made exactly for these kinds of web scripts). It would work like this:&lt;/p&gt;
&lt;p&gt;First, use the Twitter API to look up the user from the ID, and grab their name. Then use the Facebook API to check if that name shows up in my list of friends on Facebook. If so, use the Twitter API to follow them back. Otherwise, if they’re following over 1000 users and that number is more than twice the number that’s following them (which is roughly the heuristic I use manually), use the Twitter API to block them. All automatic.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Definitely worth the read, if I do say so myself. It&amp;#8217;s also worth pointing people that want a quick understanding of webhooks. What kind of analogies have you come up with?&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/webhooks.wordpress.com/198/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/webhooks.wordpress.com/198/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.webhooks.org&amp;blog=5379000&amp;post=198&amp;subd=webhooks&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 22 Dec 2009 23:17:46 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Unprecedented State of Busy</title>
	<guid>http://progrium.livejournal.com/235763.html</guid>
	<link>http://progrium.livejournal.com/235763.html</link>
	<description>Both now and in general. 2009 is probably the most notable year I can recall. It must have something to do with how busy I've been. Too busy to write in my LiveJournal, that's for sure. And there's been growth and development on all fronts: intellectual, financial, personal, interpersonal, professional, physical, etc. &lt;br /&gt;&lt;br /&gt;At the same time, there are daily issues to overcome, stress of many projects and upcoming deadlines, and the occasional bout of exhaustion. I still need to pull my finances into better order, get my semi-professional brand out there as an umbrella for all my projects, and figure out at what point will I retire from pure technology. Most of my major projects are so long-term and require a constant stream of smaller projects to support them, I'm not sure I'll know when I've succeeded. &lt;br /&gt;&lt;br /&gt;It may be that what I'll ultimately end up doing is moving where there are more people doing what I really want to do. Living here means I'm completely surrounded by startups and technology, so I can't help but spend cycles thinking about that. It frames my thinking and inspiration.&lt;br /&gt;&lt;br /&gt;We'll see.</description>
	<pubDate>Tue, 15 Dec 2009 06:54:56 +0000</pubDate>
</item>
<item>
	<title>Michael Rooney: Launchpad is now an automatic, magical translation factory!</title>
	<guid>tag:blogger.com,1999:blog-3369913276619133519.post-635648295426617392</guid>
	<link>http://feedproxy.google.com/~r/mrooney/~3/5qUhy_mlPD4/launchpad-is-now-automatic-magical.html</link>
	<description>I've been using Launchpad to host my personal finance application &lt;a href=&quot;https://launchpad.net/wxbanker&quot;&gt;wxBanker&lt;/a&gt; for a few years now. The thing I was hearing most often was that it wasn't localized; people wanted currencies to look the way they should in their country, and the application to be in their language. Let me explain how Launchpad helped me provide translations for my application, and how much of an utterly slothful breeze it has recently become.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_HU7L5oFDSeA/SnKYTL6ff1I/AAAAAAAAAT0/DHLdJZYT5nM/s320/slothful.png&quot; border=&quot;0&quot; alt=&quot;Image courtesy of shirt.woot.com&quot; id=&quot;BLOGGER_PHOTO_ID_5364517561534742354&quot; /&gt;&lt;br /&gt;Normally to handle translations, an application has to wrap strings with &lt;a href=&quot;http://en.wikipedia.org/wiki/Gettext&quot;&gt;gettext&lt;/a&gt;, create a template, find translators and give the template to them, collect translation files back, and integrate them into the project. This is painful and is why many applications aren't localized, and shut out most of the world as a result. One of the amazing features of Launchpad however, happens to be Rosetta, which brings translators TO your translations via a simple web interface, and then makes those translations available to the developer. With Rosetta, translators don't need to understand gettext or translation file formats; they just need to know two languages!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/SnKLUdixHfI/AAAAAAAAATs/z36K46Y4p3M/s1600-h/ss_rosetta.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/SnKLUdixHfI/AAAAAAAAATs/z36K46Y4p3M/s400/ss_rosetta.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5364503289795780082&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So that's what a translator sees. Notice how Launchpad even shows how other applications translated the same string. So once you generate a template and upload it, you can assign a translation group to your project such as &quot;Ubuntu Translators&quot; so that your strings will be translated by volunteers on the Ubuntu project; if your project isn't relevant to the Ubuntu project, you can use the more generic Launchpad Translators group. Now all you have to do is wait for some translations, then download them and check it in to your code. Not too bad, right?&lt;br /&gt;&lt;br /&gt;It isn't, but Launchpad has recently made it so much better. They started by adding an option to &lt;a href=&quot;https://help.launchpad.net/Translations/ImportingFromBazaarBranches&quot;&gt;automatically import translation templates&lt;/a&gt; from your project. This means as you are developing, all you have to do is regenerate the template and commit, and new strings will show up for translators in Rosetta and be translated automatically (from the developer's perspective). Then today, &lt;a href=&quot;http://blog.launchpad.net/general/exporting-translations-to-a-bazaar-branch&quot;&gt;they announced the other side of this&lt;/a&gt;, which is automatically committing those translations back into your code on a daily basis. This means that all I have to do is commit templates as I change strings, and Launchpad handles everything else. This is a profound tool for developers.&lt;br /&gt;&lt;br /&gt;What's the next step? Well, from a developer's perspective the translation template is a tool to give to the translators or in this case Launchpad. In the future Launchpad could eliminate this by generating the template itself from the code (this is what developers are doing themselves, after all), so that truly all you have to do after you set up the initial i18n/l10n framework is commit code as normal, and Launchpad magically commits back translations.&lt;br /&gt;&lt;br /&gt;All this work Launchpad is doing gives developers more time to develop while still having localized applications at a very minimal cost. This is continuous translation integration, and boy is it cool!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3369913276619133519-635648295426617392?l=mrooney.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/mrooney/~4/5qUhy_mlPD4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 30 Nov 2009 12:55:44 +0000</pubDate>
	<author>noreply@blogger.com (Michael)</author>
</item>
<item>
	<title>Jessy Cowan-Sharp: Deriving Organizational Structures from Evolutionary Algorithms</title>
	<guid>http://blog.quaternio.net/?p=461</guid>
	<link>http://blog.quaternio.net/2009/11/08/deriving-organizational-structures-from-evolutionary-algorithms/</link>
	<description>A couple of weeks ago I had the pleasure of sitting in on an  Organicities design studio at EPFL, focused on &amp;#8220;the digital generation of architecture using biological paradigms.&amp;#8221; It was an exploration of the potential these paradigms might hold for generating effective public, corporate, and community spaces in urban environments.  
Compared to [...]</description>
	<pubDate>Sun, 22 Nov 2009 07:55:02 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: PostGIS Beginner Notes</title>
	<guid>http://blog.quaternio.net/?p=308</guid>
	<link>http://blog.quaternio.net/2009/03/10/postgis-beginner-notes/</link>
	<description>&lt;p&gt;these are basically my notes as a total n00b coming to postgres and postgis from previous experience with mysql. hopefully, they will be useful to others as well in finding their feet. i am using ubuntu, but except for the package names below these instructions should be rather generic for non-windozz systems. &lt;/p&gt;
&lt;p&gt;first thing&amp;#8217;s is first.&lt;/p&gt;
&lt;p&gt;1. install postgres (&lt;em&gt;sudo apt-get install postgresql&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;2. install postgis libraries and postgres postgis support (&lt;em&gt;sudo apt-get install postgis&lt;/em&gt; &lt;em&gt;postgresql-8.3-postgis&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;the approach to postgis is a little different than something like mysql, which many people (like me) are used to. the default postgres user is called postgres (usually) and this is the default superuser. the first time you connect to the postgres manager, you need to su to the postgres user. it will connect to he default database (also named postgres). in general, if you are connecting as user x, and you do not specify a database name it will default to a database of the same name as the current user.&lt;/p&gt;
&lt;p&gt;another subtle difference is that postgres has several distinct commands which you can run from the command line, which arent necessarily obvious. where mysql uses mysqladmin &amp;lt;some command&amp;gt;, postgres just uses separate commands without a common prefix- eg. &lt;em&gt;createdb&lt;/em&gt; (create a database, assuming the user you connect as has sufficient privileges), &lt;em&gt;createuser&lt;/em&gt;, etc. i find this a little weird since in some cases it&amp;#8217;s not really obvious that, for example, createuser has anything to do with postgis.&lt;/p&gt;
&lt;p&gt;3. you might want to &lt;a href=&quot;http://www.postgresql.org/docs/8.3/interactive/database-roles.html&quot;&gt;create a user&lt;/a&gt; with the same username as your regular account username to simplify interacting with postgres. to do this you can either connect to postgres and do this from within the DBMS, or you can use the createuser postgres command from the command line:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;-u&lt;/span&gt; postgres createuser &lt;span&gt;-s&lt;/span&gt; new_superuser&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or better yet:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;-u&lt;/span&gt; postgres createuser &lt;span&gt;-s&lt;/span&gt; &lt;span&gt;$USER&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;where $USER is the environment variable that set on most unix style machines that will expand to your username. some people recommend for maximum convenience to also create a database with the same name, to enable connecting to postgres without specifying a database explicitly.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ createdb &lt;span&gt;$USER&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;so now we&amp;#8217;re set up, and you can connec to postgres by just typing&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ psql&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;in general to connect as an arbitrary user to an arbitrary database (for which you have permissions of course):&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ psql &lt;span&gt;-U&lt;/span&gt; username &lt;span&gt;-d&lt;/span&gt; dbname&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you&amp;#8217;re logged in, these commands will come in handy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; \du lists existing roles (users)&lt;/li&gt;
&lt;li&gt;\l list all databases&lt;/li&gt;
&lt;li&gt;\d tablename (of current database- like &amp;#8216;describe&amp;#8217; in mysql)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;each database that will use postgis has to explicitly enable the postgis functions and datatypes. yes&amp;#8211; even though postgis &lt;em&gt;support&lt;/em&gt; has been enabled through the packages you installed, you still have to manually enable the specific functions and data types for each database that will use them. there is a standard procedure for doing this. standard enough, in fact, that you can simplify the process by using postgres&amp;#8217; notion of database &lt;a href=&quot;http://www.postgresql.org/docs/8.1/static/manage-ag-templatedbs.html&quot;&gt;templates&lt;/a&gt;. think of it like creating templates in an office program&amp;#8211; like a template for an invoice, or a newsletter. even the default new database is an instantiation of a template: the basic or raw template, called &lt;em&gt;template1&lt;/em&gt;. as you can see from the instructions below, a template database is not anything different or special from a regular database.&lt;/p&gt;
&lt;p&gt;to create a spatially enabled template, do the following (ref: clear and simple instructions from this blog &lt;a href=&quot;http://www.paolocorti.net/2008/01/30/installing-postgis-on-ubuntu/&quot;&gt;here&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;su&lt;/span&gt; postgres &lt;span&gt;#optional, if your current user is not a superuser&lt;/span&gt;
$ createdb postgistemplate
$ createlang plpgsql postgistemplate
$ psql &lt;span&gt;-d&lt;/span&gt; postgistemplate &lt;span&gt;-f&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;share&lt;span&gt;/&lt;/span&gt;postgresql-&lt;span&gt;8.2&lt;/span&gt;-postgis&lt;span&gt;/&lt;/span&gt;lwpostgis.sql
$ psql &lt;span&gt;-d&lt;/span&gt; postgistemplate &lt;span&gt;-f&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;share&lt;span&gt;/&lt;/span&gt;postgresql-&lt;span&gt;8.2&lt;/span&gt;-postgis&lt;span&gt;/&lt;/span&gt;spatial_ref_sys.sql&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;we then have to make sure the correct users have permissions on the template database (important or they wont be able to use it!), optionally create a &lt;a href=&quot;http://www.postgresql.org/docs/8.3/interactive/ddl-schemas.html&quot;&gt;schema&lt;/a&gt;, and then test it!&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ psql &lt;span&gt;-d&lt;/span&gt; postgistemplate&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;


&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;plsql&quot;&gt;# &lt;span&gt;ALTER&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; geometry_columns OWNER &lt;span&gt;TO&lt;/span&gt; youruser&lt;span&gt;;&lt;/span&gt;
# &lt;span&gt;ALTER&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; spatial_ref_sys OWNER &lt;span&gt;TO&lt;/span&gt; youruser&lt;span&gt;;&lt;/span&gt;
# &lt;span&gt;CREATE&lt;/span&gt; SCHEMA gis_schema AUTHORIZATION gis&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;now to create a spatially enabled database (note: this can be &lt;a href=&quot;http://www.postgresql.org/docs/8.3/interactive/tutorial-createdb.html&quot;&gt;done&lt;/a&gt; from inside or outside psql):&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;plsql&quot;&gt;# &lt;span&gt;CREATE&lt;/span&gt; DATABASE gis_test TEMPLATE &lt;span&gt;=&lt;/span&gt; postgistemplate&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;finally, make sure all is good by defining a table for the new database. here&amp;#8217;s a simple example which defines a table that maps to the &lt;a href=&quot;http://www.gpsinformation.org/dale/nmea.htm&quot;&gt;NMEA gps sentence&lt;/a&gt; &lt;a href=&quot;http://www.gpsinformation.org/dale/nmea.htm#GGA&quot;&gt;GPGGA.&lt;/a&gt; put these commands in a file, or enter them in on the psql command line:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;plsql&quot;&gt;&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; gpgga &lt;span&gt;&amp;#40;&lt;/span&gt;
       pk serial PRIMARY KEY&lt;span&gt;,&lt;/span&gt;
       utc &lt;span&gt;TIME&lt;/span&gt; &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
       gps_fix int &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
       sats_in_view int &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
       horiz_error &lt;span&gt;FLOAT&lt;/span&gt; &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
       alt_asl &lt;span&gt;FLOAT&lt;/span&gt; &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
       height_above_WGS84 &lt;span&gt;FLOAT&lt;/span&gt; &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
       DGPS_ref_id int &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;
&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;SELECT&lt;/span&gt; AddGeometryColumn&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'gis_schema'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;'gpgga'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;'latlong'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;4326&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;'POINT'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that you &lt;a href=&quot;http://postgis.refractions.net/documentation/manual-1.3/ch04.html#id2742764&quot;&gt;create the table&lt;/a&gt; with all its non-spatial columns first, and then add the POINT (or other spatial) column. The arguments to the &lt;em&gt;AddGeometryColumn&lt;/em&gt; are, respectively (schema, table_name, column_name, SRID or spatial reference id, data_type, dimensions). the SRID is required by open GIS, and is actually a foreign key into the &lt;tt class=&quot;varname&quot;&gt;SPATIAL_REF_SYS&lt;/tt&gt; table. it tells the table what the reference system or projection of the data is. you can look these up depending on your data type.&lt;/p&gt;
&lt;p&gt;To read this in from the command line is pretty standard:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ psql &lt;span&gt;-d&lt;/span&gt; gis_test &lt;span&gt;&amp;lt;&lt;/span&gt; table_definition.sql&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;upon execution, you will likely see output like the following:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ psql &lt;span&gt;-d&lt;/span&gt; gis_test &lt;span&gt;&amp;lt;&lt;/span&gt; table_definition.sql
NOTICE:  CREATE TABLE will create implicit sequence &lt;span&gt;&amp;quot;gpgga_pk_seq&amp;quot;&lt;/span&gt; &lt;span&gt;for&lt;/span&gt; serial column &lt;span&gt;&amp;quot;gpgga.pk&amp;quot;&lt;/span&gt;
NOTICE:  CREATE TABLE &lt;span&gt;/&lt;/span&gt; PRIMARY KEY will create implicit index &lt;span&gt;&amp;quot;gpgga_pkey&amp;quot;&lt;/span&gt; &lt;span&gt;for&lt;/span&gt; table &lt;span&gt;&amp;quot;gpgga&amp;quot;&lt;/span&gt;
CREATE TABLE
                addgeometrycolumn
&lt;span&gt;--------------------------------------------------&lt;/span&gt;
 public.gpgga.latlong SRID:&lt;span&gt;4326&lt;/span&gt; TYPE:POINT DIMS:&lt;span&gt;2&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt; row&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Congrats! Coming soon&amp;#8211; parsing your nmea files.&lt;/p&gt;</description>
	<pubDate>Sun, 22 Nov 2009 04:58:06 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: NASA Image of the Day as Gnome background</title>
	<guid>http://blog.quaternio.net/?p=339</guid>
	<link>http://blog.quaternio.net/2009/04/13/nasa-image-of-the-day-as-gnome-background/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.nasa.gov/images/content/327037main_soyuz_full.JPG&quot;&gt;&lt;img class=&quot;alignright&quot; title=&quot;soyuz-big&quot; src=&quot;http://www.nasa.gov/images/content/327037main_soyuz_full.JPG&quot; alt=&quot;&quot; width=&quot;200&quot; height=&quot;192&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lately I&amp;#8217;ve really been enjoying the &lt;a href=&quot;http://www.nasa.gov/multimedia/imagegallery/iotd.html&quot;&gt;NASA Image of the Day&lt;/a&gt;, and so tonight I decided to make a quick and dirty script to update my gnome background daily with the new images. I thought of making a nice python script using the elegant &lt;a href=&quot;http://feedparser.org/&quot;&gt;universal feed parser&lt;/a&gt;; something able to handle generic image feeds, but as soon as i realized how differently the different image feeds were implemented, i quickly gave up in favour of a much more terse solution in bash.&lt;/p&gt;
&lt;p&gt;the script below just pulls the rss entry down using wget, and then uses grep to mine out the necessary components of the RSS entry. once it has the image url, it saves that to a directory ~/.backgrounds in your home directory, and then uses gnome&amp;#8217;s gconftool-2 to set the value of the background image. add this to your /etc/cron.daily/ directory and you should be good to go.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# grabs the nasa image of the day by RSS feed and updates the gnome&lt;/span&gt;
&lt;span&gt;# background. add this to your cron jobs to have this happen daily.&lt;/span&gt;
&lt;span&gt;# eg. in your /etc/cron.daily/ directory, add a one line script that&lt;/span&gt;
&lt;span&gt;# simply executes this script (dont forget to make it executable):&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# #!/bin/sh&lt;/span&gt;
&lt;span&gt;# exec /path/to/this/file/nasabg&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# note the nasa image of the day only returns one RSS entry, so we are&lt;/span&gt;
&lt;span&gt;# not concerned with parsing multiple entries.&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;# this is, obviously, a hack, that is likely to break at the slightest&lt;/span&gt;
&lt;span&gt;# change of NASA's RSS implementation. yay standards!                                       &lt;/span&gt;
&amp;nbsp;
&lt;span&gt;rss&lt;/span&gt;=&lt;span&gt;`&lt;/span&gt;&lt;span&gt;wget&lt;/span&gt; &lt;span&gt;-q&lt;/span&gt; &lt;span&gt;-O&lt;/span&gt; - http:&lt;span&gt;//&lt;/span&gt;www.nasa.gov&lt;span&gt;/&lt;/span&gt;rss&lt;span&gt;/&lt;/span&gt;lg_image_of_the_day.rss&lt;span&gt;`&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;img_url&lt;/span&gt;=&lt;span&gt;`&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt; &lt;span&gt;$rss&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; &lt;span&gt;grep&lt;/span&gt; &lt;span&gt;-o&lt;/span&gt; &lt;span&gt;'&amp;lt;enclosure [^&amp;gt;]*&amp;gt;'&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; &lt;span&gt;grep&lt;/span&gt; &lt;span&gt;-o&lt;/span&gt; &lt;span&gt;'http://[^\&amp;quot;]*'&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;img_name&lt;/span&gt;=&lt;span&gt;`&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt; &lt;span&gt;$img_url&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; &lt;span&gt;grep&lt;/span&gt; &lt;span&gt;-o&lt;/span&gt; &lt;span&gt;&amp;#91;&lt;/span&gt;^&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;\.\&lt;span&gt;w&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;$&lt;span&gt;`&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;mkdir&lt;/span&gt; &lt;span&gt;-p&lt;/span&gt; ~&lt;span&gt;/&lt;/span&gt;.backgrounds
&amp;nbsp;
&lt;span&gt;wget&lt;/span&gt; &lt;span&gt;-q&lt;/span&gt; &lt;span&gt;-O&lt;/span&gt; ~&lt;span&gt;/&lt;/span&gt;.backgrounds&lt;span&gt;/&lt;/span&gt;&lt;span&gt;$img_name&lt;/span&gt; &lt;span&gt;$img_url&lt;/span&gt;
&amp;nbsp;
gconftool-&lt;span&gt;2&lt;/span&gt; &lt;span&gt;-t&lt;/span&gt; string &lt;span&gt;--set&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;desktop&lt;span&gt;/&lt;/span&gt;gnome&lt;span&gt;/&lt;/span&gt;background&lt;span&gt;/&lt;/span&gt;picture_filename ~&lt;span&gt;/&lt;/span&gt;.backgrounds&lt;span&gt;/&lt;/span&gt;&lt;span&gt;$img_name&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;From a developer&amp;#8217;s standpoint, I think &lt;a href=&quot;http://www.nasa.gov/rss/index.html&quot;&gt;NASA&amp;#8217;s RSS feeds&lt;/a&gt; are a great step in the right direction. but this is also an example of an area that, by going just a few steps farther, we could expose hundreds of gigabytes of images a day in ways that would allow developers to actually &lt;em&gt;build&lt;/em&gt; on this content, and not just view or scrape it. A rest API where you could query based on mission, image size, instrument, image type, planet, year, etc. would be truly amazing!&lt;/p&gt;</description>
	<pubDate>Sun, 22 Nov 2009 04:57:49 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: Colourizing Python Print Statements</title>
	<guid>http://blog.quaternio.net/?p=380</guid>
	<link>http://blog.quaternio.net/2009/05/18/colourizing-python-print-statements/</link>
	<description>Lately I find myself writing a lot of python scripts that involves a ton of text flying by, and me inventing increasingly creative combinations of obscure symbols to delineate different portions of the output. Luckily, if you&amp;#8217;re not using windows using a sensible operating system, then you probably have an underappreciated tool at your disposal&amp;#8211; [...]</description>
	<pubDate>Sun, 22 Nov 2009 04:57:43 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: JSON Encoding and Decoding with Custom Objects in Python</title>
	<guid>http://blog.quaternio.net/?p=355</guid>
	<link>http://blog.quaternio.net/2009/07/16/json-encoding-and-decoding-with-custom-objects-in-python/</link>
	<description>The JSON module supports encoding (aka serializing) for all the basic built-in python types&amp;#8211; strings, lists, dictionaries, tuples,  etc. but if you have your own user-defined class that you want to store, I found the documentation to be pretty ambiguous. And since I also didnt see any complete examples out there of custom object [...]</description>
	<pubDate>Sun, 22 Nov 2009 04:57:36 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: Ssh-Agent Forwarding</title>
	<guid>http://blog.quaternio.net/?p=434</guid>
	<link>http://blog.quaternio.net/2009/11/04/ssh-agent-forwarding/</link>
	<description>For some reason this seems confusing&amp;#8211; but it isn&amp;#8217;t! That said, I always forget the specifics. Here&amp;#8217;s how you use ssh-agent to do key forwarding to remove machines. 
On your local machine, execute:

eval `ssh-agent`

Note the back ticks around ssh-agent. you need to eval this, not run it!
Now you need to add the identities you want [...]</description>
	<pubDate>Sun, 22 Nov 2009 04:57:28 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: Direct Data</title>
	<guid>http://blog.quaternio.net/?p=433</guid>
	<link>http://blog.quaternio.net/2009/11/15/direct-data/</link>
	<description>It is the end of science. Science as hypothesis is giving way to science as statistically derived by large data sets. We&amp;#8217;re finding in many cases that data mining algorithms applied to loosely specified models leads to better results than finely tuned models derived from theoretical equations [see the unreasonable effectiveness of data (pdf)]. 
It&amp;#8217;s [...]</description>
	<pubDate>Sun, 15 Nov 2009 09:03:07 +0000</pubDate>
</item>
<item>
	<title>Jessy Cowan-Sharp: Cities are Human Settlements</title>
	<guid>http://blog.quaternio.net/?p=448</guid>
	<link>http://blog.quaternio.net/2009/11/05/cities-are-human-settlements/</link>
	<description>My two passions have always been the quantitative study of social dynamics, and community. How can we detect and understand patterns in human social interactions? What does that say about their role in, or relationship to, natural properties of the universe? If we can use observed patterns in human dynamics to reverse engineer properties of [...]</description>
	<pubDate>Fri, 06 Nov 2009 07:57:45 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Please date food</title>
	<guid>http://progrium.livejournal.com/235267.html</guid>
	<link>http://progrium.livejournal.com/235267.html</link>
	<description>At the Dojo, somebody left a note on the fridge:&lt;br /&gt;&lt;br /&gt;&quot;Please date food.&quot;&lt;br /&gt;&lt;br /&gt;Somebody crossed out date and wrote &quot;marry.&quot; &lt;br /&gt;&lt;br /&gt;Later, somebody crossed out marry and wrote, &quot;cheat on.&quot; &lt;br /&gt;&lt;br /&gt;Somebody else wrote along the side &quot;+1 for marrying food.&quot;</description>
	<pubDate>Fri, 06 Nov 2009 04:33:36 +0000</pubDate>
</item>
<item>
	<title>Chad Austin: 9 Reasons Why MinTTY is the Best Terminal on Windows</title>
	<guid>http://chadaustin.me/?p=1473</guid>
	<link>http://chadaustin.me/2009/10/reasons-why-mintty-is-the-best-terminal-on-windows/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/mintty/&quot;&gt;MinTTY&lt;/a&gt; is a fantastic piece of software that smoothes some of the edges of the Windows command line experience.  You should use it and here&amp;#8217;s why:&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;1&quot;&gt;&lt;li&gt;MinTTY comes with Cygwin&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Installing MinTTY is trivial: just select the mintty package in Cygwin&amp;#8217;s setup.exe and point your Cygwin shortcut to &lt;code&gt;C:\cygwin\bin\mintty.exe -&lt;/code&gt;.  The trailing hyphen is important.&lt;/p&gt;

&lt;a href=&quot;http://aegisknight.org/wp-uploads/mintty_setup.png&quot;&gt;&lt;img src=&quot;http://aegisknight.org/wp-uploads/mintty_setup-300x215.png&quot; alt=&quot;MinTTY Setup&quot; title=&quot;MinTTY Setup&quot; width=&quot;300&quot; height=&quot;215&quot; class=&quot;aligncenter size-medium wp-image-1474&quot; /&gt;&lt;/a&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;2&quot;&gt;&lt;li&gt;Sane copy and paste&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;By default, MinTTY copies on select and pastes on right-click, just like Linux.  However, you can make it behave like a typical Windows application and show a context menu upon right-click.&lt;/p&gt;

&lt;a href=&quot;http://aegisknight.org/wp-uploads/mintty_right_click.png&quot;&gt;&lt;img src=&quot;http://aegisknight.org/wp-uploads/mintty_right_click-300x146.png&quot; alt=&quot;MinTTY Context Menu&quot; title=&quot;MinTTY Context Menu&quot; width=&quot;300&quot; height=&quot;146&quot; class=&quot;aligncenter size-medium wp-image-1481&quot; /&gt;&lt;/a&gt;

&lt;p&gt;I won&amp;#8217;t bother explaining how difficult copying and pasting is in standard Windows consoles.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;3&quot;&gt;&lt;li&gt;Resizing&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;MinTTY supports arbitrary window sizes, including maximized.  Enough said.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;4&quot;&gt;&lt;li&gt;Works with less/emacs/ssh&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Because MinTTY is based on PuTTY, it doesn&amp;#8217;t display output strangely when running emacs over ssh, among other examples.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;5&quot;&gt;&lt;li&gt;It&amp;#8217;s &lt;em&gt;FAST&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Anyone who has done command line work on Windows has surely noticed that, when a program spews output to the console, system performance nosedives.  Sometimes, even the mouse cursor skips, making it hard to kill the program responsible.&lt;/p&gt;

&lt;p&gt;MinTTY doesn&amp;#8217;t have this problem &amp;#8212; it uses minimal CPU, even under heavy load.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;6&quot;&gt;&lt;li&gt;Doesn&amp;#8217;t bypass RSI Guard&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Five years ago, I was diagnosed with repetitive stress injuries from programming.  To make matters worse, I get obsessive when I work, and nothing can pull me away from the keyboard.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.rsiguard.com/&quot;&gt;RSI Guard&lt;/a&gt; keeps my wrists and elbows pain-free by enforcing short, periodic breaks.  However&amp;#8230;  years of exposure to RSI Guard has caused me to discover its holes.  For example, native console windows bypass RSI Guard&amp;#8217;s protection, so when RSI Guard blocked keyboard and mouse input, I would quickly switch to typing in a console window and continue to work.  Because MinTTY is a standard Windows application, it closes this backdoor.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;7&quot;&gt;&lt;li&gt;Closes even when programs are backgrounded&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Open a fresh Cygwin and type &lt;code&gt;notepad &amp;amp;&lt;/code&gt; followed by &lt;code&gt;exit&lt;/code&gt;.  The Cygwin console sticks open until you close Notepad.&lt;/p&gt;

&lt;p&gt;In MinTTY, you can always close the window, no matter how many background processes you&amp;#8217;ve started.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;8&quot;&gt;&lt;li&gt;Alt-F2 opens a new terminal window&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Pure convenience: Alt-F2 opens a new terminal.  No need to reach for the mouse.&lt;/p&gt;

&lt;ol class=&quot;boldbullets&quot; start=&quot;9&quot;&gt;&lt;li&gt;Shift-PageUp and Shift-PageDown!&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;For rapidly paging through previous lines of output, you can press Shift-PageUp and Shift-PageDown, just like the Linux console.  Another huge convenience.&lt;/p&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/chadaustin/~4/4KpZNox6Axw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 20 Oct 2009 08:33:42 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Page One</title>
	<guid>http://progrium.livejournal.com/235194.html</guid>
	<link>http://progrium.livejournal.com/235194.html</link>
	<description>Hacker Dojo == Hacker Heaven&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/progrium/4017351989/&quot; title=&quot;Dojo on front of Mercury News by progrium, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2630/4017351989_c068b32395.jpg&quot; width=&quot;375&quot; height=&quot;500&quot; alt=&quot;Dojo on front of Mercury News&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, the city of Mountain View sent us their congratulations. They say the Major wants to meet us.</description>
	<pubDate>Sat, 17 Oct 2009 00:21:57 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Combat Tanks</title>
	<guid>http://progrium.livejournal.com/234978.html</guid>
	<link>http://progrium.livejournal.com/234978.html</link>
	<description>I'm bringing back the game developer within. I will now develop a series of awesome, simple, but increasingly scoped networked multiplayer games in Flash using Flixel. First on the list is Combat Tanks. &lt;a href=&quot;http://combat-tanks.com&quot;&gt;Play the alpha preview!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mostly developed in the 3 days of &lt;a href=&quot;http://tigjam.com&quot;&gt;TIGJam&lt;/a&gt;, it's a remake of a favorite Windows 3.1 game. There are still bugs and major features missing, but it will be awesome and it will take the Internet by storm. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/progrium/4003230235/&quot; title=&quot;Combat Tanks by progrium, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2596/4003230235_ba3181fbe5.jpg&quot; width=&quot;500&quot; height=&quot;360&quot; alt=&quot;Combat Tanks&quot; /&gt;&lt;/a&gt;</description>
	<pubDate>Fri, 16 Oct 2009 09:45:41 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: Johnny 5</title>
	<guid>http://progrium.livejournal.com/234466.html</guid>
	<link>http://progrium.livejournal.com/234466.html</link>
	<description>&lt;center&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3466/3978751381_298a6e74b7.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://johnnysegway.ytmnd.com/&quot;&gt;See it in action.&lt;/a&gt;&lt;/strong&gt;&lt;/center&gt;</description>
	<pubDate>Sun, 04 Oct 2009 09:02:48 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: Fatty</title>
	<guid>http://www.egometry.com/?p=924</guid>
	<link>http://www.egometry.com/magic-slang/fatty/</link>
	<description>&lt;p&gt;Fatty. (Noun)&lt;/p&gt;
&lt;p&gt;A big creature. Fatness starts around 4/4 and never ends from there.&lt;/p&gt;
&lt;p&gt;&amp;#8220;I love the fatties.&amp;#8221;&lt;/p&gt;</description>
	<pubDate>Thu, 24 Sep 2009 09:21:56 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: Files, and the editing thereof.</title>
	<guid>http://www.egometry.com/?p=905</guid>
	<link>http://www.egometry.com/gruedorf/files-and-the-editing-thereof/</link>
	<description>&lt;div&gt;&lt;a href=&quot;http://www.egometry.com/i/2009/09/2009-09-22.jpg&quot; rel=&quot;lightbox[pics905]&quot; title=&quot;A screenshot of a control panel page.  Woo?&quot;&gt;&lt;img src=&quot;http://www.egometry.com/i/2009/09/2009-09-22.thumbnail.jpg&quot; alt=&quot;2009-09-22&quot; width=&quot;169&quot; height=&quot;200&quot; class=&quot;attachment wp-att-906 alignleft&quot; /&gt;&lt;/a&gt;
&lt;p class=&quot;wp-caption-text&quot;&gt;The most pedestrian screenshot ever.  To what depths has this once-mighty work-journal fallen?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;My &lt;a href=&quot;http://www.johnweng.com/gruedorf/&quot;&gt;gruedorf&lt;/a&gt; showings are shameful of late, and so are all of yours.  The only one holding the line at this moment is Ustor.  Perhaps this should be called &amp;#8220;UstorUstor&amp;#8221;.  Or &amp;#8220;TorUs&amp;#8221;.&lt;/p&gt;
&lt;p&gt;At any rate, my small token to personal projects this week is the file management section&amp;#8217;s edit page.  Woo, now you can edit your files once they exist.  Necessary, and very quotidian to a web developer.&lt;/p&gt;
&lt;p&gt;Up next on this mystical journey is the upload section&amp;#8217;s frontpage, featuring most downloaded recently, newest files, and staff picks (aka, &lt;a href=&quot;http://verge-rpg.com/demoalarm/&quot;&gt;Demo Alarms&lt;/a&gt;).  After that, we&amp;#8217;re a docs section from release.  At this point, I think I should screen-scrape my old site&amp;#8217;s documentation and import all of that into a wiki.  Anyone have objections?&lt;/p&gt;</description>
	<pubDate>Tue, 22 Sep 2009 07:27:31 +0000</pubDate>
</item>
<item>
	<title>Michael Rooney: wxBanker 0.6 preview available, now with recurring transactions!</title>
	<guid>tag:blogger.com,1999:blog-3369913276619133519.post-4135404130931013098</guid>
	<link>http://feedproxy.google.com/~r/mrooney/~3/F1K-WmSUlgo/wxbanker-06-preview-available-now-with.html</link>
	<description>I've just released wxBanker 0.5.9 in &lt;a href=&quot;https://launchpad.net/~mrooney/+archive/wxbanker-testing&quot;&gt;the wxbanker-testing PPA&lt;/a&gt;, which is a preview release for 0.6. If you aren't familiar with wxBanker already, it is a cross-platform, lightweight personal finance application, and you can find more info at &lt;a href=&quot;https://launchpad.net/wxbanker&quot;&gt;https://launchpad.net/wxbanker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While there are &lt;a href=&quot;https://launchpad.net/wxbanker/+milestone/0.6&quot;&gt;many improvements and fixes&lt;/a&gt; in 0.6, the main feature is recurring transactions, allowing you to automate repetitive transactions. They are functional in 0.5.9 with one caveat and the purpose of this preview release: there's no way (besides sqlitebrowser :) to modify existing recurring transactions. As such I'd love to get feedback on your impressions of recurring transactions, ideas on a nice configuration UI for them, and of course general feedback. With this I can implement the configuration UI and release 0.6.&lt;br /&gt;&lt;br /&gt;Here's an example of a simple quarterly transaction:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_HU7L5oFDSeA/Srcm3zebZLI/AAAAAAAAAX4/Ui32D2TBg88/s1600-h/wxbanker-recurring-simple.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/_HU7L5oFDSeA/Srcm3zebZLI/AAAAAAAAAX4/Ui32D2TBg88/s400/wxbanker-recurring-simple.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5383814619697210546&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and here is a more complex one, with specific days chosen, as well as the transaction being a transfer from another account:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_HU7L5oFDSeA/Srcl91BFwWI/AAAAAAAAAXw/ANaBFZ7W9PI/s1600-h/wxbanker-recurring.png&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_HU7L5oFDSeA/Srcl91BFwWI/AAAAAAAAAXw/ANaBFZ7W9PI/s400/wxbanker-recurring.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5383813623678615906&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When you start up wxBanker and there is a recurring transaction due, you will see something like:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/SrcqtaCE55I/AAAAAAAAAYI/FsSU097v09M/s1600-h/Screenshot-wxBanker-1.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/SrcqtaCE55I/AAAAAAAAAYI/FsSU097v09M/s400/Screenshot-wxBanker-1.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5383818839115229074&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I didn't reinvent recurrence rules but instead (luckily) found the dateutil module for python which includes rrule, an &quot;implementation of the recurrence rules documented in the &lt;a href=&quot;http://www.ietf.org/rfc/rfc2445.txt&quot;&gt;iCalendar RFC&lt;/a&gt;&quot;, so it should behave quite well.&lt;br /&gt;&lt;br /&gt;As far as the needed configuration UI goes, there are a couple ideas that I've had so far. Below is the current top-left portion of the UI, for reference:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/Srco-UL023I/AAAAAAAAAYA/MvdtcqO5lwc/s1600-h/wxbanker-topleft.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_HU7L5oFDSeA/Srco-UL023I/AAAAAAAAAYA/MvdtcqO5lwc/s400/wxbanker-topleft.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5383816930580028274&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One idea was to have a third &quot;Recurring Transactions&quot; tab after the &quot;Transactions&quot; and &quot;Summary&quot; tabs, which appears if and only if recurring transactions exist. This would provide a list of recurring transactions and allow editing them via the same UI used for creation, as well as changing the account or removing them altogether. A second idea is to add another button next to the Add/Rename/Remove account buttons in the upper-left, for account configuration (this will be necessary for future features anyway), and allow modifying recurring transactions for that account there.&lt;br /&gt;&lt;br /&gt;Another perhaps complementary way would be to provide a right-click action on existing transactions which were recurred, for editing. I'd also like to implement functionality similar to Google Calendar where editing a value on an existing transaction caused by a recurring transaction will ask you if you want to apply that change to just this transaction, all existing, or all future.&lt;br /&gt;&lt;br /&gt;If you have ideas, please feel free to leave comments here or drop by #wxbanker on irc.freenode.net any time this week after 10AM PDT, to have a more interactive chat about them. &lt;br /&gt;&lt;br /&gt;Please do let me know what you think from either just the screenshots here or actually playing around with the application!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3369913276619133519-4135404130931013098?l=mrooney.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/mrooney/~4/F1K-WmSUlgo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 21 Sep 2009 01:29:01 +0000</pubDate>
	<author>noreply@blogger.com (Michael)</author>
</item>
<item>
	<title>Chuck Rector: I don't like IDEs anymore.</title>
	<guid>tag:blogger.com,1999:blog-3327768276254607141.post-4880304400563548920</guid>
	<link>http://choosetheforce.blogspot.com/2009/09/i-dont-like-ides-anymore.html</link>
	<description>&lt;p&gt;I spent seven or eight years using Eclipse as my primary development environment. I never really questioned it until I switched jobs and saw some of the mavericks using Emacs, Vim, and command shells. I decided to become fluent in Emacs, and have been using it daily for the past couple years now.&lt;/p&gt;

&lt;p&gt;Thinking about it now, it's most interesting to me that I never looked back and said &quot;Gee, life was so much better back in the IDE days.&quot; Hell no. In my mind, Eclipse is a sofa and Emacs is a treadmill. I have a goal, I'm on task, I know what I want to do and I do it.&lt;/p&gt;

&lt;p&gt;My big fancy IDE mentality was all about victimization, blame, and laziness. &quot;Big fancy IDE crash! No my fault.&quot; &quot;Big fancy IDE get confoozed and lie! I do bad thing, oops!!&quot; &quot;Big fancy IDE slow on big project, me play while wait!&quot; &quot;Big fancy IDE big and fancy! It break, I no no why. I confoozed.&quot;

&lt;p&gt;My Emacs mentality is scientific, hands-on, and active. I can count on one hand the number of times GNU Emacs has ever crashed on me. Emacs doesn't happily chew on gigs of files in the background, caching data that I could give two shits about. When I want something, I ask for it explicitly. My UX isn't impacted by background tasks that are attempting to read my mind, because there's only ever one task: the one I'm doing right now.&lt;/p&gt;

&lt;p&gt;Being born into royalty and pampered for so many years feels nice, but over time it just turned me into a fat lazy slob with a soft mushy brain. It trained me to surrender my critical thinking skills. Emacs and command shells forced me to learn how to tie my own shoes and make my own meals. I enjoy the independence and self-reliance.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I tried Komodo today, at the recommendation of a coworker, and it has a nice polished look, but it reminds me too much of Eclipse. The editor looks as though it is based on Scintilla, which is cool. I am a fan of SciTE. The background churn as it attempts to cache everything under the sun makes the UI sluggish and choppy, which blows my mind. I'm running a quad core with buttloads of memory on an SSD. Come on, man. Seriously?&lt;/p&gt;

&lt;p&gt;These are only my first impressions, so I'm going to keep at it for at least a couple weeks to get a real feel for it. Maybe I can right some wrongs, but I get the sense it's never going to feel as light and razor sharp as Emacs.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3327768276254607141-4880304400563548920?l=choosetheforce.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 20 Sep 2009 03:41:00 +0000</pubDate>
	<author>noreply@blogger.com (卡车 Chuck)</author>
</item>
<item>
	<title>Jeff Lindsay: Interview on the uses of webhooks</title>
	<guid>http://blog.webhooks.org/?p=195</guid>
	<link>http://blog.webhooks.org/2009/09/18/interview-on-the-uses-of-webhooks/</link>
	<description>&lt;p&gt;A while back I was &lt;a href=&quot;http://www.nearsoft.com/blog/Introduction-to-Webhooks-and-An-Evangelist.html&quot;&gt;interviewed on the Nearsoft blog&lt;/a&gt; about webhooks. It goes into more details on the whole push, pipes and plugin use cases. Real-time web is a hot topic these days, so I had to mention how the webhooks movement relates to that trend. Here&amp;#8217;s an excerpt about using webhooks for real-time notifications:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Notifications seem to be [a big draw for webhooks] &amp;#8230; as in, tell me when something new has been posted, or when something has changed. But with your code on the receiving end of the notification, you can decide exactly how you get notified. For example, tell me about changes over Twitter, not email. In fact, no, use this other hook script that uses cloud telephony to call my cell phone and use text-to-speech to tell me.&lt;/p&gt;
&lt;p&gt;Real-time notifications, exactly how you want them.&lt;/p&gt;&lt;/blockquote&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/webhooks.wordpress.com/195/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/webhooks.wordpress.com/195/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.webhooks.org&amp;blog=5379000&amp;post=195&amp;subd=webhooks&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 19 Sep 2009 00:49:24 +0000</pubDate>
</item>
<item>
	<title>Jeff Lindsay: HookPress brings webhooks to WordPress!</title>
	<guid>http://blog.webhooks.org/?p=191</guid>
	<link>http://blog.webhooks.org/2009/09/18/hookpress-brings-webhooks-to-wordpress/</link>
	<description>&lt;p&gt;So much has been going on in the world of webhooks that it&amp;#8217;s hard to keep up. From &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/wiki/Companies&quot;&gt;PubSubHubbub developments&lt;/a&gt;, to new services supporting webhooks &amp;#8230; to this plugin for WordPress called &lt;a href=&quot;http://wordpress.org/extend/plugins/hookpress/&quot;&gt;HookPress&lt;/a&gt;. HookPress opens the WordPress plugin API over webhooks! It was developed by my new buddy &lt;a href=&quot;http://mitcho.com/&quot;&gt;Mitcho&lt;/a&gt;. He made an excellent &lt;a href=&quot;http://wordpress.tv/2009/09/13/introduction-to-hookpress/&quot;&gt;screencast&lt;/a&gt; to demonstrate the power of HookPress, and the power of the emerging webhooks ecosystem. Check it out:&lt;/p&gt;
&lt;div id=&quot;x-video-0&quot; class=&quot;video-player&quot;&gt;

&lt;/div&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/webhooks.wordpress.com/191/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/webhooks.wordpress.com/191/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=blog.webhooks.org&amp;blog=5379000&amp;post=191&amp;subd=webhooks&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;div&gt;&lt;a href=&quot;http://blog.webhooks.org/2009/09/18/hookpress-brings-webhooks-to-wordpress/&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://videos.videopress.com/25KHD2dF/hookpress-webhooks-intro_std.original.jpg&quot; width=&quot;160&quot; height=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 19 Sep 2009 00:40:16 +0000</pubDate>
</item>
<item>
	<title>Joseph Mathes: Maybe this will get me posting again</title>
	<guid>http://joblivious.wordpress.com/?p=615</guid>
	<link>http://joblivious.wordpress.com/2009/09/16/maybe-this-will-get-me-posting-again/</link>
	<description>&lt;p&gt;3k hits a day&amp;#8217;s what this blog struck&lt;br /&gt;
down to none now; it&amp;#8217;s run by a slack schmuck&lt;br /&gt;
so I picked a slick schmuck cure; &lt;br /&gt;
strict limerick structure&lt;br /&gt;
if it works, &lt;a href=&quot;http://joblivious.wordpress.com/2009/03/29/restrictions-fuel-creativity-and-thats-why-stealth-games-were-invented/&quot;&gt;I was right&lt;/a&gt;. Wish me luck!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/joblivious.wordpress.com/615/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/joblivious.wordpress.com/615/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=joblivious.wordpress.com&amp;blog=6486443&amp;post=615&amp;subd=joblivious&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 16 Sep 2009 13:52:23 +0000</pubDate>
</item>
<item>
	<title>Benjamin McGraw: vrpg beta work continues</title>
	<guid>http://www.egometry.com/?p=902</guid>
	<link>http://www.egometry.com/gruedorf/vrpg-beta-work-continues/</link>
	<description>&lt;p&gt;I&amp;#8217;ve mainly been dealing with code concerning the files section.  I&amp;#8217;ve improved the quality of the upload process, corrected the file lineage graph and made strides towards a saner system, have made it so you can comment upon file entries, and made it so anyone can upload screenshots of any file.&lt;/p&gt;
&lt;p&gt;Also I made an schema-application tool to keep track of which .sql files have been applied in what environment.  Trust me, this is useful.&lt;/p&gt;
&lt;p&gt;So where did I go for two months, far, far away from Gruedorf?  I honestly can say I was shocked to crack open this dev folder to find the last svn log from &lt;em&gt;July 10&lt;/em&gt;.  So wherever I went, it didn&amp;#8217;t seem as long as it was. :(&lt;/p&gt;</description>
	<pubDate>Mon, 07 Sep 2009 20:59:13 +0000</pubDate>
</item>

</channel>
</rss>
