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

<channel>
	<title>Rohan Mitchell &#187; Development</title>
	<atom:link href="http://rohanmitchell.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://rohanmitchell.com</link>
	<description>Code. Design. Web. Biz. Life.</description>
	<lastBuildDate>Tue, 08 May 2012 05:58:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Getting tomboy notes to appear on the correct monitor in Ubuntu</title>
		<link>http://rohanmitchell.com/2011/03/getting-tomboy-notes-to-appear-on-the-correct-monitor-in-ubuntu/</link>
		<comments>http://rohanmitchell.com/2011/03/getting-tomboy-notes-to-appear-on-the-correct-monitor-in-ubuntu/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 03:31:56 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=598</guid>
		<description><![CDATA[I&#8217;m using a dual monitor setup using multiple X sessions instead of a Xinerama ultra-wide desktop. This means that I can&#8217;t drag windows between monitors, but it allows me to change desktops on them independently. I found that when I set up the Tomboy notes Gnome panel applet on my secondary monitor, the notes would [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m using a dual monitor setup using multiple X sessions instead of a Xinerama ultra-wide desktop. This means that I can&#8217;t drag windows between monitors, but it allows me to change desktops on them independently.</p>
<p>I found that when I set up the Tomboy notes Gnome panel applet on my secondary monitor, the notes would always appear on my primary monitor. To fix it, I had to:</p>
<blockquote><p>$ sudo emacs /usr/bin/tomboy-panel<br />
# Add the following line before the final &#8220;exec mono&#8221; line:<br />
export DISPLAY=:0.1</p></blockquote>
<p>There&#8217;s probably a neater solution (ie. could we set this when the tomboy-panel script is invoked?), but this was enough for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2011/03/getting-tomboy-notes-to-appear-on-the-correct-monitor-in-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Export from OpenOffice to clean HTML</title>
		<link>http://rohanmitchell.com/2010/02/export-from-openoffice-to-clean-html/</link>
		<comments>http://rohanmitchell.com/2010/02/export-from-openoffice-to-clean-html/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 08:30:02 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[openoffice]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sanitize]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=578</guid>
		<description><![CDATA[OpenOffice&#8217;s export to HTML feature produces very crufty HTML because it attempts to make the outputted document appear as similar as possible to the original document. Most of the time, I just want clean HTML. Here&#8217;s one way to get it: Export your OpenOffice document to HTML (I used the XHTML strict option) Install Ruby [...]]]></description>
			<content:encoded><![CDATA[<p>OpenOffice&#8217;s export to HTML feature produces very crufty HTML because it attempts to make the outputted document appear as similar as possible to the original document. Most of the time, I just want clean HTML. Here&#8217;s one way to get it:</p>
<ol>
<li>Export your OpenOffice document to HTML (I used the XHTML strict option)</li>
<li>Install <a href="http://ruby-lang.org">Ruby</a> and the <a href="http://wonko.com/post/sanitize">Sanitize</a> gem</li>
<li>Download <a href="/random/sanitize_oo_html.rb">this handy script</a></li>
<li>Run like so:<br />
ruby sanitize_oo_html.rb &lt; unwashed.html &gt; pretty.html</li>
</ol>
<p>The script contains a custom Sanitize filter that&#8217;s very simple, and it may not meet your needs. If not, feel free to tweak it. The <a href="http://github.com/rgrove/sanitize/#readme">Sanitize docs</a> should help with that.</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2010/02/export-from-openoffice-to-clean-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deploy a subversion repository to a server without subversion</title>
		<link>http://rohanmitchell.com/2009/12/deploy-a-subversion-repository-to-a-server-without-subversion/</link>
		<comments>http://rohanmitchell.com/2009/12/deploy-a-subversion-repository-to-a-server-without-subversion/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 23:05:19 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=570</guid>
		<description><![CDATA[The problem You have a website, stored in a subversion repository. The server you&#8217;d like to deploy to has shell access (ssh) but subversion is not installed, and you can&#8217;t install it. You want to be able to deploy changes to your website quickly and easily. The solution Download this ruby script and place it [...]]]></description>
			<content:encoded><![CDATA[<h2>The problem</h2>
<p>You have a website, stored in a subversion repository. The server you&#8217;d like to deploy to has shell access (ssh) but subversion is not installed, and you can&#8217;t install it. You want to be able to deploy changes to your website quickly and easily.</p>
<h2>The solution</h2>
<ol>
<li>Download <a href="/random/deploy.rb">this ruby script</a> and place it in the parent directory of your working copy of the site.</li>
<li>Edit the script and change the &#8220;src&#8221; parameter to the name of the directory containing your website.</li>
<li>Determine the SVN revisions you&#8217;d like to deploy. This might be something like &#8220;128:132&#8243;.</li>
<li>Run the script, like so: ruby deploy.rb 128:132<br />
Insert your own revisions as the command line parameter.</li>
<li>The script will generate a file deploy-128-132.tgz. Copy this to your server.</li>
<li>From within the production directory, untar the deploy-128-132.tgz file. This will overwrite the files that are to be modified in this update. It will also untar a delete script: delete-128-132.sh.</li>
<li>Run the delete script: . delete-128-132.sh</li>
<li>Remove the delete script: rm delete-128-132.sh</li>
<li>Party!</li>
</ol>
<p>Has this been useful? Drop me a line in the comments!</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2009/12/deploy-a-subversion-repository-to-a-server-without-subversion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ComicHub makeover</title>
		<link>http://rohanmitchell.com/2008/12/comichub-makeover/</link>
		<comments>http://rohanmitchell.com/2008/12/comichub-makeover/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 11:20:17 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[comic]]></category>
		<category><![CDATA[ComicHub]]></category>
		<category><![CDATA[makeover]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[web comic]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=53</guid>
		<description><![CDATA[I&#8217;ve just completed a makeover of ComicHub, which is the fun, simple and free web comic hosting site that Huy and I made about a year ago. I&#8217;ve made a number of changes to optimise the site for search engines and for humans: The front page previously displayed all the features using an image. That&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just completed a makeover of <a href="http://comichub.net">ComicHub</a>, which is the fun, simple and free web comic hosting site that <a href="http://niftykit.com">Huy and I</a> made about a year ago. I&#8217;ve made a number of changes to optimise the site for search engines and for humans:</p>
<ul>
<li>The front page previously displayed all the features using an image. That&#8217;s been replaced by text so search engines can figure out what the site is about.</li>
<li>Added the hook text at the top of the page: &#8220;Fun, simple and free web comic hosting&#8221;</li>
<li>The sign up button is much more prominent.</li>
<li>Removed the ads from the actual comic pages(!), and refactored the ones on the front page.</li>
</ul>
<p>If you&#8217;re interested in writing your own web comic, if you&#8217;d like to check out those that are already there, or if you just want to check out the new and improved home page, head over to <a href="http://comichub.net">http://comichub.net</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2008/12/comichub-makeover/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PrivateJournal</title>
		<link>http://rohanmitchell.com/2008/06/privatejournal/</link>
		<comments>http://rohanmitchell.com/2008/06/privatejournal/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 07:28:24 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[LiveJournal]]></category>
		<category><![CDATA[Privacy]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=26</guid>
		<description><![CDATA[I use a LiveJournal account as a private journal, and so all my posts are private. As far as I&#8217;ve been able to tell so far, LiveJournal always defaults to public when posting a new entry. After getting a bit annoyed, I realised GreaseMonkey would be the perfect tool to fix the UI for myself. [...]]]></description>
			<content:encoded><![CDATA[<p>I use a <a href="http://livejournal.com">LiveJournal</a> account as a private journal, and so all my posts are private. As far as I&#8217;ve been able to tell so far, LiveJournal always defaults to public when posting a new entry.</p>
<p>After getting a bit annoyed, I realised <a href="https://addons.mozilla.org/en-US/firefox/addon/748">GreaseMonkey</a> would be the perfect tool to fix the UI for myself. So, I wrote a quick script to set the privacy selector to &#8220;Private&#8221; on the post page. And so, I present possibly the shortest GreaseMonkey script ever. Enjoy!</p>
<p><a href="http://rohanmitchell.com/wp-content/uploads/privatejournal.user.js">privatejournal.user.js</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2008/06/privatejournal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Even more rapid development with Django and jQuery</title>
		<link>http://rohanmitchell.com/2008/06/even-more-rapid-development-with-django-and-jquery/</link>
		<comments>http://rohanmitchell.com/2008/06/even-more-rapid-development-with-django-and-jquery/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 04:31:22 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[ticktickdone]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=21</guid>
		<description><![CDATA[Compared to coming up with an idea, writing a web app is like trying to swim through treacle. After completing a week-long iteration on TickTickDone, it typically takes a day or two to unwind and mentally process the iteration&#8217;s work, then about an hour to come up with the tasks for the next week. Actually [...]]]></description>
			<content:encoded><![CDATA[<p>Compared to coming up with an idea, writing a web app is like trying to swim through treacle. After completing a week-long iteration on <a href="http://ticktickdone.com">TickTickDone</a>, it typically takes a day or two to unwind and mentally process the iteration&#8217;s work, then about an hour to come up with the tasks for the next week. Actually coding and testing those features takes the majority of the week&#8217;s 15 hours work.</p>
<p>The <a href="http://rohanmitchell.com/2008/05/writing-a-web-app-in-a-week/">one-web-app-per-week</a> idea is limited by how much functionality you can develop within the limited timeframe. I&#8217;d like to make my time spent coding as efficient as possible. So, I&#8217;m setting myself the challenge of creating a framework on top of Django and jQuery such that I can re-develop the current version of TickTickDone (iteration 8, made up of 8 weeks work) within one week.</p>
<p>At the moment, TTD&#8217;s code is not great in the <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a> department. That problem exists <a href="http://rohanmitchell.com/2008/05/collapsible-forms-with-jquery/">in the javascript code</a> and also in the python code, which is troubled by many very similar unit tests for very similar AJAX response functions. So as a solution, I plan to start by abstracting as many common patterns as I can. I&#8217;ll also try exploring the <a href="http://plugins.jquery.com/">jQuery plugin library</a> for pre-built components to help along the way, and see if I can form all of these into a cohesive library. Once I feel it&#8217;s ready, I&#8217;ll try using it to re-develop TickTickDone in a week.</p>
<p>An obvious alternative to this whole approach (and the one commonly used) is to hire more people to code for you. That&#8217;s not an option for me at the moment because I don&#8217;t have the money to hire more coders (a constraint), but it&#8217;s also not a great strategy due to the <a href="http://en.wikipedia.org/wiki/Brooks's_law">communication scaling problems in large teams</a>.</p>
<p>Any thoughts? Has anyone done this (or tried to do this) before? Let me know in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2008/06/even-more-rapid-development-with-django-and-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Collapsible forms with jQuery</title>
		<link>http://rohanmitchell.com/2008/05/collapsible-forms-with-jquery/</link>
		<comments>http://rohanmitchell.com/2008/05/collapsible-forms-with-jquery/#comments</comments>
		<pubDate>Mon, 26 May 2008 03:26:17 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[ticktickdone]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=17</guid>
		<description><![CDATA[I spent a few hours recently refactoring the TickTickDone javascript to reduce code duplication. In the process, I generalised out a common pattern &#8211; a link that, when clicked disappears and is replaced with a form. If the form is cancelled or submitted, the form disappears and the link returns. An example can be found [...]]]></description>
			<content:encoded><![CDATA[<p>I spent a few hours recently refactoring the <a href="http://ticktickdone.com">TickTickDone</a> javascript to reduce <a href="http://c2.com/cgi/wiki?DontRepeatYourself">code duplication</a>. In the process, I generalised out a common pattern &#8211; a link that, when clicked disappears and is replaced with a form. If the form is cancelled or submitted, the form disappears and the link returns. An example can be found in the &#8220;Add a new milestone&#8221; button on the goal page of TickTickDone. I&#8217;ve packaged up the HTML template and the javascript, and linked them below. To use it, create your HTML page with a section following the format in collapse-form.html. Include collapse-form.js, and call the following in your javascript init:</p>
<pre>init_collapse_forms($(document));</pre>
<h4>Collapsible forms version 1:</h4>
<p><a href="http://rohanmitchell.com/wp-content/uploads/2008/05/collapse-form.html">collapse-form.html</a></p>
<p><a href="http://rohanmitchell.com/wp-content/uploads/2008/05/collapse-form.js">collapse-form.js</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2008/05/collapsible-forms-with-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter + shell for Python</title>
		<link>http://rohanmitchell.com/2008/05/twitter-shell-for-python/</link>
		<comments>http://rohanmitchell.com/2008/05/twitter-shell-for-python/#comments</comments>
		<pubDate>Wed, 14 May 2008 07:29:17 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=9</guid>
		<description><![CDATA[In response to this post, I&#8217;ve written an equivalent script in python (because I&#8217;m too lazy to get the CPAN lib): #!/usr/bin/python from twyt.twitter import Twitter import sys username = '' password = '' def tweet(message): twitter = Twitter() twitter.setauth(username, password) twitter.status_update(message) if __name__ == '__main__': message = ' '.join(sys.argv[1:]) tweet(message) It depends on python-twyt. [...]]]></description>
			<content:encoded><![CDATA[<p>In response to <a href="http://blog.unixdaemon.net/cgi-bin/blosxom.pl/geekstuff/twitter_and_bash_bad_ideas.html">this post</a>, I&#8217;ve written an equivalent script in python (because I&#8217;m too lazy to get the CPAN lib):</p>
<pre>#!/usr/bin/python

from twyt.twitter import Twitter
import sys

username = ''
password = ''

def tweet(message):
    twitter = Twitter()
    twitter.setauth(username, password)
    twitter.status_update(message)

if __name__ == '__main__':
    message = ' '.join(sys.argv[1:])
    tweet(message)</pre>
<p>It depends on <a href="http://andrewprice.me.uk/projects/twyt/">python-twyt</a>. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2008/05/twitter-shell-for-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Obliterate</title>
		<link>http://rohanmitchell.com/2008/05/twitter-obliterate/</link>
		<comments>http://rohanmitchell.com/2008/05/twitter-obliterate/#comments</comments>
		<pubDate>Sun, 11 May 2008 10:10:48 +0000</pubDate>
		<dc:creator>Rohan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[twitter-obliterate]]></category>

		<guid isPermaLink="false">http://rohanmitchell.com/?p=7</guid>
		<description><![CDATA[I had a request for a script to delete all the tweets in an account, so here it is: twitter-obliterate-0.1 May be harmful to your tweets, use at your own risk! I&#8217;m not sure how fast it is, since I&#8217;ve only tested it on an account with about 10 tweets. It has to send a [...]]]></description>
			<content:encoded><![CDATA[<p>I had a request for a script to delete all the tweets in an account, so here it is:</p>
<p><a href="http://rohanmitchell.com/wp-content/uploads/2008/05/twitter-obliterate-01.tgz">twitter-obliterate-0.1</a></p>
<p>May be harmful to your tweets, use at your own risk! I&#8217;m not sure how fast it is, since I&#8217;ve only tested it on an account with about 10 tweets. It has to send a separate HTTP request for each tweet, and it does so serially. Hopefully it&#8217;ll be adequate for all but the most massive accounts.</p>
<p>The tarball includes a version of the <a href="http://andrewprice.me.uk/projects/twyt/">python-twyt</a> library, modified to add support for the archive command. Patch on the way to the maintainer shortly&#8230;</p>
<p><strong>Update:</strong> I&#8217;ve done a few tests and it appears the code has some bugs, but due to lack of demand I haven&#8217;t investigated any further. Let me know if you&#8217;re interested in a fix!</p>
]]></content:encoded>
			<wfw:commentRss>http://rohanmitchell.com/2008/05/twitter-obliterate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

