<?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>Geoff Evason &#187; tech</title>
	<atom:link href="http://geoff.evason.name/tag/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://geoff.evason.name</link>
	<description></description>
	<lastBuildDate>Wed, 30 Nov 2011 03:41:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Upgrading an app from Rails 2.1 to Rails 2.2.2</title>
		<link>http://geoff.evason.name/2009/01/15/upgrading-an-app-from-rails-21-to-rails-222/</link>
		<comments>http://geoff.evason.name/2009/01/15/upgrading-an-app-from-rails-21-to-rails-222/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 04:19:31 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=56</guid>
		<description><![CDATA[Here is a summary of a few of the problems I encountered while trying to upgrade an app from rails 2.1 to rails 2.2.2
Getting my dev code to run
First, to update the rails code:
 &#62; rake rails:freeze:gems

The first time I tried to run the app I got this error:
vendor/rails/activesupport/lib/active_support/dependencies.rb:445:in `load_missing_constant': uninitialized constant Inflector (NameError)

Accessing the inflector changes, so [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a summary of a few of the problems I encountered while trying to upgrade an app from rails 2.1 to rails 2.2.2</p>
<h3>Getting my dev code to run</h3>
<p>First, to update the rails code:</p>
<pre><code> &gt; rake rails:freeze:gems
</code></pre>
<p>The first time I tried to run the app I got this error:</p>
<pre><code>vendor/rails/activesupport/lib/active_support/dependencies.rb:445:in `load_missing_constant': uninitialized constant Inflector (NameError)
</code></pre>
<div>Accessing the inflector changes, so as <a title="rails 2.2 inflector" href="http://railstic.com/2008/12/rails-22-inflector/">described here</a> you need update APP/config/initializers/inflector.rb so it looks like this:</div>
<pre><code class="ruby">ActiveSupport::Inflector.inflections do |inflect|
  ...
end
</code></pre>
<p>In my case, I was also using the <a title="active merchant" href="http://www.activemerchant.org/">ActiveMerchant plugin</a> which needed updating for the same reason</p>
<pre><code>script/plugin install git://github.com/Shopify/active_merchant.git --force
</code></pre>
<p>According to <a title="haml update for rails 2.2" href="http://gusg.us/code/ruby/rails-2_2-headaches-1">gusg.us</a>, HAML needs to be at 2.0.4.   I didn&#8217;t see any problems in my testing but I didn&#8217;t want to try my luck so I updated HAML too.</p>
<pre><code>sudo gem update haml</code></pre>
<p>update my environment.rb gem requirement</p>
<pre><code class="ruby">config.gem "haml", :version =&gt; "2.0.6"</code></pre>
<div>Then run</div>
<pre><code>rake gems:unpack:dependencies</code></pre>
<h3>Production</h3>
<p>While deploying to a staging server I got this error:</p>
<pre><code>initializer.rb:514:in `send': undefined method `cache_template_loading=' for ActionView::Base:Class (NoMethodError)</code></pre>
<p>As described <a href="http://railsforum.com/viewtopic.php?id=23648">here</a>, to fix this, just update your APP/config/environments/production.rb (and staging.rb) file by removing the following:</p>
<pre><code class="ruby">config.action_view.cache_template_loading</code></pre>
<p>Overall, it wasn&#8217;t too painful an upgrade&#8230;</p>
<p>I didn&#8217;t run rake rails:update. That may have fixed some of these things on it&#8217;s own, but my understanding was that that wasn&#8217;t needed anymore&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2009/01/15/upgrading-an-app-from-rails-21-to-rails-222/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Why Do GoDaddy and Other Domain Registrars Suck?</title>
		<link>http://geoff.evason.name/2009/01/14/why-do-godaddy-and-other-domain-registrars-suck/</link>
		<comments>http://geoff.evason.name/2009/01/14/why-do-godaddy-and-other-domain-registrars-suck/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 13:06:12 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[register]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=55</guid>
		<description><![CDATA[I&#8217;m evaluating different domain name options for something I&#8217;m working on.  Typically, I register domains names with GoDaddy because they seem to be the cheapest.  Yesterday, I registered the domain wedding-website.ca as a test.  I wanted to compare writing instructions about how to buy a domain name vs. using the API vs. a reseller front-end.
My step by [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m evaluating different domain name options for something I&#8217;m working on.  Typically, I register domains names with GoDaddy because they seem to be the cheapest.  Yesterday, I registered the domain <a title="wedding website" href="http://www.wedding-website.ca/">wedding-website.ca</a> as a test.  I wanted to compare writing instructions about how to buy a domain name vs. using the API vs. a reseller front-end.</p>
<p>My step by step instructions are now at step 13, and that&#8217;s before I get into any DNS alterations.</p>
<p>13 STEPS!?!?   What kind of e-commerce sales funnel is 13 steps?  I&#8217;m pretty sure I filled out my details 3 times and created a least 2 accounts. (I&#8217;m not sure &#8211; I&#8217;m still a little dizzy from the whole thing).  I do have about 5 long numbers now which I&#8217;m sure I&#8217;ll have to re-enter somewhere, at some point&#8230;</p>
<p>Many of the steps in the instructions I was tracking included things like &#8216;completely ignore everything on the page and just press the very tiny button at the bottom (the one hidden under the big button)&#8217;.  The 13 steps actually excludes some of the extra steps I had to take because it&#8217;s a .ca domain!!  Okay, so intructions through GoDaddy aren&#8217;t going to be part of my solution.  <a href="http://Register.com">Register.com</a> and <a href="http://Dotster.com">Dotster.com</a> have slightly cleaner processes (but not by much)</p>
<p>GoDaddy, Register, and some others offer resale program and APIs. The APIs are generally completely undocumented, and you get no indication of what is available (or even what technology is used) before they ask for the steep annual fee.  Register.com has the best API (it&#8217;s xml based) I&#8217;ve see, but so far it seems to be a big flat convoluted set of URLs.</p>
<p>Now, I&#8217;m sure most of these companies are making lots of money, I just wanted to rant about how annoying I find it all to be from my perspective as a consumer.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2009/01/14/why-do-godaddy-and-other-domain-registrars-suck/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cool Flash Fonts Delivered By FontBurner</title>
		<link>http://geoff.evason.name/2008/12/08/cool-flash-fonts-delivered-by-fontburner/</link>
		<comments>http://geoff.evason.name/2008/12/08/cool-flash-fonts-delivered-by-fontburner/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 14:18:26 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[style]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=54</guid>
		<description><![CDATA[While trying to provide some more styling options for the wedding website builder I&#8217;m working on I came across a very cool and easy to use flash font tool.
FontBurner is essentially a hosted sIFR solution which makes getting cools flash fonts as easy as a simple copy and paste.
To get the headlines in this blog [...]]]></description>
			<content:encoded><![CDATA[<p>While trying to provide some more styling options for the <a title="wedding website" href="http://www.momentville.com">wedding website</a> builder I&#8217;m working on I came across a very cool and easy to use flash font tool.</p>
<p><a title="flash fonts" href="http://www.fontburner.com/">FontBurner</a> is essentially a hosted <a href="http://wiki.novemberborn.net/sifr3" title="sIFR3 wiki">sIFR</a> solution which makes getting cools flash fonts as easy as a simple copy and paste.</p>
<p>To get the headlines in this blog post to be as they are, all I needed to do was paste this code:</p>
<p> </p>
<pre><code class="html">&lt;link rel="stylesheet" href="http://www.fontburner.com/css/fontburner.css" type="text/css" media="screen" /&gt; 

&lt;link rel="stylesheet" href="http://www.fontburner.com/css/fontburner_print.css" type="text/css" media="print" /&gt; 

&lt;script src="http://www.fontburner.com/fontburner.js" type="text/javascript"&gt;&lt;/script&gt; 

&lt;script type="text/javascript" src="http://www.fontburner.com/js/white/action_man_extended.php"&gt;&lt;/script&gt; 

&lt;!-- sIFR fonts delivered by www.fontburner.com --&gt;
</code></pre>
<p> <br />
If you need flash fonts, check them out:<br />
<a href="http://www.fontburner.com/"><img src="http://www.fontburner.com/images/font_burner_badge1.gif" width="300" height="50" /></a><br />
 </p>
<link rel="stylesheet" href="http://www.fontburner.com/css/fontburner.css" type="text/css" media="screen" />
<link rel="stylesheet" href="http://www.fontburner.com/css/fontburner_print.css" type="text/css" media="print" />
<script src="http://www.fontburner.com/fontburner.js" type="text/javascript"></script><br />
<script type="text/javascript" src="http://www.fontburner.com/js/white/asrafel.php"></script></p>
<p><!-- sIFR fonts delivered by www.fontburner.com --></p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/12/08/cool-flash-fonts-delivered-by-fontburner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple Currency Conversion Rate API Consumption For Ruby / Rails</title>
		<link>http://geoff.evason.name/2008/10/27/simple-currency-conversion-rate-api-consumption-for-ruby-rails/</link>
		<comments>http://geoff.evason.name/2008/10/27/simple-currency-conversion-rate-api-consumption-for-ruby-rails/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 13:38:51 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[currency]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=53</guid>
		<description><![CDATA[I had the need to consume some exchange rate data for an internal project so I began looking for an about. My searching found no api for Google Finance, Yahoo Finance, XE, or Oanda.  
Fortunately I found the currency converter from Xavier Media and their simple currency exchange rate xml API, which includes historical data [...]]]></description>
			<content:encoded><![CDATA[<p>I had the need to consume some exchange rate data for an internal project so I began looking for an about. My searching found no api for Google Finance, Yahoo Finance, XE, or Oanda. <img src='http://geoff.evason.name/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Fortunately I found the <a href="http://finance.xaviermedia.com/">currency converter from Xavier Media</a> and their simple <a href="http://forum.xaviermedia.com/xavier-finance-currency-exchange-rate-api-t10979.html">currency exchange rate xml API</a>, which includes historical data too. <img src='http://geoff.evason.name/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>I put together an absolutely minimal lib to get the data I need.  I just needed the AU/US rate.  The xml provides all data as base to EUR, but with some simple math I can find the rate I need with reasonable accuracy.  In this case &#8216;accuracy&#8217; is based on spot checking it against the yahoo rates.</p>
<p>I thought it worth sharing in case others are looking for something similar.</p>
<p><strong>UPDATE:</strong> I changed the xml string below to better handle single digit date months. Xavier needs &#8216;01&#8242; instead of &#8216;1&#8242;</p>
<pre><code class="ruby">require "cgi"
require "uri"
require "net/https"
require "rexml/document"

module XavierMedia
  # Returns the exchange rate (AUD/USD) on the given date.
  def self.exchange_rate_on(date)
    url = URI.parse("http://api.finance.xaviermedia.com/api/#{date.year}/#{date.strftime("%m")}/#{date.strftime("%d")}.xml")

    resp = Net::HTTP.get(url)
    xml  = REXML::Document.new(resp)

    us_to_eur = 1.0
    au_to_eur = 1.0
    xml.elements.each("//exchange_rates/fx") { |el|
      if el.elements[1].text == "USD"
        us_to_eur = el.elements[2].text.to_f rescue 1.0
      end
      if el.elements[1].text == "AUD"
        au_to_eur = el.elements[2].text.to_f rescue 1.0
      end
    }

    return us_to_eur/au_to_eur
  end
end
</code></pre>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/10/27/simple-currency-conversion-rate-api-consumption-for-ruby-rails/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Rails Fragment Caching Slowness With Regex Expiry</title>
		<link>http://geoff.evason.name/2008/10/26/rails-fragment-caching-slowness-with-regex-expiry/</link>
		<comments>http://geoff.evason.name/2008/10/26/rails-fragment-caching-slowness-with-regex-expiry/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 19:27:37 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[fragment]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[sweep regex]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=52</guid>
		<description><![CDATA[Fragment caching in rails works great.  We use it a lot for MomentVille and easily get most of our responses in under 150ms because it dramatically reduces teh number of queries we need to run for our most common actions.
I did notice some slowness recently though, and was quite confused.  The slowness only occurred on [...]]]></description>
			<content:encoded><![CDATA[<p>Fragment caching in rails works great.  We use it a lot for <a title="free wedding website" href="http://www.momentville.com">MomentVille</a> and easily get most of our responses in under 150ms because it dramatically reduces teh number of queries we need to run for our most common actions.</p>
<p>I did notice some slowness recently though, and was quite confused.  The slowness only occurred on our production servers. Our dev, test, and pre-production servers were all still fast.  I tried using <a title="rails performance" href="http://www.newrelic.com">new relic rpm service</a> to help pinpoint the problem, and while it does a great job in helping you track things, it didn&#8217;t help me narrow down the problem.</p>
<p>Ultimately I discovered that the problem had to do with how we clear the cache. For some actions we have to expire multiple fragments, so we used regex expiration.  Unfortunately, that is <a title="rails fragment expiry regex" href="http://gurge.com/blog/2007/02/04/rails-expire_fragmentregex-considered-harmful/">very slow</a>.  It seems that regex expiry compares your regex to each fragment stored, even if you think your regex looks like it&#8217;s targeting a directory.</p>
<p>Alexander Dymo had a <a title="rails fragment cache expiry regex" href="http://blog.pluron.com/2008/07/hell-is-paved-w.html">post about regex expiry of fragment caches in rails</a> that outlined a solution for him.  It helped guide me to a solution that works well for us.  OUr fragment caches are actually structured around the data as opposed to the actions, so related fragments are stored within sub directories.  When we need to clear a bunch at once, we just want to wipe out the whole directory.  So, I created a file called fragment_dir_expiration.rb and put it into my /config/initializers folder.  It looks like this:</p>
<pre><code class="ruby"># For rails 2.0 and lower</code></pre>
<pre><code class="ruby">module ActionController
  module Caching
    module Fragments

      #dir is the cache path relative to the cache root
      def expire_fragment_dir(dir, options = nil)
        return unless perform_caching
        self.class.benchmark("Expired fragments in dir : #{dir}") do
          ActionController::Base.cache_store.delete_fragment_dir(dir, options)
        end
      end

      class UnthreadedFileStore

        def delete_fragment_dir(dir, options = nil)
          path = @cache_path + dir
          return unless File.exist?(path) #it's ok to not have the cache dir
          search_dir(path) do |f|
            begin
              File.delete(f)
            rescue SystemCallError =&gt; e
              # If there's no cache, then there's nothing to complain about
            end
          end
        end

      end
    end
  end
end

</code></pre>
<p>When you want to call this you can call it from an observer with a call like this</p>
<pre><code class="ruby">class WidgetSweeper &lt; ActionController::Caching::Sweeper
  observe Widget
  def after_save(widget)
    # Expire all the fragments for the updated widget
    expire_fragment_dir("/widget/#{widget.id}/")
  end
end
</code></pre>
<p><strong><em>UPDATE: For rails 2.1 and above use the following:</em></strong></p>
<pre><code class="ruby">module ActionController
  module Caching
    module Fragments

      #dir is the cache path relative to the cache root
      def expire_fragment_dir(dir, options = nil)
        return unless perform_caching
        self.class.benchmark("Expired fragments in dir : #{dir}") do
          ActionController::Base.cache_store.delete_fragment_dir(dir, options)
        end
      end

    end
  end
end

module ActiveSupport
  module Cache
    class FileStore

      def delete_fragment_dir(dir, options = nil)
        path = @cache_path + dir
        return unless File.exist?(path) #it's ok to not have the cache dir
        search_dir(path) do |f|
          begin
            File.delete(f)
          rescue SystemCallError =&gt; e
            # If there's no cache, then there's nothing to complain about
          end
        end
      end
    end
  end
end
</code></pre>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/10/26/rails-fragment-caching-slowness-with-regex-expiry/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Railscasts Does It Again : Site Wide Announcements</title>
		<link>http://geoff.evason.name/2008/05/27/railscasts-does-it-again-site-wide-announcements/</link>
		<comments>http://geoff.evason.name/2008/05/27/railscasts-does-it-again-site-wide-announcements/#comments</comments>
		<pubDate>Tue, 27 May 2008 22:11:46 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[cookies]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=46</guid>
		<description><![CDATA[A note to all rails developers, new and old.  If you&#8217;re not following Ryan Bates&#8217; Railcasts, you should be.
I follow a variey of rails blogs and lean on a number of resources quite regularly, but the Railscasts are consistently the most useful.  There are now over 100 railscast, each one a roughly 5 minute screencast [...]]]></description>
			<content:encoded><![CDATA[<p>A note to all rails developers, new and old.  If you&#8217;re not following Ryan Bates&#8217; <a title="learn rails videos" href="http://railscasts.com/">Railcasts</a>, you should be.</p>
<p>I follow a variey of rails blogs and lean on a number of resources quite regularly, but the Railscasts are consistently the most useful.  There are now over 100 railscast, each one a roughly 5 minute screencast outlining the solution to some problem.</p>
<p>A recent cast showed how to <a title="rails site wide announcement" href="http://railscasts.com/episodes/103">create a site wide announcement</a> that each user could mark as read individually.  This is a great, non-intrusive way to communicate notices with users.</p>
<p>The screencast details how to do it.  I was able to implement this on a site in a very short period of time.  I made some modifications which make it work better within my site.  I do have one suggestion to improve it overall.  To track whether a message had been read/should be shown Ryan uses the session.  Sessions expire in the near future, and if using a db store, should be wiped daily.  If your users don&#8217;t visit daily, you will want to create a message that hangs around for a week or 2.  In this case, a session variable won&#8217;t work.  Instead, you can store the info in a cookie and set a delayed expire time on it.  (By default, cookies expire with the session in rails).</p>
<p>Before reading how to store this info in a cookie you should watch the screencast.  Once you&#8217;ve implemented everything like Ryan&#8217;s demo, there are just 3 small changes to use cookies and hence have a longer memory.</p>
<p>1. In your controller, set the cookie:</p>
<pre><code class="ruby">
def hide_announcement
  cookies[:announcement_hide_time] ={ :value =&gt; Time.now.to_s , :expires =&gt; 2.weeks.from_now }
end
</code>
</pre>
<p>2. In your helper method, read the value from the cookie.</p>
<pre><code class="ruby">
def current_announcements
  @announcements ||= Announcement.current_announcements(cookies[:announcement_hide_time])
end
</code>
</pre>
<p>3. In the announcement controller you need to parse the time since it is stored as a string in the cookie</p>
<pre><code class="ruby">
def self.current_announcements(hide_time)
  with_scope :find =&gt; { :conditions =&gt; "starts_at &lt;= now() AND ends_at &gt;= now()" } do
    if hide_time
      time = Time.parse(hide_time)
      find(:all, :conditions =&gt; ["updated_at &gt;= ?", time])
    else
      find(:all)
    end
  end
end
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/05/27/railscasts-does-it-again-site-wide-announcements/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TechNation.com.au Has Launched</title>
		<link>http://geoff.evason.name/2008/05/22/technationcomau-has-launched/</link>
		<comments>http://geoff.evason.name/2008/05/22/technationcomau-has-launched/#comments</comments>
		<pubDate>Thu, 22 May 2008 21:51:32 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[startup]]></category>
		<category><![CDATA[australia]]></category>
		<category><![CDATA[entreprenuer]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=45</guid>
		<description><![CDATA[TechNation, an exciting new blog focused on Australia tech startups, launched this week to coincide with CeBit.  From the first post:
TechNation Australia is a technology news, review and analysis site with a focus on startups and Internet companies in Australia.
It was born out of Open Coffee, a Sydney based bi-weekly meetup of entrepreneurs.  I think [...]]]></description>
			<content:encoded><![CDATA[<p><a title="tech startup blog australia" href="http://www.technation.com.au">TechNation</a>, an exciting new blog focused on Australia tech startups, launched this week to coincide with CeBit.  From the first post:</p>
<blockquote><p>TechNation Australia is a technology news, review and analysis site with a focus on startups and Internet companies in Australia.</p></blockquote>
<p>It was born out of <a title="entreprenuer meetup sydney" href="http://entrepreneur.meetup.com/1136/">Open Coffee</a>, a Sydney based bi-weekly meetup of entrepreneurs.  I think the blog is a great idea and hope that it will develop into a useful resource for Aussie entreprenuers.  By continuing to provide great content it can help the startup community flourish and let startups down under gain exposure into other markets.  A commonly perceived challenge among startups in Australia seems to be the geographic isolation.  This does not need to be the case, especially as the world continues to flatten.  If you are part of, or know of startup that you would like to see featured please contact TechNation (see their contact page).  If you are interested in startup news &#8211; please <a title="technation feed" href="http://feeds.feedburner.com/TechNationAustralia">subscribe to the feed</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/05/22/technationcomau-has-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Thoughts On Google FriendConnect</title>
		<link>http://geoff.evason.name/2008/05/13/first-thoughts-on-google-friendconnect/</link>
		<comments>http://geoff.evason.name/2008/05/13/first-thoughts-on-google-friendconnect/#comments</comments>
		<pubDate>Tue, 13 May 2008 15:57:58 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[connect]]></category>
		<category><![CDATA[dataavailability]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[friendconnect]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[myspace]]></category>
		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=39</guid>
		<description><![CDATA[Google announced FirendConnect today.  From what I&#8217;ve read, it looks like it&#8217;s a set of social &#8216;gadgets&#8217; that people can embed into their websites to help bring social networking to sites that were once, well, unsocial.
If you like demo videos (and don&#8217;t we all) or you like odd guacamole references, check out this video [...]]]></description>
			<content:encoded><![CDATA[<p>Google announced <a title="Friend Connect" href="http://www.google.com/friendconnect">FirendConnect</a> today.  From what I&#8217;ve read, it looks like it&#8217;s a set of social &#8216;gadgets&#8217; that people can embed into their websites to help bring social networking to sites that were once, well, unsocial.</p>
<p>If you like demo videos (and don&#8217;t we all) or you like odd guacamole references, check out this video post overview from google:<br />
<center><br />
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/BIEwUxMrJ4Y"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/BIEwUxMrJ4Y" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object><br />
</center><br />
I&#8217;ve signed up for the preview release.  I have not got a response yet (I&#8217;m sure they are getting lots of requests).  I&#8217;m excited to see how I might be able to add it to <a title="free wedding websites" href="http://www.momentville.com">MomentVille</a>.  The first 2 things that really interest me are</p>
<ol>
<li>Sharing Photos</li>
<li>The Activity Stream for people posting on the site.</li>
</ol>
<p>I do see<strong> 1 immediate problem though</strong>.  From the demo it appears that a lot of the gadgets are javascript based.  A lot of sites won&#8217;t allow users to embed javascript for security reasons.  I image it won&#8217;t be long before someone makes flash social based gadgets for FriendConnect.</p>
<p>The launch of this comes very close to MySpace&#8217;s DataAvailability launch and Facebook&#8217;s Connect announcement.  It appears, in many ways, that all 3 of these efforts are attempts to push one&#8217;s &#8216;network&#8217; beyond the existing website into the web as a whole.</p>
<p>To date I like Google&#8217;s FirendConnect approach the best since it doesn&#8217;t seem to be tied to any one particular identity, where as MySpace &amp; Facebook seem to be aiming for the top spot as master identity manager.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/05/13/first-thoughts-on-google-friendconnect/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cross Site Reference Forgery</title>
		<link>http://geoff.evason.name/2008/05/05/cross-site-reference-forgery/</link>
		<comments>http://geoff.evason.name/2008/05/05/cross-site-reference-forgery/#comments</comments>
		<pubDate>Mon, 05 May 2008 22:25:09 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=31</guid>
		<description><![CDATA[I just read a great article on Cross Site Reference Forgery, specifically related to how Rails 2.0 handles it.  I think it is a must read for all rails developers.  It gives a very clear description of the potential vulnerability, which I think is important to understand
I recently upgraded some apps to Rails [...]]]></description>
			<content:encoded><![CDATA[<p>I just read a great article on <a href="http://www.rorsecurity.info/2008/05/05/csrf-an-underestimated-attack-method/">Cross Site Reference Forgery</a>, specifically related to how Rails 2.0 handles it.  I think it is a must read for all rails developers.  It gives a very clear description of the potential vulnerability, which I think is important to understand</p>
<p>I recently upgraded some apps to Rails 2.0 from Rails 1.2.4 (more on that in another post) and this was one of the main reasons.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/05/05/cross-site-reference-forgery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How To Get Code Syntax Highlighting on Your Blog</title>
		<link>http://geoff.evason.name/2008/05/02/how-to-get-code-syntax-highlighting-on-your-blog/</link>
		<comments>http://geoff.evason.name/2008/05/02/how-to-get-code-syntax-highlighting-on-your-blog/#comments</comments>
		<pubDate>Fri, 02 May 2008 10:09:53 +0000</pubDate>
		<dc:creator>Geoff</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://geoff.evason.name/?p=27</guid>
		<description><![CDATA[So, I&#8217;ve just recently updated the look and feel of my blog.  I previously had a few blogs that I managed and I wanted to consolidate things into one place.
I looked into using some Rails CMSs (radiant, mephisto) but ultimately decided on using wordpress.  I really do think Wordpress is the best tool [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve just recently updated the look and feel of my blog.  I previously had a few blogs that I managed and I wanted to consolidate things into one place.</p>
<p>I looked into using some Rails CMSs (<a title="rails cms" href="http://radiantcms.org/">radiant</a>, <a title="rails blog" href="http://mephistoblog.com/">mephisto</a>) but ultimately decided on using <a title="blog software" href="http://wordpress.org/">wordpress</a>.  I really do think Wordpress is the best tool for the job, and it has a great community and lots of plugins!</p>
<p>Anyway, back to the topic at hand.  I&#8217;ve seen a bunch of <a title="attacment fu messages" href="http://toolmantim.com/article/2007/12/3/rollin_your_own_attachment_fu_messages_evil_twin_stylee">blog posts with cool syntax highlighting</a>.  I hadn&#8217;t been able to figure out how to do it (until I looked at the markup for <a href="http://toolmantim.com/">Tim Lucas&#8217;s site</a>).</p>
<p>There are a few Wordpress plugins that let you do this, but none of them really struck me as being what I wanted.  After investigating further I found <a href="http://svn.danwebb.net/external/CodeHighlighter/trunk/">code_highlighter.js</a> by <a href="http://www.danwebb.net/">Dan Webb</a>.</p>
<p>Apparently some code highlighters do work on the server side, where as this javascript file moves the work to the client.  The idea of this code highlighter is simple.  Just include the main code_highlighter.js script and any of the other 4 supported languge packs that you want to use (html, css, js, ruby).  I personally just merged the 4 language packs into the main file so I only had one include.</p>
<p>If you are using wordpress, you need to upload the js file somwhere.  The nature place is to create a scripts folder in your wordpress root folder.  Or, you can create a scripts folder in your theme folder and include it like this:</p>
<pre><code>
&lt;script type=“text/javascript” src="wp-content/themes/geoff/js/code_highlighter.js"&gt;&lt;/script&gt;
</code></pre>
<p>I did the latter so that it&#8217;s nice and packaged within my theme.</p>
<p>The next step is to style it (which is easy to do using css).  Here&#8217;s the css I use:</p>
<pre><code class="css">
/* Code highlighting (derived from) VibrantInk colours from Justin Palmer @ http://encytemedia.com
*/

 pre {
   padding: 10px;
   overflow: auto;
   width: 100%;
 }
 pre, code {   background-color: #111; }

 /** RUBY / JAVASCRIPT **/
 code span.comment { 	color: #609; }
 code span.string { 	color: #5c2; }
 code span.brackets { }
 code span.symbol { 	color: #777; }
 code span.keywords { 	color: #d72; }

 /** HTML **/
 code.html span.tag { 	color: #ddd; }
 code.html span.attribute { 	color: #d72; }
 code.html span.string { 	color: #5c2; }
 code.html span.comment {	color: #609; }
 code.html span.doctype { 	color: #D7FF80; }

/** CSS **/
code.css .selectors {  color: #d72;}
code.css .properties {  color: #5c2;}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://geoff.evason.name/2008/05/02/how-to-get-code-syntax-highlighting-on-your-blog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

