<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Semicolon</title>
	
	<link>http://thunderguy.com/semicolon</link>
	<description>Software, the Internet and you.</description>
	<lastBuildDate>Tue, 02 Apr 2013 03:07:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/semicolon" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="semicolon" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>jQuery.waitFor plugin</title>
		<link>http://thunderguy.com/semicolon/2013/04/02/jquery-waitfor-plugin/</link>
		<comments>http://thunderguy.com/semicolon/2013/04/02/jquery-waitfor-plugin/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 03:07:52 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[waitFor]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=698</guid>
		<description><![CDATA[Sometimes jQuery(document).ready() isn&#8217;t fast enough. It doesn&#8217;t do anything until the entire DOM has loaded. But sometimes you want your code to run against your DOM elements immediately rather than waiting until the rest of the page DOM is done. You can do this with jQuery.waitFor, a new plugin. Usage waitFor uses jQuery&#8217;s Deferred API, [...]]]></description>
				<content:encoded><![CDATA[<p>Sometimes <code>jQuery(document).ready()</code> isn&#8217;t fast enough. It doesn&#8217;t do anything until the entire DOM has loaded. But sometimes you want your code to run against your DOM elements immediately rather than waiting until the rest of the page DOM is done. You can do this with <strong>jQuery.waitFor</strong>, a new plugin.<span id="more-698"></span></p>
<h3>Usage</h3>
<p><strong>waitFor</strong> uses jQuery&#8217;s <a href="http://api.jquery.com/category/deferred-object/">Deferred API</a>, so its usage is clean and consistent with the rest of jQuery&#8217;s event-handling functions. To use it, call <code>jQuery.waitFor()</code> with a selector, and then call <code>done(function() {...})</code> on the result. As soon as an element appears in the DOM that matches the given selector, your function will be called, with a jQuery object containing the matched element (or elements) as the argument. If the DOM already contains matching elements, the function will be called immediately.</p>
<p>You can also call <code>fail(function() {...})</code> on <code>waitFor</code>&#8216;s return value to trigger a callback if the element has <em>not</em> appeared by the time the full DOM is loaded.</p>
<h3>Example</h3>
<pre><code>$.waitFor("header")
    .done(function(elements) { elements.addClass("fancy"); })
    .fail(function() { $("body").append("&lt;p&gt;Huh?&lt;/p&gt;"); })</code></pre>
<p>This will add the class &#8220;fancy&#8221; to the HTML5 header element as soon as it is loaded. If it hasn&#8217;t appeared by the time the document is ready, it adds a new element to the end of the document instead.</p>
<h3>Download</h3>
<p>Download waitFor from the <a href="http://plugins.jquery.com/waitFor/">jQuery plugin page</a>.</p>
<p>You can also <a href="https://github.com/bennettmcelwee/jQuery.waitFor">fork waitFor at Github</a>. Please test it and send me your pull requests.</p>
<h3>Usage notes</h3>
<p>The function works by polling the DOM at short intervals. By default it polls every 23 milliseconds, but you can change this by setting <code>$.waitFor.defaultIntervalMs</code> before calling <code>$.waitFor()</code>. Alternatively you can pass something like <code>{intervalMs: 100}</code> as the third argument the first time you call <code>$.waitFor()</code>. But don&#8217;t bother changing this unless you really know what you&#8217;re doing.</p>
<p><strong>waitFor</strong> returns a jQuery <a href="http://api.jquery.com/Types/#Promise">Promise</a> object, so apart from <code>done()</code> and <code>fail()</code>, you can also call other methods on it like <code>always()</code> and <code>then()</code>. See the <a href="http://api.jquery.com/Types/#Promise">documentation</a> for full details.</p>
<p>In order for waitFor to be useful, you will probably want to include the plugin code in your document <code>head</code>. Therefore you will also need to include jQuery in the <code>head</code>.</p>
<p>waitFor works by polling the DOM to see if anything matches the selector. Therefore if the selector is particularly slow to evaluate, there may be performance problems. So don&#8217;t do that!</p>
<h3>History</h3>
<p>More than 5 years ago(!) I wrote a plugin called <a href="http://thunderguy.com/semicolon/2007/08/14/elementready-jquery-plugin/">elementReady</a> that does the same thing as waitFor. It worked well but had some restrictions (for performance) and its usage syntax was not beautiful. After jQuery&#8217;s <a href="http://api.jquery.com/category/deferred-object/">Deferred API</a> came out, I tinkered with rewriting elementReady to use it, since it seemed a natural fit. As part of this, I renamed it so code using it would read better: <code>$.waitFor(something).done(callback)</code>. And finally, last month I realised that the jQuery folks had upgraded their plugin site, so I thought I would finally release <strong>waitFor</strong> to the world.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/So2EalW0oyM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2013/04/02/jquery-waitfor-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making Things Happen</title>
		<link>http://thunderguy.com/semicolon/2012/04/20/making-things-happen/</link>
		<comments>http://thunderguy.com/semicolon/2012/04/20/making-things-happen/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 00:26:08 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=685</guid>
		<description><![CDATA[Scott Berkun offers a great excerpt from his book Making Things Happen. He views project management as basically managing priorities: Everything can be represented in an ordered list. Most of the work of project management is correctly prioritizing things and leading the team in carrying them out. The three most basic ordered lists are: project [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/0596517718/ref=as_li_ss_il?ie=UTF8&#038;tag=thunderguycom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0596517718"><img src="http://thunderguy.com/semicolon/wp/wp-content/uploads/2012/04/0596517718.01.jpg" alt="" title="Making Things Happen" width="381" height="500" class="alignnone size-full wp-image-686" /></a><img src="http://www.assoc-amazon.com/e/ir?t=thunderguycom-20&#038;l=as2&#038;o=1&#038;a=0596517718" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>Scott Berkun offers a great <a href="http://www.scottberkun.com/blog/2012/how-to-make-things-happen/">excerpt</a> from his book <a href="http://www.amazon.com/gp/product/0596517718/ref=as_li_ss_il?ie=UTF8&#038;tag=thunderguycom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0596517718">Making Things Happen</a>. He views project management as basically managing priorities:</p>
<ul>
<li>Everything can be represented in an ordered list. Most of the work of project management is correctly prioritizing things and leading the team in carrying them out.</li>
<li>The three most basic ordered lists are: project goals (vision), list of features, and list of work items. They should always be in sync with each other. Each work item contributes to a feature, and each feature contributes to a goal.</li>
</ul>
<p><span id="more-685"></span></p>
<p>And he has some excellent nuggets on management too:</p>
<ul>
<li>There is a bright yellow line between priority 1 work and everything else.</li>
<li>Things happen when you say no. If you can’t say no, you effectively have no priorities.</li>
<li>The PM has to keep the team honest and keep them close to reality.</li>
<li>Knowing the critical path in engineering and team processes enables efficiency.</li>
<li>You must be both relentless and savvy to make things happen.</li>
</ul>
<p>Go and <a href="http://www.scottberkun.com/blog/2012/how-to-make-things-happen/">read it now</a> and then send the link to the <a href="http://en.wikipedia.org/wiki/Pointy-haired_Boss">pointy-haired boss</a> in your life.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/4XbP9C5X_tM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2012/04/20/making-things-happen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Adobe Refresh 2012</title>
		<link>http://thunderguy.com/semicolon/2012/04/17/adobe-refresh-2012/</link>
		<comments>http://thunderguy.com/semicolon/2012/04/17/adobe-refresh-2012/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 03:05:19 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[DreamWeaver]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Photoshop]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=678</guid>
		<description><![CDATA[Last month I attended Adobe&#8217;s Refresh 2012 event. This is a roadshow where they present highlights from the current and upcoming product line for designers and developers. They talked about the future of Flash and their product strategy, and they showed some very neat tools. Refresh 2012 in Auckland was held at the gracious Rialto [...]]]></description>
				<content:encoded><![CDATA[<p>Last month I attended Adobe&#8217;s <a href="http://www.adobe.com/sea/special/adoberefresh2012/">Refresh 2012</a> event. This is a roadshow where they present highlights from the current and upcoming product line for designers and developers. They talked about the future of Flash and their product strategy, and they showed some very neat tools.<span id="more-678"></span></p>
<p>Refresh 2012 in Auckland was held at the gracious <a href="http://www.rialto.co.nz/">Rialto Cinema</a> in Newmarket. I&#8217;ve seen a few great films there, so it was fun to see a software presentation instead. But probably not as much fun as <a href="http://www.foxsearchlight.com/slumdogmillionaire/">Slumdog Millionaire</a>.</p>
<h3>DreamWeaver</h3>
<p>The first part was a demo of new DreamWeaver features, particularly its integration with Adobe&#8217;s Creative Cloud. DreamWeaver hung a few times, and the demonstrator had to change his script to work around this. A few audience interjections suggested that DreamWeaver hanging is a common occurrence.</p>
<p>The presenter later decided that the problem was due to the flaky network connection in the venue. (This is no excuse! I really wish vendors would not insist on assuming that everybody has a perfect network connection. Windows has always been terrible in this regard &#8212; just yesterday our network printing services went down, and Microsoft Word hung for about 5 minutes when I tried to print.)</p>
<p>DreamWeaver now supports media queries for responsive design. It also works with <a href="http://jquerymobile.com/">jQuery Mobile</a>, and allows easy editing of jQuery Mobile themes. Speaking of that, he also demonstrated jQuery Mobile Themeroller&#8217;s nice integration with Adobe&#8217;s <a href="http://kuler.adobe.com/">Kuler</a> colour management tool.</p>
<h3>Typekit</h3>
<p>They showed <a href="https://typekit.com/">Typekit</a>, the webfont embedding service recently acquired by Adobe. It looks quite easy to use and also pretty inexpensive. But recently at <a href="http://www.webstock.org.nz/">Webstock</a>, <a href="http://jessicahische.is/awesome/">Jessica Hische</a> was lukewarm about it, recommending <a href="http://www.webtype.com/">Webtype</a> instead. And she should know: check out her URL.</p>
<h3>Proto</h3>
<p><a href="http://www.adobe.com/products/proto.html">Proto</a> is a quick prototype editor for Andriod and (soon) iOS. It enables you to quickly create a screen mockup, and it actually generates the HTML, CSS and JavaScript to implement it as you create it. Some features were a bit gimmicky. They claim that the generated code is good enough to actually serve as the starting point of development. If this is true then this is the first tool in the history of the Web that can actually generate good front-end code.</p>
<h3>Muse</h3>
<p><a href="http://labs.adobe.com/technologies/muse/">Muse</a> allows you to create static websites in a similar way to creating print layouts with tools like InDesign. Great for designers who are already familiar with Adobe&#8217;s toolset, as you can also include interactivity, slideshows, Google Maps integration, etc., all without writing any code. This appeals to many people, but I dread being the sucker who has to tweak the machine-generated code later.</p>
<p>Well, I&#8217;m sure the generated code has improved in the ten years since I last had to wrestle with DreamWeaver&#8217;s output. And Muse is still in beta, so they still have time to remove some of the suck from it.</p>
<h3>Edge</h3>
<p><a href="http://labs.adobe.com/technologies/edge/">Edge</a> is like the old Flash tools for creating animations and interactive content, except it produces HTML and JavaScript instead of Flash code. You can also add animations to existing HTML. This is evidence of Adobe&#8217;s plans for Flash: keep pushing it for high-performance games and video applications, but deprecate it for simpler stuff in favour of HTML. The world just became a slightly better place. And it may become even better when Edge makes it out of beta.</p>
<h3>PhoneGap</h3>
<p><a href="http://phonegap.com/">PhoneGap</a> is becoming more popular. It lets you develop cross-platform native mobile apps using Web technologies like HTML and JavaScript. It&#8217;s used by Wikipedia amongst many others. (Also the fun Untappd app.)</p>
<p>The core of PhoneGap is now under incubation at the Apache Software Foundation as <a href="http://incubator.apache.org/projects/callback.html">Apache Cordova</a>. PhoneGap is built on top of that and will eventually include stuff like Adobe product integration, while still remaining open source.</p>
<p>Support for PhoneGap is built in to DreamWeaver. PhoneGap actually supports mobile device APIs, so you can for example access location service, contacts, and the camera from your HTML/JS PhoneGap app. There are also plugins for specific application APIS such as Facebook.</p>
<p>Around this point, the presenter was going to give a demo of something or other in his iPhone. But during the break he unwisely decided to upgrade his iPhone&#8217;s OS. Version mismatch hilarity ensued, so we took an early lunch break so they could try to sort out the problem with help from some of the many experts in the audience. Sadly, even all that brainpower couldn&#8217;t solve the problem, so no demo for us. Even worse, the venue staff weren&#8217;t expecting the early lunch break, so the coffee wasn&#8217;t ready. I had to wait over 5 minutes for my latte. I think this is what they call a &#8220;first-world problem&#8221;.</p>
<p><a href="https://build.phonegap.com/">PhoneGap Build</a> is an online PhoneGap cross-compiler. It will produce iOS, Android, Windows Mobile, etc. versions of your PhoneGap app.</p>
<p><a href="http://debug.phonegap.com/">debug.phonegap.org</a> is an online remote debugger for PhoneGap apps. You can use the Chrome&#8217;s dev tools on your desktop to inspect and edit the DOM while your app is running on your mobile device. This is very cool! This tool is based on <a href="http://people.apache.org/~pmuellr/weinre/">weinre</a>, which has been folded into the Apache Cordova project and shoehorned into PhoneGap. But it does seem to work.</p>
<h3>Reflections for iPad</h3>
<p>For the iOS demos, they used <a href="http://www.reflectionapp.com/">Reflections</a>. It&#8217;s not an Adobe product &#8212; it&#8217;s just very neat. This app mirrors your iPad or iPhone screen onto a Mac. Presenting iOS apps is much, much easier this way. The only thing missing is that you can&#8217;t see the finger. Actually, that&#8217;s a good thing in most cases.</p>
<h3>Photoshop Touch</h3>
<p>The demo of <a href="http://www.photoshop.com/products/mobile/photoshoptouch">Photoshop Touch</a> was very compelling. US$10 gets you an iPhone version of Photoshop, with lots of easy-to-use photo-retouch tools. And they haven&#8217;t just shoehorned a cut-down PS into the iPad &#8212; they have taken advantage of the hardware with a nice touch interface and clever camera integration for quickly pulling photos and textures into your edits. There was a lot of buzz after the session about Photoshop Touch. I reckon they probably sold an extra hundred copies that day.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/1_2v8nqfT_M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2012/04/17/adobe-refresh-2012/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lean Software Development</title>
		<link>http://thunderguy.com/semicolon/2012/02/13/lean-software-development/</link>
		<comments>http://thunderguy.com/semicolon/2012/02/13/lean-software-development/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 00:27:32 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=669</guid>
		<description><![CDATA[Don&#8217;t jump to conclusions. Don&#8217;t join the Cult of Done. Wise words from Lean Software Development: An Agile Toolkit by Mary and Tom Poppendieck: In 1988 Harold Thimbleby published a paper in IEEE Software titled &#8220;Delaying Commitment.&#8221; He notes that when faced with a new situation, experts will delay firm decisions while they investigate the [...]]]></description>
				<content:encoded><![CDATA[<p>Don&#8217;t jump to conclusions. Don&#8217;t join the <a href="http://thunderguy.com/semicolon/2010/05/25/the-cult-of-next-manifesto/">Cult of Done</a>. Wise words from <em>Lean Software Development: An Agile Toolkit</em> by Mary and Tom Poppendieck:<span id="more-669"></span></p>
<blockquote><p>In 1988 Harold Thimbleby published a paper in IEEE Software titled &#8220;Delaying Commitment.&#8221; He notes that when faced with a new situation, experts will delay firm decisions while they investigate the situation, because they know that delaying commitments often leads to new insights. Amateurs, on the other hand, want to get everything completely right, so they tend to make early decisions, quite often the wrong ones. Once these early decisions are made, other decisions are built on them, making them devilishly difficult to change. Thimbleby notes that premature design commitment is a design failure mode that restricts learning, exacerbates the impact of defects, limits the usefulness of the product, and increases the cost of change.</p></blockquote>
<p><a href="http://www.amazon.com/gp/product/0321150783/ref=as_li_ss_il?ie=UTF8&#038;tag=thunderguycom-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321150783"><img src="http://thunderguy.com/semicolon/wp/wp-content/uploads/2012/02/lean-software-development.jpg" alt="" title="Lean Software Development" width="377" height="500" class="alignnone size-full wp-image-670" /></a><img src="http://www.assoc-amazon.com/e/ir?t=thunderguycom-20&#038;l=as2&#038;o=1&#038;a=0321150783" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/dluTNzK2C80" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2012/02/13/lean-software-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A spoonful of Git helps the Subversion go down</title>
		<link>http://thunderguy.com/semicolon/2012/01/25/a-spoonful-of-git-helps-the-subversion-go-down/</link>
		<comments>http://thunderguy.com/semicolon/2012/01/25/a-spoonful-of-git-helps-the-subversion-go-down/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 00:50:18 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.thunderguy.com/semicolon/?p=506</guid>
		<description><![CDATA[Here&#8217;s how I use Git to work on projects that use Subversion for version control. The basic idea is to use the Git master branch to track the Subversion trunk. All my coding happens on Git branches. That way I can use Git to easily work on multiple different features or bugfixes at once, with [...]]]></description>
				<content:encoded><![CDATA[<p>Here&#8217;s how I use Git to work on projects that use Subversion for version control. The basic idea is to use the Git master branch to track the Subversion trunk. All my coding happens on Git branches. That way I can use Git to easily work on multiple different features or bugfixes at once, with all the usual git benefits of disconnected operation, speed and flexibility. Then I commit to SVN when my work is ready.<span id="more-506"></span></p>
<p>So the basic workflow is to work in Git branches. To make sure the Git master and the Subversion trunk are in sync, I follow two basic rules. First, the only ways the Git master changes are:</p>
<ul>
<li>an update from SVN trunk</li>
<li>a merge from another Git branch</li>
</ul>
<p>Second, the only time I ever use SVN to commit or update is when I am on a clean Git master.</p>
<p>Here are the detailed steps I use.</p>
<p><strong>Starting off</strong></p>
<p><code>&gt; git checkout master<br />
&gt; svn update<br />
<em>Updated to revision 435</em><br />
&gt; git commit -a<br />
&gt; git tag svn-435</code></p>
<p>Now master is up to date with the SVN trunk.</p>
<p><strong>Working on code</strong></p>
<p><code>&gt; git checkout -B niftyFeature</code></p>
<p>Create a branch to work on a feature. This overwrites any existing niftyFeature branch.</p>
<p><em>(hack)</em><br />
<code>&gt; git commit .</code><br />
<em>(hack)</em><br />
<code>&gt; git commit .</code><br />
<em>(hack)</em><br />
<code>&gt; git commit .</code></p>
<p><strong>Getting ready to commit to SVN</strong></p>
<p><code>&gt; git checkout master<br />
&gt; svn update<br />
<em>Updated to revision 439</em></code></p>
<p>There will be no conflicts since Git&#8217;s master branch just tracks the SVN trunk.</p>
<p><code>&gt; git add --all<br />
&gt; git commit -m"Update to SVN revision 439"<br />
&gt; git tag svn-439</code></p>
<p>The tag can be useful for diffing later on.</p>
<p>Now comes the scary part.</p>
<p><code>&gt; git rebase master niftyFeature</code></p>
<p>That rebase essentially merges your work into the latest from the SVN trunk. Git rebase seems to work better than svn merge, but even so, you might have to resolve conflicts in the normal Git way.</p>
<p>The rebase also switches to the niftyFeature branch.</p>
<p><em>(test)</em></p>
<p>If there are problems:</p>
<p><em>(hack)</em><br />
<code>&gt; git commit .</code></p>
<p><strong>Committing to SVN</strong></p>
<p><code>&gt; git checkout master<br />
&gt; git merge niftyFeature</code></p>
<p>This is a no-fail fast-forward merge thanks to the previous rebase.</p>
<p><code>&gt; svn commit<br />
<em>Committed revision 440</em></code></p>
<p>The SVN commit may update SVN keywords if you&#8217;re using them. To avoid confusing Git, commit these changes too:</p>
<p><code>&gt; git commit -a -m"Update SVN keywords"<br />
&gt; git tag svn-440</code></p>
<p>I suppose this workflow is nothing but an <a href="http://en.wikipedia.org/wiki/Greenspun's_tenth_rule">ad hoc, informally-specified, bug-ridden, slow implementation of half</a> of <a href="http://schacon.github.com/git/git-svn.html">git-svn</a>. I already know Subversion and am learning Git, and my goal was to practise my Git rather than learn a third set of commands (git-svn). I plan to use SVN a lot less in the future, so this way I will only have to forget one set of commands, not two.</p>
<p><strong>Bonus tip: Backups</strong></p>
<p>You can clone your repository to another location on your file system. A good choice might be your Dropbox folder or similar. This makes it trivial to keep your entire repository backed up.</p>
<p><code>&gt; git clone --bare . /dropbox/projectName.git<br />
&gt; git remote add backup /dropbox/projectName.git<br />
&gt; git push backup</code></p>
<p>Making it a bare repository avoids problems with pushing. Then whenever you feel like backing up (i.e. all the time), just do this again:</p>
<p><code>&gt; git push backup</code></p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/LooyFbPDa1s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2012/01/25/a-spoonful-of-git-helps-the-subversion-go-down/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5 — Barcamp Auckland 5</title>
		<link>http://thunderguy.com/semicolon/2011/07/22/html5-barcamp-auckland-5/</link>
		<comments>http://thunderguy.com/semicolon/2011/07/22/html5-barcamp-auckland-5/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 20:28:31 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[#!]]></category>
		<category><![CDATA[Barcamp]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=626</guid>
		<description><![CDATA[The last proper session I went to at Barcamp Auckland 5 was &#8220;Extreme AJAX &#8211; beyond the hashbang, building a robust single page JS framework and URL schema&#8221;, presented by Barry Hannah (@barryhannah) &#038; Mark Zeman (@markzeman). They worked on the excellent newzealand.com redesign and gave some insight into its engineering. At a high level, [...]]]></description>
				<content:encoded><![CDATA[<p>The last proper session I went to at <a href="http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/">Barcamp Auckland 5</a> was &#8220;Extreme AJAX &#8211; beyond the hashbang, building a robust single page JS framework and URL schema&#8221;, presented by Barry Hannah (<a href="http://twitter.com/#!/barryhannah">@barryhannah</a>) &#038; Mark Zeman (<a href="http://twitter.com/#!/markzeman">@markzeman</a>). They worked on the excellent <a href="http://www.newzealand.com/">newzealand.com</a> redesign and gave some insight into its engineering.<span id="more-626"></span></p>
<p>At a high level, the most interesting part of the design is the navigation: no hierarchy, just tags. Opinions were divided, but I like the purity and elegance of the idea, and the implementation gives a lot of structure to the tags.</p>
<p>At a low level, they described the initial URL scheme they came up with. The site is implemented as a single-page site, with all content updates done with Ajax. For modern browsers, they use the <a href="http://www.w3.org/TR/html5/history.html">history API</a> to seamlessly change the URLs. For example, if a user clicks a &#8220;Travel&#8221; link, the browser address bar will switch from <tt>http://nz.com/</tt> to <tt>http://nz.com/travel</tt> without refreshing the whole page. (Opera offer a good <a href="http://dev.opera.com/articles/view/introducing-the-html5-history-api/">history API introduction</a>.)</p>
<p>Browsers that don&#8217;t support the history API instead use Google&#8217;s <a href="http://code.google.com/web/ajaxcrawling/docs/specification.html">Hash fragments specification</a>: browsers would see the URL <tt>http://nz.com/#!travel</tt>, while web crawlers would see <tt>http://nz.com/?_escaped_fragment_=travel</tt> . (See the spec for the reasoning behind this.)</p>
<p>Eventually they realised they didn&#8217;t need to use hashbangs at all. HTML5 browsers, with their fancy history API, end up being able to use plain URLs like <tt>http://nz.com/travel</tt> without ever refreshing the whole page. But crawlers can use the same URLs to fetch whole pages &#8212; the backend can easily tell whether a request is coming from a crawler or a browser. And less capable browsers can just use a plain hashy URL like <tt>http://nz.com/#travel</tt>.</p>
<p>This is quite a nice solution, except that if a web crawler does get hold of an URL like <tt>http://nz.com/#travel</tt>, it will only ever see the site homepage. That&#8217;s an SEO fail. But they point out that this probably won&#8217;t have much of an impact because the proportion of such links floating around won&#8217;t be high.</p>
<p>They talked about various libraries they used to do this: jQuery plugins <a href="https://github.com/defunkt/jquery-pjax">Pjax</a> and <a href="http://plugins.jquery.com/project/history-js">History.js</a> and the JavaScript MVC framework <a href="http://documentcloud.github.com/backbone/">Backbone</a>. (Poking around the Pjax page I discovered a very useful online <a href="http://closure-compiler.appspot.com/">Closure compiler service</a> that actually hosts compiled code!)</p>
<p>I really enjoyed seeing this lively presentation from a team who are pushing a large public website into the HTML5 world. I&#8217;m feeling inspired for my next project!</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/UwqggbFPdAc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2011/07/22/html5-barcamp-auckland-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Development productivity — Barcamp Auckland 5</title>
		<link>http://thunderguy.com/semicolon/2011/07/22/development-productivity-barcamp-auckland-5/</link>
		<comments>http://thunderguy.com/semicolon/2011/07/22/development-productivity-barcamp-auckland-5/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 12:34:19 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Barcamp]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=617</guid>
		<description><![CDATA[Last weekend&#8217;s Barcamp Auckland unconference had social issues, comedy and politics, but of course no Barcamp would be complete without a heapin&#8217; helping of software development geekery. Mal Curtis (@snikchnz) gave a packed presentation on Web Development Productivity, subtitled &#8220;What I use to quickly develop, deploy and maintain html, css, js, php &#038; ruby code [...]]]></description>
				<content:encoded><![CDATA[<p>Last weekend&#8217;s <a href="http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/">Barcamp Auckland</a> unconference had social issues, comedy and politics, but of course no Barcamp would be complete without a heapin&#8217; helping of software development geekery. Mal Curtis (<a href="http://twitter.com/#!/snikchnz">@snikchnz</a>) gave a packed presentation on Web Development Productivity, subtitled &#8220;What I use to quickly develop, deploy and maintain html, css, js, php &#038; ruby code at learnable.com and (a lil&#8217; bit) sitepoint.com. Git, Sass, Testing (Rspec, Cucumber, PHP too), Continuous Integration and deployment.&#8221; Actually that pretty much covers it.<span id="more-617"></span></p>
<p>But there were some particular highlights for me. Git, of course; everybody loves Git. In fact, 5 years ago I started a project in my day job. I strongly advocated using Subversion, and though there was some resistance (&#8220;What&#8217;s wrong with CVS?&#8221;) we did go with SVN. Now all our projects use Subversion. And now, working on an updated project for the same client, I&#8217;m keen to move to Git and it looks as if we&#8217;ll be doing that. Maybe 5 years from now we&#8217;ll be moving on to the next big version control paradigm. Nah, that&#8217;ll never happen, because Git is already version control Nirvana. Mmm, this Kool-Aid is delicious.</p>
<p>Mal recommended <a href="http://code.google.com/p/macvim/">MacVim</a>. I have installed it now. I spend a lot of time using Vim on various OSes, and I only know about 5 commands. Maybe if I switch to MacVim I will actually become a proper Vim user instead of a perpetual newbie.</p>
<p>He also spoke very highly of <a href="http://sass-lang.com/">Sass</a>, an &#8220;extension of CSS3, adding nested rules, variables, mixins, selector inheritance, and more&#8221;.I&#8217;ve always been intrigued by Sass and <a href="http://lesscss.org/">Less</a> and their ilk, but I worry that it&#8217;ll be too easy to write logical and clear Sass code that expands to CSS code with complicated selectors, leading to cascade problems, debugging nightmares and general unhappiness. (Coincidentally, a few days later Stephen Tudor pointed out a few of these issues in <a href="http://stephentudor.com/blog/2011/07/09/responsible-sass-authoring/">Responsible Sass Authoring</a>.) But Mal pointed out that you don&#8217;t have to go all-in: just a few key features (like mixins and variables) will make a big difference.</p>
<p>I&#8217;m convinced it&#8217;s worth a try.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/TdmKQMv02Yo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2011/07/22/development-productivity-barcamp-auckland-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Society — Barcamp Auckland 5</title>
		<link>http://thunderguy.com/semicolon/2011/07/17/society-barcamp-auckland-5/</link>
		<comments>http://thunderguy.com/semicolon/2011/07/17/society-barcamp-auckland-5/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 09:24:13 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Barcamp]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[society]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=609</guid>
		<description><![CDATA[I attended a few sessions at Barcamp Auckland yesterday that concerned the Internet&#8217;s role in society. Vikram Kumar (@vikram_nz) and (@robertobrien) hosted a discussion about designing privacy into services and products. This was a wide-ranging talk &#8212; I learned about a few interesting projects. Fire Eagle, from Yahoo!, is a framework for building location-awareness into [...]]]></description>
				<content:encoded><![CDATA[<p>I attended a few sessions at <a href="http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/">Barcamp Auckland</a> yesterday that concerned the Internet&#8217;s role in society. Vikram Kumar (<a href="http://twitter.com/#!/vikram_nz">@vikram_nz</a>) and  (<a href="http://twitter.com/#!/robertobrien">@robertobrien</a>) hosted a discussion about designing privacy into services and products. This was a wide-ranging talk &#8212; I learned about a few interesting projects.<span id="more-609"></span></p>
<p><a href="http://fireeagle.yahoo.net/">Fire Eagle</a>, from Yahoo!, is a framework for building location-awareness into an application in a way that offers users fine-grained control over the privacy of their location information.</p>
<p>Ideo&#8217;s free <a href="http://www.ideo.com/work/human-centered-design-toolkit/">Human-Centered Design Toolkit</a> is intended to help international staff and volunteers &#8220;understand a community’s needs in new ways, find innovative solutions to meet those needs, and deliver solutions with financial sustainability in mind.&#8221; It&#8217;s designed specifically for social enterprises operating in impoverished communities in Africa, Asia, and Latin America, but I&#8217;m sure there&#8217;s a lot in it for social enterprises in general. And it&#8217;s free, which is nice.</p>
<p>Vikram and Robert also handed round a copy of <a href="http://www.businessmodelgeneration.com/book">Business Model Generation</a> (&#8220;A handbook for visionaries, game changers and challengers.&#8221;), a rather nice coffee-table book about building and maintaining modern business models. It looked well worth reading as far as I could tell. There&#8217;s an iPad app too.</p>
<p>Later, Peter Mangin (<a href="http://twitter.com/#!/peteinakl">@peteinakl</a>) facilitated a nicely nuanced discussion on the evolution of social networks. He pointed out that they&#8217;re not evil &#8212; not even Facebook! &#8212; they&#8217;re just businesses trying to make money. He singled out two Google initiatives as being forces for good in the space. Obviously, the Circles feature in <a href="https://plus.google.com/">Google+</a> aims to clarify the privacy ambiguities that Facebook has struggled with (and it may well eat Facebook and Twitter&#8217;s lunches in the process.) Meanwhile, their <a href="http://www.dataliberation.org/">Data Liberation Front</a> aims to give Google&#8217;s users as much control as possible over their data. As people become more concerned about privacy, this will become a Google feature that Facebook will simply <em>have</em> to copy.</p>
<p>This year, for the first time Barcamp hosted a panel discussion. There were three members of parliament, representing the three main parties, and four others representing various organisations and views. The discussion was worthwhile, though with the Barcamp crowd the views expressed were pretty much what you&#8217;d expect: <em>More Power to the Internet!</em> Of the politicians, Clare Curran the Labour MP and Gareth Hughes the Green MP both seemed to have a good grip on the issues. National MP Sam Lotu-Liga mostly just parroted the party line. At least he was obviously not pandering to the partisan audience.</p>
<p>It was great to see a lot of discussion on wider social issues relating to technology at the Barcamp, rather than just coding and designing the latest web app. There was a bit of that though: I&#8217;ll write up my notes for that sometime soon.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/FzITfJcjePQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2011/07/17/society-barcamp-auckland-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Pomodoro Technique — Barcamp Auckland 5</title>
		<link>http://thunderguy.com/semicolon/2011/07/17/the-pomodoro-technique-barcamp-auckland-5/</link>
		<comments>http://thunderguy.com/semicolon/2011/07/17/the-pomodoro-technique-barcamp-auckland-5/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 11:13:25 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Barcamp]]></category>
		<category><![CDATA[Pomodoro]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=592</guid>
		<description><![CDATA[The Pomodoro Technique is a way of managing your time for improved productivity. At Barcamp Auckland 5 today, Carol Green (@carolgreen) and Noemi Selisker (@thenoemi) gave a useful outline of the process, from a beginner&#8217;s point of view &#8212; Noemi has been using the technique for a couple of weeks, and Carol is just about [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://thunderguy.com/semicolon/wp/wp-content/uploads/2011/07/pomodoro-logo.png" alt="" title="Pomodoro Technique logo" width="150" height="150" class="alignleft size-full wp-image-604" />The <a href="http://www.pomodorotechnique.com/">Pomodoro Technique</a> is a way of managing your time for improved productivity. At <a href="http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/">Barcamp Auckland 5</a> today, Carol Green (<a href="http://twitter.com/#!/carolgreen">@carolgreen</a>) and Noemi Selisker (<a href="http://twitter.com/#!/thenoemi">@thenoemi</a>) gave a useful outline of the process, from a beginner&#8217;s point of view &#8212; Noemi has been using the technique for a couple of weeks, and Carol is just about to start.<span id="more-592"></span></p>
<p>I was already aware of the basic technique: work in uninterrupted 25-minute bursts, followed by a 5-minute break. This 30-minute cycle is called a Pomodoro. If a Pomodoro is interrupted, you have to start the timer again. After four Pomodoros, have a longer break of 15-30 minutes.</p>
<p>Carol and Noemi fleshed out these rules with descriptions of how you should plan your day&#8217;s work beforehand, and evaluate it at the end. This is important for efficiency, but also for motivation &#8212; it&#8217;s easier to stick with the technique if you can see the progress you&#8217;re making. The final rule is to remember that &#8220;The Next Pomodoro Will Go Better&#8221;.</p>
<p>I have downloaded the <a href="http://www.pomodorotechnique.com/products.html">Pomodoro Technique Book</a> and will try the technique for myself in the coming weeks.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/JDLWeJFPIhE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2011/07/17/the-pomodoro-technique-barcamp-auckland-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barcamp Auckland 5</title>
		<link>http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/</link>
		<comments>http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 11:07:37 +0000</pubDate>
		<dc:creator>Bennett</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Barcamp]]></category>

		<guid isPermaLink="false">http://thunderguy.com/semicolon/?p=599</guid>
		<description><![CDATA[About 300 of New Zealand&#8217;s brightest gathered in Auckland today for the Barcamp Auckland 5 unconference. As with BCA4 last year, it was all pretty well-organised for an unconference, though there was an unsettling lack of espresso coffee. There was good variety in the various sessions I attended. One was on 1Password, a cross-platform password [...]]]></description>
				<content:encoded><![CDATA[<p>About 300 of New Zealand&#8217;s brightest gathered in Auckland today for the <a href="http://bca.geek.nz/">Barcamp Auckland 5</a> unconference. As with <a href="http://www.thunderguy.com/semicolon/2010/07/19/barcamp-auckland-4/">BCA4</a> last year, it was all pretty well-organised for an unconference, though there was an unsettling lack of espresso coffee.<span id="more-599"></span></p>
<p><img src="http://thunderguy.com/semicolon/wp/wp-content/uploads/2011/07/IMG_7880-300x293.jpg" alt="" title="BCA5 nametag" width="300" height="293" class="alignnone size-medium wp-image-601" /></p>
<p>There was good variety in the various sessions I attended. One was on <a href="http://agilebits.com/products/1Password">1Password</a>, a cross-platform password and information management tool. It looked useful, but quite heavyweight &#8212; there&#8217;s no easy way to use it on a computer unless you can run or install the 1Password program on it. Still, maybe a good solution to the problems of juggling dozens of website usernames and passwords.</p>
<p>I also attended a live recording of <a href="http://www.discourse.co.nz/">The Discourse Weekly Show</a>. Ben &#038; Morgan were pretty amusing, but the rough and ready setup and the general lack of microphone technique in the audience might not translate that well to the recorded result. <a href="http://www.discourse.co.nz/2011/07/episode-2-09bca-barcamp-special-live-show/">Listen to the show</a> if you don&#8217;t believe me.</p>
<p>Other sessions I attended roughly covered the areas of productivity, society and development. I&#8217;ll write up my notes on them in the next few days.</p>
<img src="http://feeds.feedburner.com/~r/semicolon/~4/bD3yMPg2sVw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://thunderguy.com/semicolon/2011/07/17/barcamp-auckland-5/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
