<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Griffin::blog()</title>
    <link>http://griffin.oobleyboo.com/</link>
    <language>en-us</language>
    <ttl>120</ttl>
    <description>Jason Stirk's Blog - Web Development and /dev/urandom</description>
    
    
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/griffinblog" /><feedburner:info uri="griffinblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>-28.821233132632454</geo:lat><geo:long>153.3114516735077</geo:long><item>
          <title>Vim Tricks for Ruby and Rails Developers</title>
          <description>&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;&lt;/strong&gt; &amp;#8211; 17 June: My .vimrc file caused my backspace to stop working under gVim. The code snippet has been updated to fix that now.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://railscampau.github.com/"&gt;RailsCamp5&lt;/a&gt; was awesome, but it left me a little depressed. Watching all the folks using their Macs and TextMate, I couldn&amp;#8217;t help but thing &amp;#8220;Hell! Look how super efficient and productive these people are! What kind of second rate environment am I working in!?&amp;#8221;. It left me a little despondent to think that, regardless of anything else, these folks were going to be more productive than me just due to their setup.&lt;/p&gt;


	&lt;p&gt;On the Saturday evening, we held a Vim &lt;span class="caps"&gt;BOF&lt;/span&gt; session &amp;#8211; a chance for Vim users to share their tips and tricks, and to attempt to convert some of the Mac crowd into the cult that is Vim. I fully expected to go in there and pick up only a few cool key combos that I&amp;#8217;d missed, or a few cool syntax files. How wrong I was.&lt;/p&gt;


	&lt;p&gt;From that session, I now feel entirely better about my dev environment of choice (Gentoo Linux and Vim). In fact, just the things I picked up from that session have me feeling orders of magnitude more productive.&lt;/p&gt;


	&lt;p&gt;The first awesome tool I had been missing was &lt;a href="http://www.vim.org/scripts/script.php?script_id=1658"&gt;&lt;span class="caps"&gt;NERD&lt;/span&gt; Tree&lt;/a&gt;, which is a plugin for Vim which gives you the project pane / directory style window on the side showing all of the source code in your project. This feature, in fact, was the only reason why I had recently adopted GEdit in preference to Vim when working with Rails apps; it is just so handy to have a list of all of your files available.&lt;/p&gt;


	&lt;p&gt;To set it up, simply download it (or check out the &lt;a href="http://github.com/scrooloose/nerdtree"&gt;git repo&lt;/a&gt;), and drop the &lt;span class="caps"&gt;NERD&lt;/span&gt;_tree.vim file into your ~/.vim/plugin directory.&lt;/p&gt;


	&lt;p&gt;To make it easier to access (rather than typing &lt;code&gt;:NERDTreeToggle&lt;/code&gt; all the time), I&amp;#8217;ve added a mapping for &lt;code&gt;Ctrl+D&lt;/code&gt; to my .vimrc file :&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;:map &amp;lt;C-d&amp;gt; :execute 'NERDTreeToggle ' .getcwd()&amp;lt;CR&amp;gt;&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Then, it&amp;#8217;s as simple as selecting the file I want, and pressing &amp;#8220;t&amp;#8221; (to open in a new tab), &amp;#8220;o&amp;#8221; to open in a new vertical panel, or &amp;#8220;i&amp;#8221; to open in a new horizontal panel. Combined with &amp;#8220;m&amp;#8221; (to handle file operations like delete, copy, move, etc.) it&amp;#8217;s as feature rich as any other project panel.&lt;/p&gt;


	&lt;p&gt;(Note for those who forget &amp;#8211; &lt;code&gt;Ctrl+W&lt;/code&gt; and direction to navigate between panels)&lt;/p&gt;


	&lt;p&gt;The second thing that has helped has been &lt;a href="http://www.vim.org/scripts/script.php?script_id=1567"&gt;rails.vim&lt;/a&gt;, which is a plugin to make Vim more Rails aware. Not only does this fix a bunch of syntax issues, but it also provides some helpers to jump around your project quickly. For example &lt;code&gt;.gf&lt;/code&gt; will look for a controller or model which matches whatever is under the cursor. This allows you the quickly jump to the Model from a Controller (for example).&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve yet to play with the integration with script/* and the partial extraction stuff, but it looks cool.&lt;/p&gt;


	&lt;p&gt;One slight tweak I&amp;#8217;ve made is because I&amp;#8217;m under the impression that Rik and I are the only two people in the Ruby community who actually prefer using TABs over spaces in our source code (likely stemming from the fact that I like to tweak my tabs at 2 or 3 spaces, depending on what I&amp;#8217;m doing, whereas Rik likes his at 4 or 8). As rails.vim forces the Rails &amp;#8220;2 space indentation&amp;#8221;, I&amp;#8217;ve added a hack to my .vimrc allowing preventing TABs from being expanded.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;autocmd User Rails    set no expandtab&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Suck it, space-lovers! Do what you like in your projects, I&amp;#8217;ll do what I like in mine!&lt;/p&gt;


	&lt;p&gt;And, to make sure I can tell when there are TABs vs. Spaces (something I was missing from e), I have set them to display as characters rather than whitespace :&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;set list listchars=tab:&amp;gt;-,trail:.
:highlight SpecialKey ctermfg=darkgrey&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;This means that &lt;code&gt;\t&lt;/code&gt; characters are now replaced with a grey &lt;code&gt;&amp;gt;-&lt;/code&gt; or &lt;code&gt;&amp;gt;--&lt;/code&gt; depending on my indentation setting (using &lt;code&gt;set ts&lt;/code&gt;). It also adds grey &amp;#8221;.&amp;#8221; characters for any trailing spaces at the end of the line &amp;#8211; handy for trimming up garbage left when moving code around.&lt;/p&gt;


	&lt;p&gt;The final tool I&amp;#8217;ve added is the fuzzy_finder plugin, which acts similarly to TextMate&amp;#8217;s fuzzy finder and allows you to type in parts of a filename and it attempts to find it for you. For example typing &amp;#8220;a/m/contr&amp;#8221; will search for files matching this sort of structure. In my case, it suggests files including &amp;#8220;app/models/contract.rb&amp;#8221; &amp;#8211; the file I was looking for.&lt;/p&gt;


	&lt;p&gt;I got most of the information about this from Jamis Buck&amp;#8217;s blog post &lt;a href="http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim"&gt;Coming home to Vim&lt;/a&gt; . Suffice to say, you need &lt;a href="http://www.vim.org/scripts/script.php?script_id=1984"&gt;fuzzyfinder.vim&lt;/a&gt; AND &lt;a href="http://github.com/jamis/fuzzyfinder_textmate/tree/master"&gt;Jamis&amp;#8217; fuzzyfinder_textmate code&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Again, I&amp;#8217;ve added some easier keybindings so allow me to use the finder:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;" Ctrl+T to find a file and open it in this buffer
:map &amp;lt;C-t&amp;gt; :FuzzyFinderTextMate&amp;lt;CR&amp;gt;
" Ctrl+B to search the buffers currently open
:map &amp;lt;C-b&amp;gt; :FuzzyFinderBuffer&amp;lt;CR&amp;gt;
" Because I don't want to find my log files
let g:fuzzy_ignore_limit = 70&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;For reference, my complete .vimrc file is :&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;set ts=2
setlocal spell spelllang=en_au
set noexpandtab

" gvim backspace breaks unless I provide this, so...
set bs=2

" enable syntax by default, ensure we're using a meaningful scheme
colo slate
syn on

" make sure that bottom status bar is running
set ruler
set laststatus=2
set mouse=a
set list listchars=tab:&amp;gt;-,trail:.
:highlight SpecialKey ctermfg=darkgrey

" Stop rails.vim from fucking with my expandtab settings.
" I don't care if everyone else likes spaces, TABs all the way baby!
autocmd User Rails      set noexpandtab

:map &amp;lt;C-n&amp;gt; &amp;lt;ESC&amp;gt;:tabnew&amp;lt;RETURN&amp;gt;

:map &amp;lt;C-t&amp;gt; :FuzzyFinderTextMate&amp;lt;CR&amp;gt;
:map &amp;lt;C-b&amp;gt; :FuzzyFinderBuffer&amp;lt;CR&amp;gt;
:map &amp;lt;C-d&amp;gt; :execute 'NERDTreeToggle ' . getcwd()&amp;lt;CR&amp;gt;
let g:fuzzy_ignore = "*.log" 
let g:fuzzy_matching_limit = 70
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;These tools, combined with the incredible power that Vim already has (regex substitution, I&amp;#8217;m looking at you!), means that I am now feeling more comfortable with my environment of choice. Combined with my other tools &amp;#8211; screen, &lt;span class="caps"&gt;XFCE&lt;/span&gt; &amp;#8211; I feel that I can get anything done quickly that I need to.&lt;/p&gt;


	&lt;p&gt;(Reference, &lt;code&gt;gt&lt;/code&gt; to swap tabs, or &lt;code&gt;Ctrl+PageUp&lt;/code&gt; and &lt;code&gt;Ctrl+PageDown&lt;/code&gt;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/h2qJdT9uZCw" height="1" width="1"/&gt;</description>
          <pubDate>Tue, 09 Jun 2009 01:50:41 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/vim-tricks-for-ruby-and-rails-developers/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/h2qJdT9uZCw/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/vim-tricks-for-ruby-and-rails-developers/</feedburner:origLink></item>
    
        <item>
          <title>The New Adventures of Aurora Software</title>
          <description>&lt;p&gt;Well, it&amp;#8217;s been a long time between drinks at this blog. To be honest, that&amp;#8217;s partially because not much noteworthy has been happening.&lt;/p&gt;


	&lt;p&gt;Let me rephrase that. In actual fact, I&amp;#8217;ve been busy with lots of interesting things, none of which I&amp;#8217;ve had anything interesting to say. So, a brief run-down.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;moved out of the old house;&lt;/li&gt;
		&lt;li&gt;went to &lt;a href="http://www.edgeoftheweb.org.au"&gt;Edge of the Web&lt;/a&gt; in November, which was awesome, thought provoking, and had free coffee;&lt;/li&gt;
		&lt;li&gt;this included visiting as many people as I could in Perth;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.flickr.com/photos/j_stirk/sets/72157612874862831/"&gt;we drove&lt;/a&gt; a tiny, &lt;a href="http://www.flickr.com/photos/j_stirk/3073427561/in/set-72157612874862831/"&gt;safety orange Yaris&lt;/a&gt; back to Lismore, going via the Great Ocean Road and Sydney (and &lt;a href="http://www.dopplr.com/traveller/jstirk/public"&gt;a few other places along the way&lt;/a&gt; );&lt;/li&gt;
		&lt;li&gt;we moved into a new place, about 15 minutes outside of town;&lt;/li&gt;
		&lt;li&gt;I fought with Internet choices, finally settling on &lt;a href="http://search.twitter.com/search?q=&amp;#38;ors=optus+badoptus&amp;#38;from=j_stirk&amp;#38;rpp=15"&gt;Optus Wireless Broadband&lt;/a&gt; and a &lt;a href="http://www.rfshop.com.au/ContactUs/Bloggs/tabid/648/EntryID/2/Default.aspx"&gt;2.1GHz Cantenna&lt;/a&gt; ;&lt;/li&gt;
		&lt;li&gt;I started a new business with Perth Rails dude, Rik Favalli.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;That bottom point is the biggest one, and the reason for this post.&lt;/p&gt;


	&lt;p&gt;A few years ago when I was working with &lt;a href="http://www.insilico.com.au/"&gt;insilico&lt;/a&gt; (or, as it was still known, o&amp;#8217;neill software), Paul introduced me to a guy who I immediately got along with. Paul&amp;#8217;s comfy office chairs made it far too easy to sit around and chat, and our discussions ranged across a variety of topics &amp;#8211; our shared love of &lt;a href="http://en.wikipedia.org/wiki/Buckminster_Fuller"&gt;Bucky&lt;/a&gt;, new technology, business, the environment, and sometimes simply inane conversations about nothing.&lt;/p&gt;


	&lt;p&gt;Anyhu, fast forward to 2008, and Rik and I started throwing around the idea of coming together to form a business; at the time we were both finding our respective freelance gigs a little isolating, and noticing the problems of flying solo &amp;#8211; needing to do everything ourselves, not having colleagues to throw ideas around with, and being overlooked for larger jobs where the risk of a solo developer was just too great.&lt;/p&gt;


	&lt;p&gt;So, we started working it all out &amp;#8211; looking at what we were passionate about, how we wanted to do business, and formulating the very best environment in which two geographically disparate developers could work together closely. We learned a lot in this process &amp;#8211; a lot about ourselves, a lot about each other, and a lot about dealing with a 2-3hr time difference across flakey Internet connections. In short, we had a blast.&lt;/p&gt;


	&lt;p&gt;Finally, almost 3 weeks ago &amp;#8211; the 9th of March 2009 &amp;#8211; we launched &lt;a href="http://www.aurorasoft.com.au/"&gt;Aurora Software&lt;/a&gt; to the world.&lt;/p&gt;


	&lt;p&gt;Rik and I are both passionate about Ruby, and as such, Aurora Software is focussing on &lt;a href="http://www.aurorasoft.com.au/"&gt;Web Development with Ruby on Rails&lt;/a&gt;. Furthermore, we&amp;#8217;re openly embracing all of the best practices we love &amp;#8211; test driven development, pair programming (a post on this soon, hopefully), keeping things agile, and writing elegant code.&lt;/p&gt;


	&lt;p&gt;So, that&amp;#8217;s my news&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Please head over to the &lt;a href="http://www.aurorasoft.com.au/"&gt;Aurora Software&lt;/a&gt; website and check things out.&lt;/p&gt;


	&lt;p&gt;Super special thanks to George Atherley (of &lt;span class="caps"&gt;TMIAS&lt;/span&gt; fame) who worked with us over the past few months to sort out a kick-ass design for the site and logo. I can only imagine that we were probably the worst client he has had to deal with for a while, but he handled it admirably &amp;#8211; he never once told us our ideas were stupid (even when they were), but rather he just smiled and waited for us to realise that, yes, he really did know best!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/Z5XY7AoS1Ww" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 29 Mar 2009 05:02:43 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/the-new-adventures-of-aurora-software/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/Z5XY7AoS1Ww/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/the-new-adventures-of-aurora-software/</feedburner:origLink></item>
    
        <item>
          <title>Dynamic Routes in Rails Redux</title>
          <description>&lt;p&gt;A little over 3 years ago &amp;#8211; not long into my adventures with Rails &amp;#8211; I posted an article titled &lt;a href="http://griffin.oobleyboo.com/archive/dynamic_routes_in_rails"&gt;Dynamic Routes in Ruby on Rails&lt;/a&gt;. This article has been bugging me for a while lately for one big reason &amp;#8211; it&amp;#8217;s one of the most popular articles on my blog, and it&amp;#8217;s woefully outdated and a terrible guide to just what you can do with Rails&amp;#8217; routes.&lt;/p&gt;


	&lt;p&gt;So, this post is going to look at what&amp;#8217;s changed since then, and how I would solve the same problem today. I&amp;#8217;m also going to update a few of the other points I made in that post &amp;#8211; in particular updating my somewhat unjustified stance on using method calls to produce markup.&lt;/p&gt;


	&lt;p&gt;First off, Rails&amp;#8217; routing system is a lot smarter than it was 3 years ago. It now easily handles non-ID &amp;#8220;human&amp;#8221; URLs with much less hassle than I went through, and supports many other powerful features that we would never have expected back then.&lt;/p&gt;


	&lt;p&gt;In the case of my original post, I wanted a &lt;span class="caps"&gt;URL&lt;/span&gt; structure like :&lt;/p&gt;


&lt;pre&gt;
 /documents-and-services/agreements
&lt;/pre&gt;

	&lt;p&gt;to be resolved to a request such as :&lt;/p&gt;


&lt;pre&gt;
 { :controller =&amp;gt; 'categories', :action =&amp;gt; 'list', :name =&amp;gt; 'agreements' }
&lt;/pre&gt;

	&lt;p&gt;In the old example, I put the responsibility on the application load-up by making routes.rb load up all my categories and generate the routes. Now, this might work OK in development mode, or in an application that doesn&amp;#8217;t change often. However, in a production application, any time that you wanted to add a category you would have needed to restart the application to &amp;#8220;refresh&amp;#8221; the routes. Not a good solution.&lt;/p&gt;


	&lt;p&gt;So how would we do this now? Well, there&amp;#8217;s a few ways.&lt;/p&gt;


	&lt;p&gt;Firstly, we can do the same thing as above much simpler using the routing system&amp;#8217;s support for regular expressions. Effectively, we would put the responsibility on the action to find the category that we want to display &amp;#8211; it&amp;#8217;s going to need to find the row anyway, so this isn&amp;#8217;t any different to a normal Rails action. In this case, we would rewrite our routing rule as :&lt;/p&gt;


&lt;pre&gt;
  map.connect 'documents-and-services/:name', :controller =&amp;gt; 'categories', :action =&amp;gt; 'list', :name =&amp;gt; /[A-Za-z0-9\-_]/
&lt;/pre&gt;

	&lt;p&gt;This rule tells the routing system that the :name parameter can match the given regular expression (any letter, number, a dash or underscore). The controller/action parameters are exactly like any typical routing rule, and say that it should route through to that particular method.&lt;/p&gt;


	&lt;p&gt;In the action, we would then find our category, exactly the same as normal (but using the :name parameter).&lt;/p&gt;


&lt;pre&gt;
  @category=Category.find_by_name(params[:name])
&lt;/pre&gt;

	&lt;p&gt;Problem solved without any nasty code in the routes.rb file.&lt;/p&gt;


	&lt;p&gt;An alternative solution, and one which I&amp;#8217;m particularly fond of, is setting a custom ID parameter method that will be used in the &lt;span class="caps"&gt;URL&lt;/span&gt;. I find this is often useful in places where it wouldn&amp;#8217;t be feasible to have a 1-to-1 relationship between the data in the &lt;span class="caps"&gt;URL&lt;/span&gt; and your rows.&lt;/p&gt;


	&lt;p&gt;For example, let&amp;#8217;s assume that the document system we were talking about above allows multiple categories with the same name &amp;#8211; perhaps differentiated only by the link the visitor clicked. In these cases, a :name parameter would be insufficient to find the single category to display.&lt;/p&gt;


	&lt;p&gt;Another instance where the non-ID parameter can become a problem is when the data you need to display can not easily be indexed, and therefore will cause a slow database request while it finds the matching row. Although this is uncommon, it does sometimes happen.&lt;/p&gt;


	&lt;p&gt;In these cases, I like to change the model&amp;#8217;s to_param method in order to change the id parameter produced by url_for(), and therefore link_to().&lt;/p&gt;


	&lt;p&gt;A brief rundown &amp;#8211; when generating an :id for a &lt;span class="caps"&gt;URL&lt;/span&gt;, url_for calls the to_param() method of the object provided. Unless you override this, it&amp;#8217;s provided by ActiveRecord::Base to return just the integer ID of the row. However, to_param gives us a heap of flexibility.&lt;/p&gt;


	&lt;p&gt;My usual trick is to change to_param to something like this :&lt;/p&gt;


&lt;pre&gt;
  def to_param
    "#{self.id}-#{self.name_for_url}" 
  end
  def name_for_url
    self.name.gsub(/^A-Z0-9\-_/i,'')
  end
&lt;/pre&gt;

	&lt;p&gt;The above code is fairly self explanatory &amp;#8211; we&amp;#8217;re overriding the to_param() method to output the id and an encoded version of the model&amp;#8217;s name. We need to encode it, as we don&amp;#8217;t want &amp;#8220;bad&amp;#8221; characters like apostrophes, punctuation marks or other special characters messing up the &lt;span class="caps"&gt;URL&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Given a routing rule like :&lt;/p&gt;


&lt;pre&gt;
  map.connect 'documents-and-services/:id', :controller =&amp;gt; 'categories', :action =&amp;gt; 'list', :id =&amp;gt; /[0-9]+-[A-Za-z0-9\-_]/
&lt;/pre&gt;

	&lt;p&gt;link_to will generate nice looking URLs like :&lt;/p&gt;


&lt;pre&gt;
  /documents-and-services/14-agreements
&lt;/pre&gt;

	&lt;p&gt;The important thing to note here is that when reading the details back in, you don&amp;#8217;t have to worry about the string portion of the value. When the string is coerced to an integer, the &amp;#8220;-agreements&amp;#8221; is simply ignored, leaving the ID value as just 14. In this way, the name after the ID is purely for vanity purposes, and can easily be changed and rejigged without any risk of the data changing. It&amp;#8217;s also a lot more robust, as changing the name of the model doesn&amp;#8217;t instantly kill all of your links.&lt;/p&gt;


	&lt;p&gt;Incidentally, this is the way that we currently neaten the URLs on the recently re-launched &lt;a href="http://www.wselive.com/"&gt;World Stock Exchange&lt;/a&gt; site. The Company model has a to_param similar to the above and this allows us to show nice URLs which actually show the name of the company, rather than just a plain ID.&lt;/p&gt;


	&lt;p&gt;One final thing I wanted to address from the original post concerns my former dislike for &amp;#8220;writing &lt;span class="caps"&gt;HTML&lt;/span&gt; as method calls&amp;#8221;. Part of this was angst from all of the shitty frameworks I&amp;#8217;ve worked with in the past, and certainly with the crufyness of some of the Rails helpers 3 years ago. Now, however, it&amp;#8217;s a whole different ball game.&lt;/p&gt;


	&lt;p&gt;A clever combination of routing and link_to ensures that you can easily make wide scale &amp;#8220;neating&amp;#8221; or structural changes to your &lt;span class="caps"&gt;URL&lt;/span&gt; scheme with trivial ease &amp;#8211; change the routes.rb configuration and all of your links magically change to match. Not to mention that named routes can dramatically neaten up your views. What&amp;#8217;s nicer?&lt;/p&gt;


&lt;pre&gt;
  link_to('Your Profile', :controller =&amp;gt; 'users', :action =&amp;gt; 'show', :id =&amp;gt; @user)
  or
  link_to('Your Profile', profile_url(@user))
&lt;/pre&gt;

	&lt;p&gt;Similarly, start_form_tag and end_form_tag once left nasty tastes in my mouth. Now, however, I&amp;#8217;m deeply in love with the form_tag block &amp;#8211; not only does it include &lt;span class="caps"&gt;XSRF&lt;/span&gt; protection out of the box in a nice, block based method, but it is logically neater than disconnected method calls for what is effectively an element wrapping content.&lt;/p&gt;


	&lt;p&gt;I think the sensible use of method calls to generate code (eg. helpers) makes writing content much easier, and much more maintainable. As for &lt;span class="caps"&gt;CGI&lt;/span&gt;.pm&amp;#8217;s start_html/end_html functions that I bitched about in my original post? Yup &amp;#8211; I still hate them. It&amp;#8217;s messy. Use a template system &amp;#8211; whether it&amp;#8217;s something like &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc"&gt;erb&lt;/a&gt; or &lt;a href="http://haml.hamptoncatlin.com/"&gt;&lt;span class="caps"&gt;HAML&lt;/span&gt;&lt;/a&gt;, or one of the huge number of other template systems.&lt;/p&gt;


	&lt;p&gt;There&amp;#8217;s a lot of things that I&amp;#8217;ve learnt in the past 3 years since I wrote that post, and there&amp;#8217;s even more that&amp;#8217;s changed since then. We&amp;#8217;ve seen Rails make a 1.0 release, a 2.0 release, and development is still continuing.&lt;/p&gt;


	&lt;p&gt;So&amp;#8230; I&amp;#8217;ll probably have to come back and revise this post in 3 years&amp;#8230;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/yBS15tzYWpY" height="1" width="1"/&gt;</description>
          <pubDate>Thu, 14 Aug 2008 01:14:54 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/dynamic-routes-in-rails-redux/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/yBS15tzYWpY/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/dynamic-routes-in-rails-redux/</feedburner:origLink></item>
    
        <item>
          <title>Ruby Enterprise Edition Gem Install Script</title>
          <description>&lt;p&gt;&lt;a href="http://griffin.oobleyboo.com/archive/ruby-enterprise-edition-gem-install-script#phusion-gem-install-script"&gt;Skip the waffle &amp;#8211; take me to the script&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re anything like me, as soon as you heard that the 2nd part to &lt;a href="http://phusion.nl/"&gt;Phusion&amp;#8217;s&lt;/a&gt; &lt;a href="http://www.modrails.com/"&gt;mod_rails&lt;/a&gt; release was &lt;a href="http://www.rubyenterpriseedition.com/index.html"&gt;Ruby Enterprise Edition&lt;/a&gt; you were probably getting a little excited. The prospect of a version of Ruby that is &lt;a href="http://en.wikipedia.org/wiki/Copy_on_write" title="Copy On Write"&gt;&lt;span class="caps"&gt;COW&lt;/span&gt;&lt;/a&gt; friendly and lowers the amount of memory required to host Rails applications is indeed very interesting.&lt;/p&gt;


	&lt;p&gt;Now that &lt;a href="http://blog.phusion.nl/2008/06/09/phusion-passenger-20-rc-1-and-ruby-enterprise-edition-released/"&gt;Phusion have released Ruby Enterprise Edition&lt;/a&gt; , I set about having a play to set it up.&lt;/p&gt;


	&lt;p&gt;The installation is incredibly simple, as it does everything for you &amp;#8211; compiles itself, installs itself into a private location and all of those good things. Once it&amp;#8217;s set up, it is a completely isolated version of Ruby that will happily co-exist with your existing Ruby installation.&lt;/p&gt;


	&lt;p&gt;However, this has a catch. Gems are not shared between the multiple installations (nor should they be!) and this means that any gems that you are using under your normal Ruby install will need to be installed under &lt;acronym title="Ruby Enterprise Edition"&gt;REE&lt;/acronym&gt;. Otherwise, changing mod_rails to use &lt;span class="caps"&gt;REE&lt;/span&gt; will likely cause lots of applications to be broken without the correct Rails version for example.&lt;/p&gt;


	&lt;p&gt;I have a whole heap of gems installed on my server currently, spanning across at least 4 different versions of Rails. As such, there were a lot of gems to install under &lt;span class="caps"&gt;REE&lt;/span&gt;. So, I wrote a script to do it automatically.&lt;/p&gt;


	&lt;h3 id="phusion-gem-install-script"&gt;The Install Script&lt;/h3&gt;


	&lt;p&gt;It&amp;#8217;s not perfect. It knows nothing about gems, and so it may re-install a gem a couple of times before it finishes. This means it may take longer that if it were &amp;#8220;gem aware&amp;#8221;. It does, however, do it all for you so as that you don&amp;#8217;t have to. What do you want for nothing?&lt;sub&gt;a rubber biscuit?&lt;/sub&gt;&lt;/p&gt;


&lt;pre&gt;#!/usr/bin/ruby

# The command to run for your vanila Ruby 'gem' command
OLD_GEM='gem'
# The command to run for REE's 'gem' command
NEW_GEM='/opt/ruby-enterprise-1.8.6-20080507/bin/ruby /opt/ruby-enterprise-1.8.6-20080507/bin/gem'

output=`#{OLD_GEM} list`
new_list=`#{NEW_GEM} list`
output.each do |line|
        # Skip lines that don't look like a gem version
        matches=line.match(/([A-Z].+) \(([0-9\., ]+)\)/i)
        if matches then
                gem_name=matches[1]
                versions=matches[2]
                versions.split(', ').each do |ver|
                        cmd="#{NEW_GEM} install #{gem_name} -v #{ver} --no-rdoc --no-ri --backtrace -y" 
                        # See if this gem is already installed
                        if new_list =~ /#{gem_name} \(.*#{ver}.*\)/i then
                                puts "#{gem_name} #{ver} is already installed. Skipping" 
                        else
                                puts cmd
                                system(cmd)
                        end
                end
        end
end&lt;/pre&gt;

	&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;NOTE&lt;/span&gt;:&lt;/strong&gt; You may need to tweak the &lt;code&gt;NEW_GEM&lt;/code&gt; and &lt;code&gt;OLD_GEM&lt;/code&gt; constants at the top if you&amp;#8217;ve installed either your vanilla Ruby or &lt;span class="caps"&gt;REE&lt;/span&gt; into different locations. Also check that your &lt;a href="http://en.wikipedia.org/wiki/Shebang_(Unix)"&gt;shebang&lt;/a&gt; line at the very top is right for your particular Ruby installation.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/3qGfoiGn4gk" height="1" width="1"/&gt;</description>
          <pubDate>Tue, 10 Jun 2008 14:41:07 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/ruby-enterprise-edition-gem-install-script/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/3qGfoiGn4gk/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/ruby-enterprise-edition-gem-install-script/</feedburner:origLink></item>
    
        <item>
          <title>Thoughts and Observations on ICT in Education</title>
          <description>&lt;p&gt;I&amp;#8217;ve been following &lt;a href="http://twitter.com/mpesce"&gt;@mpesce&amp;#8217;s&lt;/a&gt; coverage of &lt;a href="http://summize.com/search?q=%23acer"&gt;#acer&lt;/a&gt; today &amp;#8211; that is, the &lt;a href="http://www.acer.edu.au/"&gt;Australian Council for Educational Research&amp;#8217;s&lt;/a&gt; 2008 Symposium.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.futurestreetconsulting.com/"&gt;Mark&lt;/a&gt; is someone that I&amp;#8217;ve heard quite a bit about from what people have said to him on Twitter &amp;#8211; until recently his profile has been private, and I&amp;#8217;ve been itching to follow him. He&amp;#8217;s regarded very highly among the AU Twitter community, and for good reason &amp;#8211; he&amp;#8217;s a clever man, and you can &lt;a href="http://blog.futurestreetconsulting.com/?p=56"&gt;see that in his writing.&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Education is something that I&amp;#8217;m passionate about &amp;#8211; I&amp;#8217;m passionate about giving the next generation the very best foundation to build up on. I&amp;#8217;m a strong believer in that if all that my generation does in their lifetime is to improve what the next generation can do, then we have succeeded. That&amp;#8217;s why I&amp;#8217;m a Scout Leader, and that&amp;#8217;s why Griffin Multimedia provided affordable technical support to primary schools in Western Australia &amp;#8211; because anything I can do to help to make kids smarter, more productive, more empathetic and more understanding members of society is a good thing.&lt;/p&gt;


	&lt;p&gt;To be brutally honest, working at the schools in WA was a major eye-opener in that it really concerns me that in a world that is becoming increasingly technology orientated, schools are being left behind. I&amp;#8217;m going to outline a few of the observations that I made over my time working in these schools.&lt;/p&gt;


	&lt;p&gt;I believe that there are two major problems that need to be solved in the education system in Australia, and they both come down to support. Support for the infrastructure, and support for the teachers.&lt;/p&gt;


	&lt;p&gt;First, a bit of background. I worked at 3 suburban primary schools in Western Australia over about an 18-month period or so. I left WA almost 12 months ago, and so some things may have changed for the better since then. I sure hope so. I was also involved with helping to administer the network at my high school while I was attending, and so I understand many of the problems that are faced in that environment too. Other states and territories? I have no idea, but I can only speculate that they would be in similar positions.&lt;/p&gt;


	&lt;p&gt;Griffin Multimedia went into these schools as IT support consultants. That is, we rocked up each week for a few hours &amp;#8211; usually whatever their meagre &lt;span class="caps"&gt;ICT&lt;/span&gt; budget could afford, and we did whatever needed to be done &amp;#8211; whether this meant managing the network; diagnosing and fixing hardware; troubleshooting, installing and configuring software; installing hardware and networking; or training staff. Some days we&amp;#8217;d even change ink cartridges in printers. We were called in to do all of this for one major reason &amp;#8211; nobody else was handling it.&lt;/p&gt;


	&lt;p&gt;At the time, most of the staff, including principals, were of the same mind &amp;#8211; the education department gives us computers, but give us no support to keep them running. You need a server to manage your student files? Here, have some hardware. You need some classroom PCs? Here, have a few. Oh, by the way, here are some companies that can deal with them for you. You&amp;#8217;ll need to give them a call, get them to come in and give you a quote. Oh, and they&amp;#8217;ll likely charge you over $110 an hour (not including transport). I hope you have large &lt;span class="caps"&gt;ICT&lt;/span&gt; pockets.&lt;/p&gt;


	&lt;p&gt;In most cases, we walked into schools that had &lt;span class="caps"&gt;ICT&lt;/span&gt; infrastructure that was next to useless. All of the schools where we worked were, when we arrived, :&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;an ad-hoc mixture of old and new PCs, some so painfully outdated that they were over 5 years outside of the Education Department&amp;#8217;s own &amp;#8220;ICT Guidelines&amp;#8221; on replacing PCs;&lt;/li&gt;
		&lt;li&gt;often running incompatible versions of Windows and software &amp;#8211; Windows 98 machines next to Windows XP in the same classroom, or inconsistent versions of Office between classes;&lt;/li&gt;
		&lt;li&gt;often either not networked, or only barely so as to provide Internet access, with little or no file sharing and often poorly networked printers (if at all);&lt;/li&gt;
		&lt;li&gt;configured without any security, often using administrator logins;
riddled with spyware and adware, further degrading performance;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The biggest point here is that these PCs were not an asset to the teaching staff or the students &amp;#8211; they were slow, they were buggy and they were just a hassle to use. Staff spent more time trying to get the computers to do what they needed to do, rather than actually teaching with them.&lt;/p&gt;


	&lt;p&gt;After this, I have to say that this made me greatly concerned to hear the Labour government&amp;#8217;s plan to increase the number of laptops in schools for student access. Whilst this is a great idea, with the current suppot systems for schools, this money could be much better spent.&lt;/p&gt;


	&lt;p&gt;As anyone who works in IT can tell you, computers &lt;em&gt;need&lt;/em&gt; maintenance. Networks need maintenance. Whether this ranges from the occasional defragmentation of the hard drive, to cleaning out adware cruft, applying security patches, upgrading operating systems or upgrading hardware &amp;#8211; any network, of any number of hosts, needs maintenance. Without this support, any new hardware provided to schools might be shiny and new for a few months, but after that, &lt;strong&gt;when they start to be used&lt;/strong&gt; &amp;#8211; who is going to maintain them?&lt;/p&gt;


	&lt;p&gt;Let&amp;#8217;s take a brief moment to build up a semi-realistic case study here. Let&amp;#8217;s say we have a small primary school &amp;#8211; 30 students per class, one class per year group, years 1-7 have computers. The Education Department&amp;#8217;s guidelines suggest a minimum of 2-3 PCs per classroom, as well as computer labs for full class sessions. The official figures are about 1 PC per 10 students, or so I have been lead to believe in conversations with principals and IT teachers. So that&amp;#8217;s about 210 students, and about 21 or so student computers &amp;#8211; minimum. In most schools, that&amp;#8217;s likely to be closer to 40-50 or so PCs once a laboratory of computers is added in.&lt;/p&gt;


	&lt;p&gt;That is 20-50 computers that need to be maintained. That&amp;#8217;s network infrastructure for 20-50 computers that needs to be maintained. There will be at least 1 curriculum server that needs to be maintained for those students, and that will likely be used as a fileserver, a web proxy server, and perhaps, if they&amp;#8217;re super lucky, some sort of ActiveDirectory authentication server to handle all of this. Add on to that, a school might host their own website, there is &lt;span class="caps"&gt;DHCP&lt;/span&gt; to be considered, and all of those other &amp;#8220;behind-the-scenes&amp;#8221; type of services that need to be provided in order to ensure a cohesive network. Note that at this stage we&amp;#8217;re not even talking about network printers, scanners, projectors, smartboards, cameras or anything else snazzy that a school might have.&lt;/p&gt;


	&lt;p&gt;Considering all that above, now envisage a school where every single one of those 210 students has a PC.&lt;/p&gt;


	&lt;p&gt;Now, I am aware that Rudd&amp;#8217;s plan involved students in year 9-12, and that&amp;#8217;s fair enough. Thankfully, many Secondary Schools have the resources to employ full time System and Network Administrators who can deal with all of this. But for them, their problems are even larger. In schools where each of those year groups might be 100 students each, that may mean 400 new hosts on their network that they need to support. That&amp;#8217;s 400 more connections to already busy file-servers. That&amp;#8217;s 400 more connections to already busy proxy servers. That&amp;#8217;s 400 more hosts sending and receiving network traffic across the network infrastructure, the core routers and saturating wireless links. 400 hosts means a network that either needs to be subnetted, or needs to be re-configured to a different IP address range. Where a Class C (255 hosts) might have sufficed, now the network needs to be changed to a Class B to support 65025-or-so hosts on the one logical address space.&lt;/p&gt;


	&lt;p&gt;What goes from being a network that can be comfortably serviced by 2-3 trained administrators can now become a network rivalling many medium-to-large businesses &amp;#8211; more servers, more hosts, and more network infrastructure means much more work.&lt;/p&gt;


	&lt;p&gt;The point that I&amp;#8217;m trying to make here is that &lt;strong&gt;there&amp;#8217;s already &lt;span class="caps"&gt;ICT&lt;/span&gt; infrastructure in these schools&lt;/strong&gt;, but what&amp;#8217;s there is &lt;strong&gt;so poorly supported&lt;/strong&gt;, throwing more hardware at it won&amp;#8217;t solve the problem. The problem is &lt;strong&gt;maintaining the infrastructure&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;Who is going to do this for the small schools? Who is going to provide this support? Who is going to be on-site when a disk fails in the file-server and little Johhny and Suzie&amp;#8217;s PowerPoint presentation is lost? Who&amp;#8217;s going to find out what the problem is when &lt;span class="caps"&gt;PC 12&lt;/span&gt; in the lab no longer boots, but sits there beeping? Who&amp;#8217;s going to make sure that those 10 new PCs work on the school network as they should?&lt;/p&gt;


	&lt;p&gt;I happen to believe that the education department could, and should, be doing much more to better support these schools. I don&amp;#8217;t know whether that means Education Department employed on-site technicians, or some method for the department to remotely deploy and manage the network. Regardless of the solution, &lt;strong&gt;something needs to be done to actually make the infrastructure useful&lt;/strong&gt; &amp;#8211; we&amp;#8217;ve thrown all this money at it, and now it&amp;#8217;s just being left to rot.&lt;/p&gt;


	&lt;p&gt;At most schools, we were on-site for 2-3 hours every school week. In those 80-120 hours a year, we were never out of work to be done, and in fact some of the schools I was very unhappy to leave with much of their network still nowhere near to performing to it&amp;#8217;s potential. Sure, you can only get so much performance out of some of the 533MHz clunkers, but at least they were there for students to do &lt;em&gt;some&lt;/em&gt; work on.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll be brutally honest here &amp;#8211; we charged peanuts for the support that we provided. We (unintentionally) undercut our competitors shamelessly, even to the point where one quote that a registrar received from one of the Education Department&amp;#8217;s preferred suppliers was more for transport alone than our hourly rate. But to be honest, I&amp;#8217;d gladly do it all again. Not because it was good business, but because nobody else could provide the service at a price that the schools could afford. Many of the schools thanked us profusely for helping them out, as they just couldn&amp;#8217;t afford the cost to call out many of the other support companies, let alone have them on-site as often as us to keep things running. School &lt;span class="caps"&gt;ICT&lt;/span&gt; budgets are never huge, and that, more often than not, &lt;strong&gt;forces schools into one of two terrible situations&lt;/strong&gt; &amp;#8211; either pretend the problem isn&amp;#8217;t there and don&amp;#8217;t maintain it; or worse, asking IT savvy teachers to support the &lt;span class="caps"&gt;ICT&lt;/span&gt; infrastructure.&lt;/p&gt;


	&lt;p&gt;Now, please don&amp;#8217;t get me wrong. There are some seriously clever teachers out there, and I&amp;#8217;m not saying that teachers can&amp;#8217;t maintain a network. What I am saying, however, is that teachers are employed by a school to teach. Every hour of &lt;acronym title="Duties Other Than Teaching"&gt;DOTT&lt;/acronym&gt; time that they spend trying to fix up a computer &amp;#8211; which, more than likely, is on the fringe of their skill set &amp;#8211; is an hour that they could be spending much more productively. It&amp;#8217;s a false economy on the school&amp;#8217;s part, because not only is it a waste of a teacher&amp;#8217;s time, but I can guarantee that &lt;strong&gt;they won&amp;#8217;t have the time, the experience or the skills to properly, securely, efficiently and completely maintain a school network&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;Heck, some schools we spent 3hrs per week on-site and we could easily have spent another 5hrs there each week. And we&amp;#8217;d still be going.&lt;/p&gt;


	&lt;p&gt;Coming back to the teachers for a moment, there wasn&amp;#8217;t a teacher or principal at the schools that we worked who wasn&amp;#8217;t interested in bringing &lt;span class="caps"&gt;ICT&lt;/span&gt; into their classroom, and utilising it more. Most of the staff we worked with really &lt;a href="http://en.wikipedia.org/wiki/Grok#In_hacker_culture"&gt;grokked&lt;/a&gt; how technology was changing, and that the kids were already savvy, and they wanted to know how to get &lt;span class="caps"&gt;ICT&lt;/span&gt; involved in their classrooms.&lt;/p&gt;


	&lt;p&gt;But in most cases, the teachers and staff lacked the means to do this.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;They didn&amp;#8217;t have time to expand their skills &amp;#8211; already working with a heavy class workload, there was little time left to learn and fine-tune some of techniques they wanted to teach to their students.
  For example, one school approached us to begin a weekly &amp;#8220;Breakfast Bytes&amp;#8221; session with staff in which we could help to train teachers on using different IT tools during some spare time in the morning while they had a bite to eat. Unfortunately, this never got off the ground, but it was a sign that the principal and staff were eager to learn, but were lacking the time or resources to learn the techniques.&lt;/li&gt;
		&lt;li&gt;There was little time available to prepare the class environment for a lesson that heavily involved &lt;span class="caps"&gt;ICT&lt;/span&gt;. For example, the time required to install a software suite across a laboratory, or prepare the computers for a step-by-step lesson for students.
  In many cases, we were able to ease to burden on staff by installing and configuring the tools and packages for them, ready to be used in their classes.&lt;/li&gt;
		&lt;li&gt;They weren&amp;#8217;t sure of what tools and software were available to have their students to use. Often, these tools were either an additional cost that needed to be justified in order to be purchased.
  For example, one class were making environmental radio advertisements, and the teacher was uncertain of what software would be available to do this cheaply and easily. We recommended Audacity in order to provide them with a tool that was free, and simple enough for students to use. It was a simple, cheap solution to something that the teacher was unsure about.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;What I&amp;#8217;m trying to say here is that I do not believe that the problem lies with the teachers, but rather that the teachers aren&amp;#8217;t being supported or provided the resources to be able to teach. If we want teachers to bring more technology into the classroom, we need to acknowledge that they first need training &amp;#8211; and lots of it.&lt;/p&gt;


	&lt;p&gt;With the explosion of the Internet, where technology is constantly changing, it&amp;#8217;s essential that we not only teach children how to work with the tools today, but teach them how to adapt to the new technologies as they emerge. When we finally do hand school-children these tools, and when they&amp;#8217;re all working as they should, they need to be prepared to use it in a safe and productive manner.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m not just talking the usual online safety &amp;#8220;don&amp;#8217;t give out your home address&amp;#8221; spiel. I&amp;#8217;m talking things that even adults are struggling with &amp;#8211; the concepts of &lt;span class="caps"&gt;SPAM&lt;/span&gt; and phishing, password safety and security, and all that jazz. I&amp;#8217;m not talking anything full on, or turning our kids into walking &lt;span class="caps"&gt;SPAM&lt;/span&gt; filters &amp;#8211; I&amp;#8217;m saying that we need to foster an acknowledgement that, hey, maybe this email saying it&amp;#8217;s from &amp;#8220;MySpace Tom&amp;#8221; isn&amp;#8217;t really Tom from class 6.&lt;/p&gt;


	&lt;p&gt;We need to teach our children to identify between what is advertising and what is real content; that Wikipedia is a great source, but that it isn&amp;#8217;t without flaws. We need to teach our kids about the notion of anonymity, and the responsibility this entails. Just as we want our children to become productive members of society &amp;#8211; to create and not just consume &amp;#8211; we should be teaching them to create and share on the Internet. We need to show them &lt;a href="http://www.shirky.com/herecomeseverybody/2008/04/looking-for-the-mouse.html"&gt;where the the mouse is.&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;But how do we do this? To be honest, I&amp;#8217;ve not really got a clue. But there are awfully clever educators out there who already know this stuff, and who know how to impart this on to the next generation. And these people need the support of the education system to share this with their peers and their students.&lt;/p&gt;


	&lt;p&gt;I honestly believe that Government needs to acknowledge that &lt;strong&gt;there&amp;#8217;s far more than just hardware required in our schools&lt;/strong&gt;, and that they step up to the plate and start providing schools and staff with the support to keep their &lt;span class="caps"&gt;ICT&lt;/span&gt; infrastructure running &amp;#8211; in both technical support and training.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/9l81yO94u0A" height="1" width="1"/&gt;</description>
          <pubDate>Wed, 28 May 2008 16:45:54 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/thoughts-and-observations-on-ict-in-education/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/9l81yO94u0A/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/thoughts-and-observations-on-ict-in-education/</feedburner:origLink></item>
    
        <item>
          <title>Maybe I Should Be a Plumber?</title>
          <description>&lt;p&gt;It seems this week that I should reconsider my vocation, as work with pipes (no, not &lt;a href="http://en.wikipedia.org/wiki/Series_of_tubes"&gt;just the usual tubes&lt;/a&gt;) has been featuring prominently. Firstly, I had to put in a drainage pipe under the garden bed which I&amp;#8217;ve (slowly) been building for Rach. Hopefully it will save the paving against the side of our house from flooding every time it rains. That would be super cool&amp;#8230;&lt;/p&gt;


	&lt;p&gt;The second incident, and one which some of you might have noticed, is that &lt;a href="http://switchpipe.org/"&gt;SwitchPipe&lt;/a&gt; has been acting like a bitch. You may have noticed my sites being down at random intervals lately? Yup, that&amp;#8217;s SwitchPipe dying off for no good reason. And after I&amp;#8217;d &lt;a href="http://griffin.oobleyboo.com/archive/switchpipe-for-fun-and-profit/"&gt;said so many nice things about it&lt;/a&gt;!!!&lt;/p&gt;


	&lt;p&gt;I was away when it first started, receiving a phone call from &lt;a href="http://www.truelocal.com.au/"&gt;truelocal&lt;/a&gt; (of all folks!) letting me know that the &lt;a href="http://achernarsolutions.com.au/"&gt;Achernar Solutions&lt;/a&gt; site was down. Great. I then got an email from &lt;a href="http://www.petercooper.co.uk/"&gt;Peter&lt;/a&gt; &amp;#8211; you know, the dude who wrote SwitchPipe &amp;#8211; saying something along the lines of &amp;#8220;Hey! Notice your site is down, hope it&amp;#8217;s not because of SwitchPipe&amp;#8221;. Gak!&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://groups.google.com/group/switchpipe/browse_thread/thread/feee72b509db8ac4/d81f733cb3e325e3"&gt;Several other people&lt;/a&gt; on the &lt;a href="http://groups.google.com/group/switchpipe"&gt;SwitchPipe group&lt;/a&gt; had been having the same problem &amp;#8211; SwitchPipe would sit around for ages, working perfectly, and then it would just die with no explanation.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll spare you the more boring bits about finding and hunting down the problem. Suffice to say that it involved lots of extra logging calls, and hacking logging calls into the &lt;a href="http://rubyforge.org/projects/eventmachine/"&gt;EventMachine&lt;/a&gt; library.&lt;/p&gt;


	&lt;p&gt;Just now, I managed to reproduce the problem, fix it, create a patch and fire it off. Hopefully, that&amp;#8217;ll be the end of this freaking irritating bug.&lt;/p&gt;


	&lt;p&gt;What seemed to be causing it (and how I finally reproduced it) was making a &amp;#8220;GET / &lt;span class="caps"&gt;HTTP&lt;/span&gt;/1.0&amp;#8221; request to SwitchPipe. The key bit there is the request for &amp;#8221;/&amp;#8221;. A fairly safe request, one would think. Well, not quite. I&amp;#8217;m fairly certain that &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html"&gt;mod_proxy&lt;/a&gt; sends requests just like this off to back-end servers periodically, just to see if they&amp;#8217;re alive. This is likely what was happening in my case.&lt;/p&gt;


	&lt;p&gt;See, SwitchPipe first tries to find which site to serve based upon the directory name in the request. &amp;#8221;/&amp;#8221; has no directory. Oops! As such, that code returns false (as in, the FalseClass object), where it would normally return a string of the directory name. Not &lt;em&gt;that_bad&lt;/em&gt; so far. However, later on, this string was turned into a symbol using to_sym(). Ok, &lt;strong&gt;&lt;span class="caps"&gt;BUT&lt;/span&gt;&lt;/strong&gt; FalseClass doesn&amp;#8217;t have a to_sym() method! So what happened? Exceptions were raised, Threads died, and eventually, SwitchPipe would come to a standstill.&lt;/p&gt;


	&lt;p&gt;This sort of stems from the fact that EventMachine creates 20 Thread objects when it&amp;#8217;s running, but never manages or restarts them. It just assumes that they&amp;#8217;ll always be alive until it says otherwise. So, when a Thread died thanks to the Exception being thrown, the pool just continued getting smaller and smaller until, finally, there are no more Threads to handle the requests.&lt;/p&gt;


	&lt;p&gt;Hopefully with &lt;a href="http://groups.google.com/group/switchpipe/msg/ffe07f40a06f1134"&gt;this patch&lt;/a&gt; things will be back to normal with my sites, and they should stay up. Aside from this one small (but nasty) bug, SwitchPipe has been working like a charm. Ironically, the problem only surfaced after I made the post about it. Typical!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/nfw3Pk0WuhI" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 04 Apr 2008 04:48:10 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/maybe-i-should-be-a-plumber/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/nfw3Pk0WuhI/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/maybe-i-should-be-a-plumber/</feedburner:origLink></item>
    
        <item>
          <title>SwitchPipe for Fun and Profit</title>
          <description>&lt;div id="update" class="important note"&gt;
&lt;p&gt;Peter has stopped development on SwitchPipe in favour of &lt;a href="http://www.modrails.com/"&gt;mod_rails&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can read a bit about my experience with it in &lt;a href="http://griffin.oobleyboo.com/archive/ruby-enterprise-edition-gem-install-script/"&gt;Ruby Enterprise Edition Gem Install Script&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;You may have seen or heard about &lt;a href="http://switchpipe.org"&gt;SwitchPipe&lt;/a&gt; &amp;#8211; a tool written by &lt;a href="http://peterc.org/"&gt;Peter Cooper&lt;/a&gt;, the dude who writes for &lt;a href="http://www.rubyinside.com/"&gt;RubyInside&lt;/a&gt;. Effectively, SwitchPipe is a proxy-esque Ruby app which listens on a port for requests and palms them off to Mongrel, thin, WEBrick, and other applications according to which site the request belongs to. The magic comes in that it&amp;#8217;s able to dynamically start, stop and manage the number of processes you have running for your sites, helping you to use your memory and cycles better.&lt;/p&gt;


	&lt;p&gt;For example, for most production Rails sites you&amp;#8217;ll want to have at least 2 mongrels running to ensure that it&amp;#8217;s responsive even when someone is doing something that takes a while (eg. slow upload, long running query, etc.) However, when the server is idle, or the site is not busy, there&amp;#8217;s a mongrel kicking about doing nothing but chewing up a big batch of memory. SwitchPipe allows you to say things like &amp;#8220;for this site, keep 1 mongrel running at all times, and if it can&amp;#8217;t handle it because it&amp;#8217;s too busy, you&amp;#8217;re allowed to start up to 3 other instances&amp;#8221;. Then, after a period of inactivity (which you can define) your mongrel instance dies off, freeing up memory again. You also have the benefit of being able to &amp;#8220;burst&amp;#8221; a bunch of instances for a short period of time. For example, you might get a rush of users making slow requests &amp;#8211; SwitchPipe can start up more instances of your application to keep your site responsive, and you can still set limits easily to ensure that one site can&amp;#8217;t overload your server.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s a totally sexy tool &amp;#8211; I&amp;#8217;m using it exclusively on my new &lt;a href="http://www.slicehost.com"&gt;SliceHost&lt;/a&gt; slice. As the slice currently only has 256Mb of &lt;span class="caps"&gt;RAM&lt;/span&gt;, having more than a few mongrels running at any time (especially with some of my larger applications) causes the server to slip into a swapping nightmare. So, I&amp;#8217;m using SwitchPipe to dynamically start and stop the instances as they&amp;#8217;re required. This means that my quieter sites (this blog, for example) isn&amp;#8217;t always chewing up memory, and that memory can be used by the busier applications.&lt;/p&gt;


	&lt;p&gt;There is a slight hit when starting a new instance, but it&amp;#8217;s not terrible &amp;#8211; usually a few seconds, depending on how fast the server can start the Mongrel instance. For example, on my server I say that I don&amp;#8217;t want any mongrels always kicking around for this blog, but once they&amp;#8217;re started they should live for a few minutes before dying off. This means that when a visitor navigates to my site, they wait a couple of seconds while Mongrel is started (unless it&amp;#8217;s already started), and then so long as they make another request before the instance times out, it&amp;#8217;ll all be super fast and sexy &amp;#8211; reusing the already started instance. Of course, I also use Apache to serve my static content so as that images, etc. will always be super fast to be delivered.&lt;/p&gt;


	&lt;p&gt;Not convinced? Not just this blog is running through SwitchPipe &amp;#8211; so is the &lt;a href="http://achernarsolutions.com.au"&gt;Achernar Solutions&lt;/a&gt; site, and 5 or so other sites on this server. And they&amp;#8217;ve all been running in this way for well over a month with absolutely no problems. I haven&amp;#8217;t even bothered to install &lt;a href="/projects/pal"&gt;pal&lt;/a&gt; on the new slice (pal is the tool I wrote to make managing Rails sites easier for administrators) because SwitchPipe is simpler, and has more features. SwitchPipe manages all the ports for me automatically and manages starting and stopping all the processes for me. Why would I need pal when I just need to drop a &lt;span class="caps"&gt;YAML&lt;/span&gt; configuration file into SwitchPipe&amp;#8217;s configuration directory and it will pick it up on it&amp;#8217;s own and start handling the site?&lt;/p&gt;


	&lt;p&gt;So, if you&amp;#8217;re hosting Rails apps, Merb apps, Django apps, and a whole host of others, SwitchPipe is going to make your life simpler. &lt;a href="http://switchpipe.org"&gt;Check it out!&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/ytqDFnTbdTw" height="1" width="1"/&gt;</description>
          <pubDate>Thu, 06 Mar 2008 00:59:44 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/switchpipe-for-fun-and-profit/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/ytqDFnTbdTw/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/switchpipe-for-fun-and-profit/</feedburner:origLink></item>
    
        <item>
          <title>RadiantCMS Extensions Load Order GOTCHA</title>
          <description>&lt;p&gt;Just a super short post in case anyone hits the same problem I did with setting up &lt;a href="http://wiki.radiantcms.org/Thirdparty_Extensions"&gt;extensions&lt;/a&gt; for &lt;a href="http://www.radiantcms.org"&gt;RadiantCMS&lt;/a&gt;.&lt;/p&gt;


If running &lt;strong&gt;db:migrate:extensions&lt;/strong&gt; gives you an error, such as :
&lt;pre&gt;# rake production db:migrate:extensions
...
rake aborted!
undefined method `page' for #&amp;lt;Radiant::AdminUI:0x45b4a38&amp;gt;

(See full trace by running task with --trace)&lt;/pre&gt;

	&lt;p&gt;The issue may be because the other extensions are loading before &lt;a href="http://dev.radiantcms.org/radiant/browser/trunk/extensions/shards/README"&gt;shards&lt;/a&gt;, as extensions are loaded in alphabetical order.&lt;/p&gt;


	&lt;p&gt;In my case, &lt;a href="http://dev.radiantcms.org/radiant/browser/trunk/extensions/reorder/README"&gt;reorder&lt;/a&gt; was loading before &lt;a href="http://dev.radiantcms.org/radiant/browser/trunk/extensions/shards/README"&gt;shards&lt;/a&gt;, and hence the error.&lt;/p&gt;


Once I fixed up the load order in config/environment.rb, everything went great :
&lt;pre&gt;config.extensions = [ :shards, :all ]&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/6Qbx8_dsq7w" height="1" width="1"/&gt;</description>
          <pubDate>Mon, 04 Feb 2008 14:39:46 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/radiantcms-extensions-load-order-gotcha/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/6Qbx8_dsq7w/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/radiantcms-extensions-load-order-gotcha/</feedburner:origLink></item>
    
        <item>
          <title>Every Era Has an End</title>
          <description>&lt;p&gt;Well, today&amp;#8217;s the day. As of the 1st of February 2008, I am no longer part of &lt;a href="http://www.gmm.com.au"&gt;Griffin Multimedia&lt;/a&gt; as it has been purchased by Paul and his friendly cohorts at &lt;a href="http://www.insilico.com.au"&gt;in silico&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;We originally set up &lt;span class="caps"&gt;GMM&lt;/span&gt; in March 2003 &amp;#8211; just out of high school, just starting in University and really just learning. It&amp;#8217;s been fun, but all good things must come to an end.&lt;/p&gt;


	&lt;p&gt;Over those 5 years, I&amp;#8217;ve had the opportunity to work with a whole host of people and businesses &amp;#8211; some that I&amp;#8217;m proud to say that I&amp;#8217;ve worked with, and others that I&amp;#8217;m glad to no longer be associated with. It&amp;#8217;s definitely been a learning experience &amp;#8211; one which I&amp;#8217;d be lying if I said that I loved every moment of, but one that has been fun, and one that I don&amp;#8217;t regret (too much :P).&lt;/p&gt;


	&lt;p&gt;In those 5 years, I abandoned Uni, we&amp;#8217;ve changed servers 3 times, Craig has finished his degree, Danny&amp;#8217;s been to Japan twice, I&amp;#8217;ve moved more times than I can count, finally ending up in New South Wales, and we helped a variety of businesses and community groups to develop a presence on the Internet.&lt;/p&gt;


	&lt;p&gt;So, I thought I&amp;#8217;d put a shout out to all the folks that have been an inspiration to me over the 5 years, and those folks who have helped us along our way.&lt;/p&gt;


	&lt;p&gt;Firstly, definitely has to go to &lt;a href="http://www.insilico.com.au"&gt;Paul O&amp;#8217;Neill&lt;/a&gt;. I originally met Paul doing work experience at the small Perth &lt;span class="caps"&gt;ISP&lt;/span&gt; &amp;#8211; v-App &amp;#8211; which Paul was one of the principals of. Paul has a lot to be responsible for &amp;#8211; including my first introduction to &lt;a href="http://www.pragprog.com/the-pragmatic-programmer"&gt;The Pragmatic Programmers&lt;/a&gt;, teaching me OO better, faster and more coherently than University, and for giving me support in developing from some teenager who loved writing code to a young dude being able to write code for a living. Through those 5 years we&amp;#8217;ve both had ups and downs &amp;#8211; both professionally, and personally, and I&amp;#8217;m privileged to have him as a friend through all of that. Not to mention his awesome skills as a &lt;a href="http://creatingminds.org/tools/rubber_ducking.htm"&gt;rubber duck&lt;/a&gt; and someone to throw zany code ideas around with.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m glad that Paul, Naomi and all the guys at in silico are taking over our clients &amp;#8211; I can&amp;#8217;t think of any other company that I would trust to treat them as well.&lt;/p&gt;


	&lt;p&gt;Next, &lt;a href="http://thetelegraphic.com/"&gt;Danny&lt;/a&gt; and Craig, my ex-partners. These guys deserve a huge thanks just for putting up with me, for being awesome dudes, and for reminding me that just because we&amp;#8217;re in business doesn&amp;#8217;t mean that everything has to be totally serious all the time. Again, we&amp;#8217;ve had our ups and downs, but they&amp;#8217;ve never let that get in the way of business, and I appreciate both of them for that. &lt;span class="caps"&gt;GMM&lt;/span&gt; did well to make it as far as we did, and it wouldn&amp;#8217;t have been anywhere near as fun without them. The only regret? All of the cool apps that we wanted to build that we never got around to. They&amp;#8217;re both super clever and talented dudes, and I&amp;#8217;m sure they&amp;#8217;ll do great in the future &amp;#8211; whether that&amp;#8217;s in IT, design, photography or music.&lt;/p&gt;


	&lt;p&gt;To all of you folks that have been good enough to throw work at us over the past 5 years &amp;#8211; to &lt;a href="http://zanchey.ucc.asn.au/"&gt;Zanchey&lt;/a&gt;, who&amp;#8217;s sent me enough referrals over the years to leave me eternally indebted to him; to &lt;a href="http://dirkkelly.com/"&gt;Dirk&lt;/a&gt;, who (unbeknownst to him) has often reminded me that I love writing code, and if it&amp;#8217;s not fun you&amp;#8217;re not doing it right; to &lt;a href="http://www.tmias.com"&gt;George&lt;/a&gt;, who seems to take a sadistic delight in getting a perfectly good design sorted, and then sending me a &amp;#8220;revision&amp;#8221; when I&amp;#8217;ve just finished the first one; and to Andy, who will probably never read this, but hopefully is doing great with all of the amazing ideas that he has. To all of you, thank you for the friendship and trust that you&amp;#8217;ve shown to us in the past. There&amp;#8217;s nothing harder than referring a friend to someone, and without you we&amp;#8217;d have closed up shop long ago.&lt;/p&gt;


	&lt;p&gt;Finally, to my family. Despite the fact that they&amp;#8217;ve probably never quite understood just what I&amp;#8217;m rabbiting on about (since I was 8, probably), and have looked on with fear and concern as I&amp;#8217;ve worked myself into the ground over one project or another (or from caffeine abuse), they&amp;#8217;ve always just been there &amp;#8211; which is much more important than it sounds. Whenever I&amp;#8217;ve had problems with business, need some advice, or just need someone to bitch and moan to, they&amp;#8217;ve been there.&lt;/p&gt;


	&lt;p&gt;So, what&amp;#8217;s happening now?&lt;/p&gt;


	&lt;p&gt;As I mentioned in a &lt;a href="/archive/introducing-achernar-solutions/"&gt;previous post&lt;/a&gt;, I&amp;#8217;ve set up a new business &amp;#8211; &lt;a href="http://achernarsolutions.com.au"&gt;Achernar Solutions&lt;/a&gt;, where I&amp;#8217;m looking at doing far more development and consulting work. Coding, thinking, building &amp;#8211; the stuff that I love. I&amp;#8217;m available to &lt;a href="http://achernarsolutions.com.au/web-application-development-and-maintenance"&gt;build web applications&lt;/a&gt;, for &lt;a href="http://achernarsolutions.com.au/ruby-on-rails-consulting"&gt;Ruby on Rails consulting&lt;/a&gt;, and &lt;a href="http://achernarsolutions.com.au/linux-support-services"&gt;remote Linux support&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m also staying on with in silico as their Systems Administrator &amp;#8211; making sure that my baby (the server) stays running for long enough until they can easily maintain it themselves.&lt;/p&gt;


	&lt;p&gt;Aside from that, who knows? It&amp;#8217;s the start of a brand new year, and I&amp;#8217;m looking forward to seeing everything that it has to offer.&lt;/p&gt;


	&lt;p&gt;May the next 5 years be as successful as the past 5!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/4izId9cSfqM" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 01 Feb 2008 18:16:09 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/every-era-has-an-end/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/4izId9cSfqM/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/every-era-has-an-end/</feedburner:origLink></item>
    
        <item>
          <title>Scaremongering About Australia's Proposed Filters</title>
          <description>&lt;p&gt;In addition to &lt;a href="http://griffin.oobleyboo.com/archive/australias-proposed-world-class-broadband/"&gt;my last post&lt;/a&gt; regarding Australia&amp;#8217;s proposed mandatory Internet Filter, this is a copy of &lt;a href="http://phillipmalone.com/2008/01/07/second-life-skype-even-google-wont-blocked-by-the-australian-government/#comment-15"&gt;a comment&lt;/a&gt; that I have just posted in response to &lt;a href="http://phillipmalone.com/"&gt;Phillip Malone&amp;#8217;s&lt;/a&gt; post, &lt;a href="http://phillipmalone.com/2008/01/07/second-life-skype-even-google-wont-blocked-by-the-australian-government/"&gt;Second Life, Skype, Even Google Won’t be blocked by The Australian Government?&lt;/a&gt;, which was itself a response to &lt;a href="http://duncanriley.com/"&gt;Duncan Riley&amp;#8217;s&lt;/a&gt; recent post, &lt;a href="http://www.duncanriley.com/2008/01/06/will-second-life-skype-even-google-by-blocked-by-the-australian-government/"&gt;Will Second Life, Skype, Even Google Be Blocked By The Australian Government?&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Whilst I agree that some of what Duncan points out may be slight exaggerations, I believe it highlights the problem with the policy as it has been presented to the public to date &amp;#8211; we don&amp;#8217;t know &lt;strong&gt;what&lt;/strong&gt; is going to be blocked under the new filter, and therefore Duncan&amp;#8217;s suggestions could, in fact, be possible at this stage. The comment I left for Molly is as follows:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;I think the main point that many folks are trying to make with these claims (which I agree are often exaggerated) is that, from what the public has been told so far, it&amp;#8217;s not possible to say what will and won&amp;#8217;t be filtered.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;I&amp;#8217;ve not seen anywhere refer to a black and white classification system of what will and won&amp;#8217;t be blocked under this policy. Regardless of any of the (considerable) technical problems, we&amp;#8217;re effectively at the whim of whoever is running the programme once it is in place. Is there a government document setting out what is and isn&amp;#8217;t acceptable content?&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;From what has been publicly released thus far &amp;#8211; a few phrases with non-specific terms such as &amp;#8220;objectionable content&amp;#8221; &amp;#8211; the only thing that we can be certain is to be on the list (and quite rightly so) is child pornography. However the question is still wide open as to what else could be on that list. The fact that the classification system is not public and transparent is a huge problem.&lt;/p&gt;
	&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/griffinblog/~4/zJ6GvmbbTE4" height="1" width="1"/&gt;</description>
          <pubDate>Wed, 09 Jan 2008 13:00:47 GMT</pubDate>
          <guid isPermaLink="false">http://griffin.oobleyboo.com/archive/scaremongering-about-australias-proposed-filters/</guid>
          <link>http://feedproxy.google.com/~r/griffinblog/~3/zJ6GvmbbTE4/</link>
        <feedburner:origLink>http://griffin.oobleyboo.com/archive/scaremongering-about-australias-proposed-filters/</feedburner:origLink></item>
    
    
  </channel>
</rss>
