<?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>Top Secret Project</title>
	<atom:link href="http://info-architects.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://info-architects.net</link>
	<description>Toby Hede's Blog on Ruby, Rails, Facebook Development, User Experience and Stuff</description>
	<lastBuildDate>Sun, 01 Mar 2009 09:28:21 +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>The End</title>
		<link>http://info-architects.net/2009/03/01/the-end/</link>
		<comments>http://info-architects.net/2009/03/01/the-end/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 09:28:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=92</guid>
		<description><![CDATA[After 10 years with this domain, which I originally started to manage the  Information Architecture list I ran (which had a whole bunch of traffic at one stage) it&#8217;s time to move on. So this is the end. And a new beginning. And funnily, there is not much difference between the two: Top Secret Project [...]]]></description>
			<content:encoded><![CDATA[<p>After 10 years with this domain, which I originally started to manage the  <strong>Information Architecture</strong> list I ran (which had a whole bunch of traffic at one stage) it&#8217;s time to move on.</p>
<p>So this is the end.</p>
<p>And a new beginning.</p>
<p>And funnily, there is not much difference between the two:</p>
<p><a href="http://topsecretproject.finitestatemachine.com/">Top Secret Project </a>now lives at:</p>
<p>http://topsecretproject.finitestatemachine.com/</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2009/03/01/the-end/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP equivalent of Django Admin?</title>
		<link>http://info-architects.net/2008/08/20/php-equivalent-of-django-admin/</link>
		<comments>http://info-architects.net/2008/08/20/php-equivalent-of-django-admin/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 05:28:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=87</guid>
		<description><![CDATA[So &#8230; where is the PHP equivalent of Django Admin? Or the multitude of Rails Admin plugins? I don&#8217;t care what framework it sits on as long as the out-of-the-box functionality is awesome.]]></description>
			<content:encoded><![CDATA[<p>So &#8230; where is the PHP equivalent of<strong> Django Admin</strong>? Or the <strong>multitude</strong> of Rails Admin plugins?</p>
<p>I don&#8217;t care what framework it sits on as long as the out-of-the-box functionality is <strong>awesome</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/08/20/php-equivalent-of-django-admin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>New Facebook App: Telstra HeroMessage&#174;</title>
		<link>http://info-architects.net/2008/07/21/new-facebook-app-telstra-heromessage/</link>
		<comments>http://info-architects.net/2008/07/21/new-facebook-app-telstra-heromessage/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 09:46:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[FiniteStateMachine]]></category>
		<category><![CDATA[Facebook Application]]></category>
		<category><![CDATA[Telstra]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=85</guid>
		<description><![CDATA[Been very quiet, but I have been working a lot, among other things. I am happy to announce the launch of my latest Facebook Application: Telstra HeroMessage. You can read all about it at the  Telstra HeroMessage® Facebook Application About Page. I am pretty excited about it, a massive national media campaign is already underway.]]></description>
			<content:encoded><![CDATA[<p>Been very quiet, but I have been working <strong>a lot</strong>, among other things.</p>
<p>I am happy to announce the launch of my latest <strong>Facebook Application</strong>: <a title="Telstra HeroMessage®" href="http://apps.facebook.com/heromessage/ ">Telstra HeroMessage</a>. You can read all about it at the  <a title="Telstra HeroMessage® About Page" href="http://www.facebook.com/apps/application.php?id=17585889431">Telstra HeroMessage® Facebook Application About Page</a>.</p>
<p>I am pretty excited about it, a <strong>massive</strong> national media campaign is already underway.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/07/21/new-facebook-app-telstra-heromessage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>*this*</title>
		<link>http://info-architects.net/2008/07/19/this/</link>
		<comments>http://info-architects.net/2008/07/19/this/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 10:34:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=84</guid>
		<description><![CDATA[Is all I think about]]></description>
			<content:encoded><![CDATA[<p>Is all I think about</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/07/19/this/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails Plugin &#8211; Acts As Scheduled</title>
		<link>http://info-architects.net/2008/04/19/rails-plugin-acts-as-scheduled/</link>
		<comments>http://info-architects.net/2008/04/19/rails-plugin-acts-as-scheduled/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 01:29:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=83</guid>
		<description><![CDATA[I&#8217;ve just released the first pass of a Ruby on Rails Plugin called Acts As Scheduled. acts_as_scheduled allows you to manage scheduled events for your models. A good example of this is scheduling the update of RSS Feeds in a background process using Cron or BackgroundRB. With acts_as_scheduled your schedule manager can simply call &#8220;Model.find_next_scheduled()&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released the first pass of a <strong>Ruby on Rails Plugin </strong>called <a href="http://code.google.com/p/act-as-scheduled/"><strong>Acts As Scheduled</strong></a>.</p>
<blockquote><p><a href="http://code.google.com/p/act-as-scheduled/">acts_as_scheduled</a> allows you to manage scheduled events for your models.</p>
<p>A good example of this is scheduling the update of RSS Feeds in a background process using Cron or BackgroundRB.</p>
<p>With acts_as_scheduled your schedule manager can simply call &#8220;Model.find_next_scheduled()&#8221; to grab the next item from the database.</p></blockquote>
<p>At the moment it assumes you are working with <strong>MySQL</strong>.</p>
<p>All you need to get started is to add two extra columns to your table:</p>
<blockquote><p>t.integer 	frequency<br />
t.datetime 	last_scheduled</p></blockquote>
<p>frequency is the number of <strong>seconds</strong> for your schedule.<br />
last_scheduled is the date and time the record was last processed.</p>
<p>Ruby on Rails is real smart with times, so you don&#8217;t have to worry too much about calculating frequency values:</p>
<blockquote><p>model.frequency = 1.day<br />
model.frequency = 1.minute<br />
model.frequency = 10.second</p></blockquote>
<p>In your model class your simply declare &#8220;acts_as_scheduled&#8221; and you now have two extra methods find_next_scheduled and schedule_complete.</p>
<blockquote><p><strong>find_next_scheduled</strong><br />
Returns the next scheduled record from the table.<br />
The next scheduled record is calculated as &#8220;the record who&#8217;s last_scheduled value is less than the current time minus the specified frequency in seconds&#8221;.</p>
<p>Which is the complex way of saying &#8220;if freqency is 1 minute, return the record if it was last_scheduled more than 1 minute ago&#8221;</p>
<p>If there is more than one record, records scheduled to occur more frequently will be handled first (so records with minute schedules are returned before records with daily schedules.</p></blockquote>
<blockquote><p><strong>schedule_complete</strong><br />
Sets the record&#8217;s last_scheduled value to Time.now</p></blockquote>
<p><strong>Example</strong></p>
<blockquote><p>class ScheduledItem &lt; ActiveRecord::Base<br />
acts_as_scheduled<br />
end</p>
<p>schedule_minute = ScheduledItem.new(:frequency =&gt; 1.minute, :last_scheduled =&gt; 2.seconds.ago)<br />
schedule_minute.save</p>
<p>schedule_day = ScheduledItem.new(:name =&gt;&#8221;day&#8221;, :frequency =&gt; 1.day, :last_scheduled =&gt; 25.hours.ago)<br />
schedule_day.save</p>
<p>#returns thing_day because it was last_scheduled 25 hours ago<br />
schedule_day = ScheduledItem.find_next_scheduled<br />
schedule_day.do_some_stuff<br />
schedule_day.schedule_complete<br />
schedule_day.save</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/04/19/rails-plugin-acts-as-scheduled/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Persistent Storage on Amazon EC2 Announced</title>
		<link>http://info-architects.net/2008/04/15/persistent-storage-on-amazon-ec2-announced/</link>
		<comments>http://info-architects.net/2008/04/15/persistent-storage-on-amazon-ec2-announced/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 02:40:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Amazon EC2]]></category>
		<category><![CDATA[Amazon Web Services]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=82</guid>
		<description><![CDATA[The final piece in the EC2 web-hosting puzzle has been announced: This new feature provides reliable, persistent storage volumes, for use with Amazon EC2 instances. These volumes exist independently from any Amazon EC2 instances, and will behave like raw, unformatted hard drives or block devices, which may then be formatted and configured based on the [...]]]></description>
			<content:encoded><![CDATA[<p>The final piece in the EC2 web-hosting puzzle has been announced:</p>
<blockquote><p><span><span style="font-family: verdana; font-size: x-small;"> This new feature provides reliable, persistent storage volumes, for use with Amazon EC2 instances. These volumes exist independently from any Amazon EC2 instances, and will behave like raw, unformatted hard drives or block devices, which may then be formatted and configured based on the needs of your application. The volumes will be significantly more durable than the local disks within an Amazon EC2 instance. Additionally, our persistent storage feature will enable you to automatically create snapshots of your volumes and back them up to Amazon S3 for even greater reliability.</span></span></p></blockquote>
<p>Until now the only way to get real MySQL storage has been to jump through some hoops with multiple EC2 instances or back the database onto S3 (with subsequent latency overhead).  With 100GB of outbound data transfer the smallest ECV2 image will cost you about $90/month for 1.7GB of memory and a dedicated CPU core. The price just cannot be beat.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/04/15/persistent-storage-on-amazon-ec2-announced/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bad things done well: accepting dangerous input with Rails</title>
		<link>http://info-architects.net/2008/04/02/bad-things-done-well-accepting-dangerous-input-with-rails/</link>
		<comments>http://info-architects.net/2008/04/02/bad-things-done-well-accepting-dangerous-input-with-rails/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 03:23:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://info-architects.net/?p=79</guid>
		<description><![CDATA[For various reasons I need to be able to be able to accept some script input from the client. The basic requirement is to be able to accept some Ruby code from the client in order to allow customisation of the HTML output from an RSS feed. This is obviously a rather dangerous thing. I [...]]]></description>
			<content:encoded><![CDATA[<p>For various reasons I need to be able to be able to accept some script input from the client.</p>
<p>The basic requirement is to be able to accept some Ruby code from the client in order to allow customisation of the HTML output from an RSS feed.</p>
<p>This is obviously a rather dangerous thing. I essentially need to allow arbitrary Ruby to be executed with an <em>eval</em></p>
<p>However, in Ruby, we can run code in <a href="http://www.rubycentral.com/pickaxe/taint.html">SAFE mode</a>.</p>
<p>At<strong> Level 4</strong>:</p>
<blockquote><p>Ruby effectively partitions the running program in two. Nontainted   objects may not be modified. Typically, this will be used to create a    sandbox: the program sets up an environment using a lower   <code>$SAFE</code> level, then resets <code>$SAFE</code> to 4 to prevent   subsequent changes to that environment</p></blockquote>
<p>The core of my approach is to create a new Thread, set the SAVE level to 4 and call a method.</p>
<blockquote><p>feed = FeedNormalizer::FeedNormalizer.parse(open(self.url))<br />
thread = Thread.start {<br />
$SAFE = 4<br />
html = safe_method(feed, script)}<br />
}<br />
thread.join #wait for the thread to finish</p></blockquote>
<p>The safe_method itself does a sanity check on the safe level. The method takes a feed object and a script &#8211; the script is processed using eval and because the feed object is in the context, the script has access to it. However, the safe level prevents any malicious code from attempting to use Ruby magic and meta-programming to gain access to variables outside the thread or any globals</p>
<blockquote><p>def safe_method(feed,script)<br />
if ( $SAFE &lt; 4   )<br />
raise &#8220;SecurityException: attempting to execute UNSAFE script&#8221;<br />
end</p>
<p>html = &#8220;&#8221;<br />
eval(script)<br />
return html<br />
end</p></blockquote>
<p>The user can then pass in code that looks like:</p>
<blockquote><p>html &lt;&lt; &#8220;&lt;h2&gt;#{feed.title}&lt;/h2&gt;&#8221;<br />
html &lt;&lt; &#8220;&lt;ul&gt;&#8221;<br />
feed.entries.each do |entry|<br />
&nbsp;&nbsp;html &lt;&lt; &#8220;&lt;li&gt;&lt;a href=\&#8221;#{entry.urls.first}\&#8221;&gt;#{entry.title}&lt;/a&gt;&lt;/li&gt;&#8221;<br />
end<br />
html &lt;&lt; &#8220;&lt;/ul&gt;&#8221;</p></blockquote>
<p>And the feed is processed without (too much) risk.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/04/02/bad-things-done-well-accepting-dangerous-input-with-rails/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Emperor Has No Clothes: No RSS for Jakob Nielsen</title>
		<link>http://info-architects.net/2008/03/11/the-emperor-has-no-clothes-no-rss-for-jakob-nielsen/</link>
		<comments>http://info-architects.net/2008/03/11/the-emperor-has-no-clothes-no-rss-for-jakob-nielsen/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 09:24:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Interface Design]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[User-experience]]></category>

		<guid isPermaLink="false">http://info-architects.net/2008/03/11/the-emperor-has-no-clothes-no-rss-for-jakob-nielsen/</guid>
		<description><![CDATA[It&#8217;s been a while since I regularly read Jakob Nielsen&#8217;s Alertbox: Current Issues in Web Usability. Imagine my surprise when I find no RSS &#8230; the largest change to web use since the browser itself, and all we can get access to is email alerts.]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while since I regularly read Jakob Nielsen&#8217;s <a href="http://www.useit.com/alertbox/">Alertbox: Current Issues in Web Usability</a>. Imagine my surprise when I find no RSS &#8230; the largest change to web use since the browser itself, and all we can get access to is email alerts.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/03/11/the-emperor-has-no-clothes-no-rss-for-jakob-nielsen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Miscellany</title>
		<link>http://info-architects.net/2008/03/10/miscellany/</link>
		<comments>http://info-architects.net/2008/03/10/miscellany/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 09:16:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://info-architects.net/2008/03/10/miscellany/</guid>
		<description><![CDATA[I used to have a lot more time for blogging. Now it&#8217;s all steam ahead with the actual paying work. I&#8217;ve actually had to turn down some projects recently. My latest project is live and generating a lot of traffic. I built the promotional site for the latest Gillette product -  The Gillette Fusion Power [...]]]></description>
			<content:encoded><![CDATA[<p>I used to have a lot more time for blogging. Now it&#8217;s all steam ahead with the actual paying work. I&#8217;ve actually had to turn down some projects recently.</p>
<p>My latest project is live and <strong>generating a lot of traffic</strong>. I built the promotional site for the latest Gillette product -  The <a href="http://gillettephantom.com.au/">Gillette Fusion Power Phantom</a>. Very tight deadline, but I made it on time and under budget.</p>
<p>I&#8217;ve also been involved with some work on <a href="http://hotel.com.au/">Hotel.com.au</a>, which is actually old-school MS Access and Visual Basic. I am quite enjoying it. Sure beats the hell out of PHP.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/03/10/miscellany/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Melbourne Facebook Developer Garage Presentation</title>
		<link>http://info-architects.net/2008/02/24/melbourne-facebook-developer-garage-presentation/</link>
		<comments>http://info-architects.net/2008/02/24/melbourne-facebook-developer-garage-presentation/#comments</comments>
		<pubDate>Sun, 24 Feb 2008 11:22:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Facebook API]]></category>
		<category><![CDATA[FiniteStateMachine]]></category>
		<category><![CDATA[Melbourne Facebook Developers Group]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://info-architects.net/2008/02/24/melbourne-facebook-developer-garage-presentation/</guid>
		<description><![CDATA[On Friday I had the privilege of presenting at the Melbourne Facebook Developer Garage. I&#8217;ve uploaded the slides for my Introduction to Facebook Development talk.  I had to leave early due to some client commitments, but the talks were excellent and I met some very interesting people working in the Facebook space. There is also [...]]]></description>
			<content:encoded><![CDATA[<p>On Friday I had the privilege of presenting at the <a href="http://www.facebook.com/event.php?eid=9997025951">Melbourne Facebook Developer Garage</a>.</p>
<p>I&#8217;ve uploaded the slides for my <a href="http://www.slideshare.net/tobyhede/introduction-to-facebook-development/">Introduction to Facebook Development</a> talk.  I had to leave early due to some client commitments, but the talks were excellent and I met some very interesting people working in the Facebook space.</p>
<p>There is also a <a href="http://www.facebook.com/group.php?gid=8181971279">Melbourne Facebook Developer Group</a> &#8211; I am keen to get another event organised really soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://info-architects.net/2008/02/24/melbourne-facebook-developer-garage-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

