<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Seb Blog - Home</title>
  <id>tag:seb.box.re,2010:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  <link href="http://seb.box.re/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://seb.box.re/" rel="alternate" type="text/html"/>
  <updated>2010-05-10T09:57:52Z</updated>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2010-05-10:94</id>
    <published>2010-05-10T09:55:00Z</published>
    <updated>2010-05-10T09:57:52Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2010/5/10/installing-rdoc-2-4-3-ruby-gem-from-source" rel="alternate" type="text/html"/>
    <title>Installing rdoc 2.4.3 ruby gem from source</title>
<content type="html">
            &lt;h2&gt;Have you ever messed up with your gems? Well, I did!&lt;/h2&gt;

&lt;p&gt;Having a conflict with rdoc versions I felt the need to remove rdoc 2.4.3&lt;br /&gt;
As personal advise, if you read this article before you do so, DO NOT DO IT ;-)&lt;/p&gt;

&lt;p&gt;I'm on snow leopard and once rdoc 2.4.3 uninstalled all rubygems got blocked. Not even possible to install local gems with
&lt;pre&gt;
&lt;code&gt;
gem install -l path/to/my/local/gem.gem
&lt;/code&gt;
&lt;/pre&gt;&lt;/p&gt;

&lt;h2&gt;Installing rdoc 2.4.3 from source&lt;/h2&gt;

&lt;p&gt;What to do next, `gem` command broken, ... I went for the source installation downloading the tarball &lt;a href=&quot;http://rubyforge.org/frs/download.php/54369/rdoc-2.4.3.tgz&quot;&gt;rdoc-2.4.3.tgz&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Install the gem source&lt;/h3&gt;
&lt;p&gt;First things first, we need to untar the rdoc source in the appropriate folder and give it the right permissions&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
mv rdoc-2.4.3.tgz /Library/Ruby/Gems/1.8/gems/
cd /Library/Ruby/Gems/1.8/gems/
tar xvzf rdoc-2.4.3.tgz
sudo chown -R root:admin rdoc-2.4.3
&lt;/code&gt;
&lt;/pre&gt;

&lt;h3&gt;Install the gem file as cache&lt;/h3&gt;
&lt;p&gt;Download the gem file, and save it as cached&lt;a href=&quot;http://rubyforge.org/frs/download.php/54370/rdoc-2.4.3.gem&quot;&gt;rdoc-2.4.3.gem&lt;/a&gt;&lt;/p&gt;
 &lt;pre&gt;
&lt;code&gt;
mv rdoc-2.4.3.gem /Library/Ruby/Gems/1.8/cache/
sudo chown root:admin /Library/Ruby/Gems/1.8/cache/rdoc-2.4.3.gem
&lt;/code&gt;
&lt;/pre&gt;

&lt;h3&gt;Install the gemspec file&lt;/h3&gt;
&lt;p&gt;Here came a problem, where to find the gemspec?&lt;br /&gt;
I couldn't find so asked a friend, &lt;a href=&quot;http://xilinus.com/&quot;&gt;Sébastien Gruhier from Xilinus&lt;/a&gt;, thanks to him you can download &lt;a href=&quot;http://seb.box.re/assets/2010/5/10/rdoc-2.4.3.gemspec&quot;&gt;rdoc-2.4.3.gemspec&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;
mv rdoc-2.4.3.gemspec /Library/Ruby/Gems/1.8/specifications/
sudo chown root:admin /Library/Ruby/Gems/1.8/specifications/rdoc-2.4.3.gemspec
&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;From this point, I was able to run `gem list` again, and all went back to normal, conflict included ;-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2010-01-15:74</id>
    <published>2010-01-15T13:19:00Z</published>
    <updated>2010-01-15T19:10:36Z</updated>
    <link href="http://seb.box.re/2010/1/15/deep-hash-ordering-with-ruby-1-8" rel="alternate" type="text/html"/>
    <title>Deep Hash Ordering With Ruby 1.8 and 1.9</title>
<content type="html">
            &lt;p&gt;More like a memo than an article, I believe this piece of code that I made for i18n-js might be helpful.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt;: Now also compatible with Ruby 1.9&lt;/p&gt;

&lt;pre class=&quot;brush:ruby&quot;&gt;
def convert_hash_to_ordered_hash_and_sort(object, deep = false)
  if object.is_a?(Hash)
    # Hash is ordered in Ruby 1.9! 
    res = returning(RUBY_VERSION &gt;= '1.9' ? Hash.new : ActiveSupport::OrderedHash.new) do |map|
      object.each {|k, v| map[k] = deep ? convert_hash_to_ordered_hash_and_sort(v, deep) : v }
    end
    return res.class[res.sort {|a, b| a[0].to_s &amp;lt;=&gt; b[0].to_s } ]
  elsif deep &amp;&amp; object.is_a?(Array)
    array = Array.new
    object.each_with_index {|v, i| array[i] = convert_hash_to_ordered_hash_and_sort(v, deep) }
    return array
  else
    return object
  end
end
&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2010-01-15:73</id>
    <published>2010-01-15T10:39:00Z</published>
    <updated>2010-01-15T18:45:49Z</updated>
    <link href="http://seb.box.re/2010/1/15/convert-hash-to-ordered-hash-with-rails-2-3-and-ruby-1-8" rel="alternate" type="text/html"/>
    <title>Convert Hash to Ordered Hash with Rails 2.3+ and Ruby 1.8</title>
<content type="html">
            &lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;Ruby 1.8 doesn't support Ordered Hash.&lt;/p&gt;
&lt;p&gt;You do not need this if using Ruby 1.9&lt;/p&gt;

&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Rails brought this with ActiveSupport::OrderedHash to make it behave much like Ruby 1.9 Hash in the ordering way.&lt;/p&gt;

&lt;h2&gt;Remaining problem&lt;/h2&gt;
&lt;p&gt;When you've got a Hash, containing Hash, Array, ... them selves containing more Hash, Array, ... you need a simple way to convert all this hash to ActiveRecord::OrderedHash (if running Ruby 1.8).&lt;/p&gt;

&lt;h2&gt;Solution to convert all Hash as ActiveSupport::OrderedHash only if Ruby is under 1.9&lt;/h2&gt;

&lt;pre class=&quot;brush:ruby&quot;&gt;
def convert_hash_to_ordered_hash(object, deep = false)
  # Hash is ordered in Ruby 1.9!
  if RUBY_VERSION &gt;= '1.9'
    return object
  else
    if object.is_a?(Hash)
      returning(ActiveSupport::OrderedHash.new) do |map|
        object.each {|k,v| map[k] = deep ? convert_hash_to_ordered_hash(v, deep) : v }
      end
    elsif deep &amp;&amp; object.is_a?(Array)
      array = Array.new
      object.each_with_index {|v,i| array[i] = convert_hash_to_ordered_hash(v, deep) }
      return array
    else
      return object
    end
  end
end
&lt;/pre&gt;

&lt;h2&gt;How to use :&lt;/h2&gt;

&lt;pre class=&quot;brush:ruby&quot;&gt;
&gt;&gt; b = {&quot;a&quot;=&gt;{&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}, &quot;b&quot;=&gt;{&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}, &quot;c&quot;=&gt;{&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;{&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}}, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}]}
=&gt; {&quot;a&quot;=&gt;{&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}, &quot;b&quot;=&gt;{&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}, &quot;c&quot;=&gt;{&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;{&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}}, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}]}
&gt;&gt; convert_hash_to_ordered_hash(b, false)
=&gt; #&amp;lt;OrderedHash {&quot;a&quot;=&gt;{&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}, &quot;b&quot;=&gt;{&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}, &quot;c&quot;=&gt;{&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;{&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}}, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}]}&gt;
&gt;&gt; convert_hash_to_ordered_hash([b], false)
=&gt; [{&quot;a&quot;=&gt;{&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}, &quot;b&quot;=&gt;{&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}, &quot;c&quot;=&gt;{&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;{&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}}, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}]}]
&gt;&gt; convert_hash_to_ordered_hash(b, true)
=&gt; #&amp;lt;OrderedHash {&quot;a&quot;=&gt;#&amp;lt;OrderedHash {&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}&gt;, &quot;b&quot;=&gt;#&amp;lt;OrderedHash {&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}&gt;, &quot;c&quot;=&gt;#&amp;lt;OrderedHash {&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;#&amp;lt;OrderedHash {&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}&gt;}&gt;, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, #&amp;lt;OrderedHash {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}&gt;]}&gt;
&gt;&gt; convert_hash_to_ordered_hash([b], true)
=&gt; [#&amp;lt;OrderedHash {&quot;a&quot;=&gt;#&amp;lt;OrderedHash {&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}&gt;, &quot;b&quot;=&gt;#&amp;lt;OrderedHash {&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}&gt;, &quot;c&quot;=&gt;#&amp;lt;OrderedHash {&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;#&amp;lt;OrderedHash {&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}&gt;}&gt;, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, #&amp;lt;OrderedHash {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}&gt;]}&gt;]
&gt;&gt; b
=&gt; {&quot;a&quot;=&gt;{&quot;aa&quot;=&gt;&quot;ca&quot;, &quot;a&quot;=&gt;&quot;ba&quot;, &quot;ba&quot;=&gt;&quot;aa&quot;}, &quot;b&quot;=&gt;{&quot;bb&quot;=&gt;&quot;ab&quot;, &quot;ab&quot;=&gt;&quot;cb&quot;, &quot;b&quot;=&gt;&quot;bb&quot;}, &quot;c&quot;=&gt;{&quot;aa&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;], &quot;bc&quot;=&gt;&quot;ac&quot;, &quot;ac&quot;=&gt;&quot;cc&quot;, &quot;c&quot;=&gt;{&quot;a&quot;=&gt;&quot;bc&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}}, &quot;d&quot;=&gt;[&quot;a&quot;, &quot;c&quot;, &quot;b&quot;, {&quot;a&quot;=&gt;&quot;a&quot;, &quot;b&quot;=&gt;&quot;b&quot;, &quot;c&quot;=&gt;&quot;c&quot;}]}
&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2009-05-17:67</id>
    <published>2009-05-17T15:11:00Z</published>
    <updated>2009-05-17T17:22:29Z</updated>
    <link href="http://seb.box.re/2009/5/17/photoshop-brush-zencocoon-greek-ornaments-v1" rel="alternate" type="text/html"/>
    <title>Photoshop Brush : ZenCocoon - Greek Ornaments v1</title>
<content type="html">
            &lt;p&gt;Just a tiny freebie, a Photoshop Brush for Greek Ornaments&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://seb.box.re/assets/2009/5/17/ZenCocoon_-_Greek_Ornaments_v1.abr&quot;&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/17/zencocoon-greek-ornaments-v1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2009-05-01:61</id>
    <published>2009-05-01T21:30:00Z</published>
    <updated>2009-06-21T21:32:36Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2009/5/1/maps-geolocalization-and-optimization-with-maptimize" rel="alternate" type="text/html"/>
    <title>Maps, Geolocalization and Optimization with Maptimize</title>
<content type="html">
            &lt;p&gt;Playing with maps is great fun and here is walk through from basics to advanced use of geolocalization and how to optimize your maps with &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/2/addresses_geocoding_optimized_detailed.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;During this tutorial you will :&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;start geo localizing your addresses with server side technologies and caching system&lt;/li&gt;
		&lt;li&gt;add front side tools (in Javascript) to keep things lighter and nicer for the end user&lt;/li&gt;
		&lt;li&gt;keep both side geo localization working nicely together and in an unobtrusive way&lt;/li&gt;
		&lt;li&gt;map your localized object while keeping optimized, using &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;show details when clicking on markers and clusters&lt;/li&gt;
		&lt;li&gt;bonus, use Maptimize makers when creating / editing entries&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE&lt;/span&gt;&lt;/strong&gt;: Thanks to &lt;a href=&quot;http://www.xilinus.com&quot;&gt;Sébastien Gruhier from Xilinus&lt;/a&gt; I&#8217;ve made couple of change to improve various codes and this article in general.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE 2&lt;/span&gt; &#8211; 2009-05-04&lt;/strong&gt;: &lt;a href=&quot;http://www.xilinus.com&quot;&gt;Sébastien Gruhier from Xilinus&lt;/a&gt; has been rocking again and helped me out improving few aspects.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE 3&lt;/span&gt; &#8211; 2009-05-04&lt;/strong&gt;: Improve maptimize configuration and task to be more flexible and portable&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;Feeling in hurry ?&lt;/b&gt;&lt;/p&gt;


	&lt;p&gt;I&#8217;ve made a basic demo running on Rails 2.3.2 to cover this tutorial : &lt;a href=&quot;http://github.com/ZenCocoon/Maptimize---Demo-1/tree/master&quot;&gt;Maptimize &#8211; Demo 1&lt;/a&gt; so feel free to check it out directly. Make sure to check the &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;README&lt;/span&gt;.textile&lt;/strong&gt; to get it working.&lt;/p&gt;


	&lt;p&gt;&lt;b&gt;With more time, let&#8217;s get a step by step walk through&lt;/b&gt;&lt;/p&gt;


	&lt;p&gt;For this integration I&#8217;ll assume that you have a Rails application up-and-running (for me using Rails 2.3.2) with a model collecting address details, in my case, &#8220;business&#8221;&lt;/p&gt;


	&lt;h3&gt;Geolocalize your addresses&lt;/h3&gt;


	&lt;p&gt;You first gonna need to add the &lt;strong&gt;lat&lt;/strong&gt; and &lt;strong&gt;lng float attributes&lt;/strong&gt; in your database but also a &lt;strong&gt;geolocalized_address string attribute&lt;/strong&gt;. &lt;em&gt;This attribute will be used to cache the address and prevent unnecessary updates.&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;From the demo :&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
class AddGeolocalizedSupportToBusinesses &amp;lt; ActiveRecord::Migration
  def self.up
    change_table(:businesses) do |t|
       t.float :lat, :lng
       t.string :geolocalized_address
     end
  end

  def self.down
    change_table(:businesses) do |t|
       t.remove :lat, :lng, :geolocalized_address
     end
  end
end
&lt;/pre&gt;

	&lt;p&gt;Don&#8217;t forget to run the migration &lt;code&gt;rake db:migrate&lt;/code&gt;&lt;/p&gt;


	&lt;h4&gt;1. Geolocalize on server side with &lt;a href=&quot;http://github.com/andre/geokit-rails/tree/master&quot;&gt;GeoKit&lt;/a&gt;&lt;/h4&gt;


	&lt;p&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/2/server-side_geocoding.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;Make sure to install &lt;a href=&quot;http://github.com/andre/geokit-gem/tree/master&quot;&gt;GeoKit gem&lt;/a&gt; and &lt;a href=&quot;http://github.com/andre/geokit-rails/tree/master&quot;&gt;GeoKit rails plugin&lt;/a&gt; as well as configuring your &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;KEYS&lt;/span&gt;&lt;/strong&gt; in &#8220;&lt;strong&gt;config/initializers/geokit_config.rb&lt;/strong&gt;&#8220;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://github.com/andre/geokit-rails/tree/master&quot;&gt;GeoKit&lt;/a&gt; propose you a really simple way to automatically geolocalize your address :&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
class Business &amp;lt; ActiveRecord::Base
  acts_as_mappable :auto_geocode=&amp;gt;true
end
&lt;/pre&gt;

	&lt;p&gt;In our case, we will do something a bit more advanced by caching the geolocalized address to prevent calling the Geolocalization Services when we don&#8217;t need to.&lt;/p&gt;


	&lt;p&gt;Here is the model that I would like to geolocalize :&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
class Business &amp;lt; ActiveRecord::Base
  acts_as_mappable
  before_validation :geocode_address

  private
  def geocode_address
    return if self.address.nil? || (self.geolocalized_address == self.address &#38;&#38; !self.lat.nil? &#38;&#38; !self.lng.nil?)
    geo=Geokit::Geocoders::MultiGeocoder.geocode(address)
    errors.add(:address, &quot;Could not Geocode address&quot;) if !geo.success
    self.lat, self.lng, self.geolocalized_address = geo.lat, geo.lng, self.address if geo.success
  end
end
&lt;/pre&gt;

	&lt;h4&gt;2. Geolocalize on front-end side&lt;/h4&gt;


	&lt;p&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/2/client-side_geocoding.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;As &lt;a href=&quot;http://code.google.com/apis/maps/signup.html&quot;&gt;Google will recommend and warn when signing up for the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; key&lt;/a&gt; their is a &lt;strong&gt;geocode request limitation per day based on your ip&lt;/strong&gt;. Using front side geocoding will prevent you from reaching this limits as the geolocalization request will be done from your customers IP address.&lt;/p&gt;


	&lt;p&gt;Client side geolocalization will also &lt;strong&gt;save server load&lt;/strong&gt; and &lt;strong&gt;allow your customers to adjust the position&lt;/strong&gt; when needed.&lt;/p&gt;


	&lt;p&gt;For this purpose, I&#8217;m using &lt;a href=&quot;http://addresschooser.maptimize.com&quot;&gt;AddressChooser from Maptimize&lt;/a&gt; , and as dealing with a single address field I&#8217;m gonna add the &lt;a href=&quot;http://www.prototypejs.org&quot;&gt;prototype&lt;/a&gt; / &lt;a href=&quot;http://script.aculo.us&quot;&gt;scriptaculous&lt;/a&gt; &lt;a href=&quot;http://addresschooser.maptimize.com/example/with_prototype.html&quot;&gt;autocomplete example&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;&lt;span class=&quot;caps&quot;&gt;NOTICE&lt;/span&gt; : AddressChooser is Javascript framework-agnostic and Mapping system independent, so if your needs differs from mine go check &lt;a href=&quot;http://addresschooser.maptimize.com/&quot;&gt;AddressChooser from Maptimize&lt;/a&gt; to get the full details.&lt;/em&gt;&lt;/p&gt;


	&lt;h5&gt;Start by including the required Javascripts files :&lt;/h5&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.prototypejs.org&quot;&gt;Prototype JS&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://script.aculo.us&quot;&gt;Scriptaculous Effects and Controls&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://addresschooser.maptimize.com&quot;&gt;AddressChooser&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Your own JavaScripts&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;I actually start to use more and more the &lt;a href=&quot;http://code.google.com/apis/ajaxlibs/&quot;&gt;Google hosted ones&lt;/a&gt; to prevent end users from loading this libraries again and again so here is how I deal with it:&lt;/p&gt;


&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi?key=&amp;lt;%= Geokit::Geocoders::google %&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;%= javascript_include_tag 'gloader', 'effects', 'controls', 'addresschooser/proxy/googlemap', 'addresschooser/addresschooser', 'application' %&amp;gt;
&lt;/pre&gt;

	&lt;h6&gt;GLoader? What&#8217;s that ?&lt;/h6&gt;


	&lt;p&gt;GLoader is a tiny javascript files that take care of loading my required libraries, hosted by Google :&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;&lt;span class=&quot;caps&quot;&gt;NOTE&lt;/span&gt; : &lt;a href=&quot;http://script.aculo.us&quot;&gt;ScriptAculoUs&lt;/a&gt; is not loaded this way as it can&#8217;t be loaded properly right now. To help getting this fixed please review, comments, rate, ... the following issue : &lt;a href=&quot;http://code.google.com/p/google-ajax-apis/issues/detail?id=237&quot;&gt;google.load / auto-loading and scriptaculous modules&lt;/a&gt; .&lt;/em&gt;&lt;/p&gt;


&lt;pre class=&quot;brush:js&quot;&gt;
// Load libraries
google.load(&quot;maps&quot;, &quot;2&quot;);
google.load(&quot;prototype&quot;, &quot;1.6.0.3&quot;);

// on page load complete, initialize the application
google.setOnLoadCallback(function() {
  $(document.body).observe('onunload', GUnload);
  new Application;
});
&lt;/pre&gt;

	&lt;h5&gt;Add autocomplete &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/h5&gt;


	&lt;p&gt;Just add &lt;code&gt;&amp;lt;%= stylesheet_link_tag 'autocomplete' %&amp;gt;&lt;/code&gt; in the head of your page&lt;/p&gt;


	&lt;h5&gt;Update your &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/h5&gt;


	&lt;p&gt;Now we got our required javascripts files loaded, let&#8217;s update our &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; to support &lt;a href=&quot;http://addresschooser.maptimize.com&quot;&gt;Maptimize.AddressChooser&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;You&#8217;ll need to add the following fields and divs to your creation form&lt;/p&gt;


&lt;pre class=&quot;brush:html&quot;&gt;
  &amp;lt;div id='suggests' class='auto_complete' style='display:none'&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;map&quot; style=&quot;position: absolute; top: 10px; left: 400px; height: 350px; width: 350px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;%= f.hidden_field :lat %&amp;gt;
  &amp;lt;%= f.hidden_field :lng %&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;While editing, we&#8217;ll need some slightly different fields to be able to stay unobtrusive but also take full advantage of the client side geolocalization.&lt;/p&gt;


&lt;pre class=&quot;brush:html&quot;&gt;
  &amp;lt;div id='suggests' class='auto_complete' style='display:none'&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;map&quot; style=&quot;position: absolute; top: 10px; left: 400px; height: 350px; width: 350px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;%= f.hidden_field :current_lat, :value =&amp;gt; @business.lat %&amp;gt;
  &amp;lt;%= f.hidden_field :current_lng, :value =&amp;gt; @business.lng %&amp;gt;
&lt;/pre&gt;

	&lt;h5&gt;Initialize &lt;a href=&quot;http://addresschooser.maptimize.com&quot;&gt;Maptimize.AddressChooser&lt;/a&gt;&lt;/h5&gt;


	&lt;p&gt;Now we&#8217;ve got the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; ready, our &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; and the required libraries let&#8217;s initialize &lt;a href=&quot;http://addresschooser.maptimize.com&quot;&gt;Maptimize.AddressChooser&lt;/a&gt; to turn on the magic.&lt;/p&gt;


	&lt;p&gt;I&#8217;ve made couple of changes to work nicely in an unobtrusive way and while creating or editing any entry&lt;/p&gt;


	&lt;p&gt;From the demo application :&lt;/p&gt;


&lt;pre class=&quot;brush:js&quot;&gt;
Application = Class.create({
  initialize: function() {
    this.initAddressChooser('business', {street: 'address'});
  },
  initAddressChooser: function(object, options) {
    // Init options
    options = $H({
      street: 'street',
      submit: 'submit',
      lat: 'lat',
      lng: 'lng',
      current_lat: 'current_lat',
      current_lng: 'current_lng',
      suggests: 'suggests'
    }).merge(options);

    // Check if current lat/lng are defined to use them
    var current_lat, current_lng;
    if ((current_lat = $(object+'_'+options.get('current_lat'))) &#38;&#38; (current_lng = $(object+'_'+options.get('current_lng'))))
      current_lng.insert({after: '&amp;lt;input type=&quot;hidden&quot; id=&quot;'+object+'_'+options.get('lat')+'&quot; name=&quot;'+object+'['+options.get('lat')+']&quot; value=&quot;'+current_lat.value+'&quot; /&amp;gt;&amp;lt;input type=&quot;hidden&quot; id=&quot;'+object+'_'+options.get('lng')+'&quot; name=&quot;'+object+'['+options.get('lng')+']&quot; value=&quot;'+current_lng.value+'&quot; /&amp;gt;'});

    var street, submit;
    if (!(street = $(object+'_'+options.get('street'))) || !(submit = $(object+'_'+options.get('submit')))) return(this);

    // BEGIN AUTOCOMPLETE SETTINGS AND HACKS :)
    // Create a local autocomplete without data. Data will be added dynamically according to map suggestions
    var autocomplete = new Autocompleter.Local(street, options.get('suggests'), [],
      {
        afterUpdateElement: function(element, selectedElement) {
          var index = selectedElement.up().immediateDescendants().indexOf(selectedElement);
          widget.showPlacemark(index);
        },
        selector: function(instance) {
          instance.changed = false;
          return &quot;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&quot; + instance.options.array.join('&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;') + &quot;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&quot;;
        }
      }
    );

    // Do not observe keyboard event
    autocomplete.onObserverEvent = function() {}

    // Wrap render to update map with selected placemarks
    autocomplete.render = autocomplete.render.wrap(function(method) {
      method();
      widget.showPlacemark(this.index);
    });
    // END AUTOCOMPLETE SETTINGS AND HACKS :)

    widget = new Maptimize.AddressChooser.Widget(
      { onInitialized: function(widget) {
          // Add default controls
          widget.getMap().setUIToDefault();

          widget.initMap();

          // Observe 'suggests:started' to display spinner and disable submit button
          widget.addEventListener('suggests:started', function() {
            street.addClassName('spinner');
          });

          // Observe 'suggests:found' to hide spinner and enable submit button if a placemark has been found
          widget.addEventListener('suggests:found', function(placemarks) {
            street.removeClassName('spinner');
            street.focus();

            // Reset autocomplete suggestions to new placemarks
            autocomplete.options.array.clear();
            if (placemarks &#38;&#38; placemarks.length &amp;gt; 0) {
              for (var i = 0; i &amp;lt; placemarks.length; i++) {
                autocomplete.options.array.push(widget.getAddress(placemarks[i]));
              }
              // For autocomplete update
              autocomplete.getUpdatedChoices();
              autocomplete.show();
            }
            else {
              autocomplete.hide();
            }
          });

          street.focus();
        },
        street: object+'_'+options.get('street'),
        lat: object+'_'+options.get('lat'),
        lng: object+'_'+options.get('lng')
      }
    );

    return(this);
  }
});
&lt;/pre&gt;

	&lt;h4&gt;3. Take advantage of the front side geolocalization&lt;/h4&gt;


	&lt;p&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/2/both-side_geocoding.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;For this purpose, we have to update our model to update the cached address when needed but also prevent from using the geolocalization on server-side if the client have already done it on front-side.&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
class Business &amp;lt; ActiveRecord::Base
  attr_accessor :current_lat, :current_lng

  acts_as_mappable
  before_validation :geocode_address

  private
  def geocode_address
    if (self.geolocalized_address != self.address)
      if (self.current_lat == self.lat &#38;&#38; self.current_lng == self.lng)
        geo=Geokit::Geocoders::MultiGeocoder.geocode(address)
        errors.add(:address, &quot;Could not Geocode address&quot;) if !geo.success
        self.lat, self.lng, self.geolocalized_address = geo.lat, geo.lng, self.address if geo.success
      else
        self.geolocalized_address = self.address
      end
    end
  end
end
&lt;/pre&gt;

	&lt;p&gt;You will notice the 2 attributes accessors that will allow to check any client changes on the coordinates.&lt;/p&gt;


	&lt;h3&gt;4. Map you object and keep optimized using &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/h3&gt;


	&lt;p&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/2/map_optimize_maptimize.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;When the time comes to work with maps (google maps in my case) and lot of markers, a problem comes up as you grow, &lt;span class=&quot;caps&quot;&gt;TOO MUCH MARKERS&lt;/span&gt;!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Too much markers makes you maps loading horribly slow!&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;For this reasons, the experts at &lt;a href=&quot;http://www.xilinus.com&quot;&gt;Xilinus&lt;/a&gt; came up with a elegant solution to deal with this, &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt; take care of merging your markers as clusters to reduce your amount of visible items. That keep it much lighter to load but also nicer for the viewer.&lt;/p&gt;


	&lt;p&gt;I then recommend using &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt; from the early stage. That keep your application easier to scale but also nicer to the end users.&lt;/p&gt;


	&lt;h4&gt;Signup and config &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/h4&gt;


	&lt;p&gt;Once signed up, go in the &#8220;&lt;strong&gt;Security Settings&lt;/strong&gt;&#8221; tab to get your &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;MAP&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;API KEYS&lt;/span&gt;&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;From here you could add this keys in your environment&#8217;s configuration but I feel that using a &lt;strong&gt;dedicated initializer&lt;/strong&gt; will keep things cleaner and easier to maintain.&lt;/p&gt;


	&lt;p&gt;In the file &lt;strong&gt;config/initializers/maptimize_config.rb&lt;/strong&gt; with :&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
# You'll need to add a cronjob to automatically synchronize your data with Maptimize running the following command line
#
# IMPORTANT: This will overwrite any file called *maptimize.csv* located in your app's tmp folder
# If you like to change this behavior update lib/tasks/maptimize.rake
#
# rake maptimize:sync

MAPTIMIZE_CSV_URL = &quot;http://localhost:3000/businesses.csv&quot; 
MAPTIMIZE_CSV_URL.freeze
MAPTIMIZE_AUTHENTICITY_TOKEN = &quot;AUTHENTICITY_TOKEN&quot; 
MAPTIMIZE_AUTHENTICITY_TOKEN.freeze
MAPTIMIZE_MAP_KEY = Rails.env.development? ? &quot;DEVELOPMENT_KEY&quot; : &quot;PRODUCTION_KEY&quot; 
MAPTIMIZE_MAP_KEY.freeze
&lt;/pre&gt;

	&lt;h4&gt;Send your data to &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/h4&gt;


	&lt;h5&gt;Create a &lt;span class=&quot;caps&quot;&gt;CSV&lt;/span&gt; file generator&lt;/h5&gt;


	&lt;p&gt;Thanks to rails, is this trivial.&lt;/p&gt;


	&lt;h6&gt;Update your controller&lt;/h6&gt;


	&lt;p&gt;In your controller update your index action, from the demo &#8220;&lt;strong&gt;businesses_controller.rb&lt;/strong&gt;&#8221; :&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
  # GET /businesses
  # GET /businesses.xml
  # GET /businesses.csv
  def index
    @businesses = Business.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml =&amp;gt; @businesses }
      format.csv  # index.csv.erb
    end
  end
&lt;/pre&gt;

	&lt;h6&gt;Add &#8220;&lt;strong&gt;app/views/businesses/index.csv.erb&lt;/strong&gt;&#8220;&lt;/h6&gt;


&lt;pre class=&quot;brush:html&quot;&gt;
id,lat,lng
&amp;lt;%- @businesses.each do |business| -%&amp;gt;
&amp;lt;%= business.id.to_s + ',' + business.lat.to_s + ',' + business.lng.to_s %&amp;gt;
&amp;lt;%- end -%&amp;gt;
&lt;/pre&gt;

	&lt;p&gt;Well, that&#8217;s done! If you check &lt;strong&gt;http://localhost:3000/businesses.csv&lt;/strong&gt; you&#8217;ll see a simple &lt;span class=&quot;caps&quot;&gt;CSV&lt;/span&gt; file containing the minimum data required by &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/p&gt;


	&lt;h5&gt;Send your &lt;span class=&quot;caps&quot;&gt;CSV&lt;/span&gt; file to &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/h5&gt;


	&lt;p&gt;This is something that you may like to run in a &lt;strong&gt;cronjob&lt;/strong&gt; to keep your data &lt;strong&gt;synchronized automatically&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;From a bash shell console, just run :&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;IMPORTANT&lt;/span&gt;: This will overwrite any file called &#8220;maptimize.csv&#8221; located in your app&#8217;s tmp folder
If you like to change this behavior update lib/tasks/maptimize.rake&lt;/strong&gt;&lt;/p&gt;


&lt;pre class=&quot;brush:bash&quot;&gt;
&lt;code&gt;
rake maptimize:sync
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;If everything worked as expected, your command should ends with :&lt;/p&gt;


&lt;pre class=&quot;brush:xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;import&amp;gt;
  &amp;lt;status&amp;gt;succeeded&amp;lt;/status&amp;gt;
&amp;lt;/import&amp;gt;
&lt;/pre&gt;

	&lt;h4&gt;Show your objects on a map&lt;/h4&gt;


	&lt;p&gt;Now that &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt; have our data, it&#8217;s time to use them and get our map&lt;/p&gt;


	&lt;h5&gt;Include the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; and Javascript files required to integrate &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt;&lt;/h5&gt;


In your &lt;strong&gt;head&lt;/strong&gt; section :
&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;link href=&quot;http://www.maptimize.com/stylesheets/cluster.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
&lt;/pre&gt;

In the bottom of your page, right &lt;strong&gt;after Google jsapi&lt;/strong&gt; file
&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;script src=&quot;http://www.maptimize.com/api/v1/&amp;lt;%= MAPTIMIZE_MAP_KEY %&amp;gt;/embed.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;

	&lt;h4&gt;Display your map&lt;/h4&gt;


	&lt;h5&gt;Add a div that will contain your map&lt;/h5&gt;


	&lt;p&gt;In the demo, I&#8217;ve added the div in the index file &#8220;&lt;strong&gt;app/views/businesses/index.html.erb&lt;/strong&gt;&lt;/p&gt;


&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;div id=&quot;map&quot; style=&quot;width: 900px; height: 500px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;

	&lt;h5&gt;Initialize the map&lt;/h5&gt;


	&lt;p&gt;In my case I&#8217;ll update &#8220;&lt;strong&gt;public/javascripts/application.js&lt;/strong&gt;&#8221; to include :&lt;/p&gt;


&lt;pre class=&quot;brush:js&quot;&gt;
Application = Class.create({
  initialize: function() {
    this.initAddressChooser('business', {street: 'address'})
      .initMap('map');
  },
  initAddressChooser: function(object, options) {
...
    return(this);
  },
  initMap: function(map) {
    if (!GBrowserIsCompatible() || !(map = $(map)))
      return(this);

    if (typeof Maptimize.Map == &quot;undefined&quot;) {
      map.update(&quot;Maptimize key is not correctly set, check file config/initializers/maptimize_config.rb or \
                  run 'rake bootstrap' to fill database with some data&quot;);
    } else {
      // Create a new google map
      var map = new GMap2(map);

      // Center on the world
      map.setCenter(new GLatLng(47, 1), 2);

      // Add controls
      map.addControl(new GSmallMapControl());

      // Attach maptimize service
      window.maptimizeMap = new Maptimize.Map(map);
    }

    return(this);
  }
});
&lt;/pre&gt;

	&lt;h5&gt;Show me the real deal!&lt;/h5&gt;


	&lt;p&gt;The see the goodness of &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt; you need to have a good bunch of entry, for this purpose you can run :&lt;/p&gt;


&lt;pre class=&quot;brush:bash&quot;&gt;
rake bootstrap
&lt;/pre&gt;

	&lt;p&gt;It will load 500 entries in your database.&lt;/p&gt;


	&lt;h5&gt;Done?&lt;/h5&gt;


	&lt;p&gt;&lt;strong&gt;That&#8217;s it!&lt;/strong&gt; we have a map with all our objects localized, merged when needed, ... &lt;strong&gt;it can&#8217;t get better!&lt;/strong&gt;&lt;/p&gt;


	&lt;h3&gt;5. Show details when clicking on markers and clusters&lt;/h3&gt;


	&lt;p&gt;&lt;img src=&quot;http://seb.box.re/assets/2009/5/2/details_on_click.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&#8220;it can&#8217;t get better!&#8221; I said? Well it can!&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;What about showing our object details when we click a marker? Let&#8217;s do it!&lt;/p&gt;


	&lt;h4&gt;Update our &lt;a href=&quot;http://www.maptimize.com&quot;&gt;Maptimize&lt;/a&gt; initialization to bind actions on click for clusters and markers&lt;/h4&gt;


&lt;pre class=&quot;brush:js&quot;&gt;
Application = Class.create({
...
  initMap: function(map) {
    if (!GBrowserIsCompatible() || !(map = $(map)))
      return(this);

    if (typeof Maptimize.Map == &quot;undefined&quot;) {
      map.update(&quot;Maptimize key is not correctly set, check file config/initializers/maptimize_config.rb or \
                  run 'rake bootstrap' to fill database with some data&quot;);
    } else {
      // Create a new google map
      var map = new GMap2(map);

      // Center on the world
      map.setCenter(new GLatLng(47, 1), 2);

      // Add controls
      map.addControl(new GSmallMapControl());

      // Attach maptimize service
      var app = this;
      window.maptimizeMap = new Maptimize.Map(map, {
        onMarkerClicked: function(marker) {
          return app.getMarkerDetails(marker, marker.getId());
        },
        onZoomMaxClusterClicked: function(cluster, ids) {
          return app.getMarkerDetails(cluster, ids);
        }
      });
    }

    return(this);
  },
  getMarkerDetails: function(object, ids) {
    return new Ajax.Request(&quot;/businesses/&quot;+ids, {
      method: 'GET',
      onComplete: function(response) {
        object.getGMarker().openInfoWindowHtml(response.responseText);
      }
    });
  }
});
&lt;/pre&gt;

	&lt;p&gt;As you can see, the id of the marker will be used to call the &lt;strong&gt;show&lt;/strong&gt; action of our object, &#8220;&lt;strong&gt;business&lt;/strong&gt;&#8221; in this case.&lt;/p&gt;


	&lt;p&gt;What append when you &lt;strong&gt;click a cluster&lt;/strong&gt;, the id string looks like &#8220;&lt;strong&gt;1,2,3&lt;/strong&gt;&#8220;&lt;/p&gt;


	&lt;p&gt;For this we will update our &lt;strong&gt;action&lt;/strong&gt; to &lt;strong&gt;support multiple ids&lt;/strong&gt; and show the expected details&lt;/p&gt;


	&lt;h4&gt;Update our controller&lt;/h4&gt;


	&lt;p&gt;Looking at &#8220;&lt;strong&gt;app/controllers/businesses_controller.rb&lt;/strong&gt;&#8221; we&#8217;ll change the &lt;strong&gt;show method&lt;/strong&gt; as follow :&lt;/p&gt;


&lt;pre class=&quot;brush:ruby&quot;&gt;
  # GET /businesses/1
  # GET /businesses/1.xml
  # GET /businesses/1,2
  def show
    @businesses = Business.find(params[:id].split(','))
    @business = @businesses.first

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml =&amp;gt; @business }
      format.js   # show.js.erb
    end
  end
&lt;/pre&gt;

	&lt;p&gt;The &lt;strong&gt;split&lt;/strong&gt; call will allow us to get more &lt;span class=&quot;caps&quot;&gt;IDS&lt;/span&gt; at once, to keep our initial formats working properly I keep the single object as well.&lt;/p&gt;


	&lt;h4&gt;Add the view &#8220;&lt;strong&gt;app/views/businesses/show.js.erb&lt;/strong&gt;&#8220;&lt;/h4&gt;


&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;%- @businesses.each do |business| -%&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;%= business.name %&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;&amp;lt;%= business.address %&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;%- end -%&amp;gt;
&lt;/pre&gt;

	&lt;h3&gt;6. Bonus, use Maptimize makers when creating / editing entries&lt;/h3&gt;


	&lt;p&gt;To use the Maptimized map with markers when creating / editing your entries, just do the tiny change in &lt;strong&gt;initAddressChooser&lt;/strong&gt; from &#8220;&lt;strong&gt;/public/application.js&lt;/strong&gt;&#8220;&lt;/p&gt;


	&lt;p&gt;Include this code just after &lt;code&gt;widget.getMap().setUIToDefault();&lt;/code&gt;&lt;/p&gt;


&lt;pre class=&quot;brush:js&quot;&gt;
// Attach maptimize plugin
var maptimizeMap = new Maptimize.Map(widget.getMap());
&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2008-02-18:58</id>
    <published>2008-02-18T00:43:00Z</published>
    <updated>2009-06-10T21:03:14Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2008/2/18/ajax-inplacericheditor-1-3" rel="alternate" type="text/html"/>
    <title>AJAX InPlaceRichEditor 1.3</title>
<content type="html">
            &lt;p&gt;As of today the first release candidate of the &lt;a href=&quot;http://inplacericheditor.box.re&quot; class=&quot;external&quot;&gt;AJAX InPlaceRichEditor&lt;/a&gt; version 1.3 have seen the public scene.&lt;/p&gt;

&lt;p&gt;This new release is now using the fantastic &lt;a href=&quot;http://tinymce.moxiecode.com&quot;&gt;TinyMCE 3.0&lt;/a&gt; from &lt;a href=&quot;http://www.moxiecode.com&quot;&gt;MoxieCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It include some new features and improvements, some wished ones finally achieved ;-) so let's discover them.&lt;/p&gt;

&lt;h4&gt;Multiple TinyMCE initializations&lt;/h4&gt;
&lt;p&gt;Now you need to give an extra parameter to AJAX.InPlaceRichEditor constructor, containing the TinyMCE options you wish to use.&lt;br /&gt;
The best way to do so is to keep all the initialization in the tiny_mce_init file as it may preload all needed modules and make InPlaceRichEdition more responsive, let's see what it mean.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;em&gt;In tiny_mce_init,js&lt;/em&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:js&quot;&gt;
var tinymce_options = {
  mode : &quot;textareas&quot;,
  theme : &quot;simple&quot;
};

var tinymce_advanced_options = {
  mode : &quot;textareas&quot;,
  theme : &quot;advanced&quot;
};

tinyMCE.init(tinymce_advanced_options);
tinyMCE.init(tinymce_options);
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;NOTICE:&lt;/b&gt; It's important to take care of the initialization order as the last one will be used by default for the normal editors.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;em&gt;Your AJAX.InPlaceRichEditor calls&lt;/em&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;h1 id=&quot;tobeedited&quot;&gt;To be edited w/ simple theme&amp;lt;/h1&gt;
&amp;lt;script&gt;
// &amp;lt;![CDATA[
  new Ajax.InPlaceRichEditor($('tobeedited'), 'YOU_UPDATE_URL', {}, tinymce_options);
// ]]&gt;
&amp;lt;/script&gt;

&amp;lt;h1 id=&quot;tobeeditedadvanced&quot;&gt;To be edited w/ advanced theme&amp;lt;/h1&gt;
&amp;lt;script&gt;
// &amp;lt;![CDATA[
  new Ajax.InPlaceRichEditor($('tobeeditedadvanced'), 'YOU_UPDATE_URL', {}, tinymce_advanced_options);
// ]]&gt;
&amp;lt;/script&gt;
&lt;/pre&gt;

&lt;h4&gt;Features fixes and changes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;b&gt;&lt;em&gt;fieldPostCreation&lt;/em&gt;&lt;/b&gt; option is now properly working on InPlaceRichEditor side and is set to &lt;em&gt;focus&lt;/em&gt; by default, however there's still some bugs with it in some browsers.&lt;/li&gt;
&lt;li&gt;As in InPlaceRichEditor 1.2, the deprecation layer from &lt;a href=&quot;http://script.aculo.us&quot; class=&quot;external&quot;&gt;scriptaculous' InPlaceEditor&lt;/a&gt;is ot present anymore, I believe that it's now the time to use the actual stuff in your scripts and extensions ;-)&lt;/li&gt;
&lt;li&gt;The RichEditor will be disabled while loading external text if you are using the advanced theme, the simple one doesn't seem to allow it&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Highly recomanded patch&lt;/h4&gt;
&lt;p&gt;In &lt;a href=&quot;http://script.aculo.us&quot; class=&quot;external&quot;&gt;scriptaculous' InPlaceEditor&lt;/a&gt; 1.8.1 the failure handling is broken which doesn't help providing clean error explanations to users.&lt;br /&gt;
I brought few week ago a tiny patch to fix this &lt;a href=&quot;http://seb.box.re/2008/2/3/temporary-patch-to-inplaceeditor-failure-issues&quot;&gt;InPlaceEditor onFailure issue&lt;/a&gt; that I highly recommend to all users.&lt;/p&gt;

&lt;h4&gt;Extra feature as InPlaceEditor patch&lt;/h4&gt;
&lt;p&gt;I needed for &lt;a href=&quot;http://www.tiarehq.com&quot;&gt;Tiare&lt;/a&gt; the ability to have the empty texts in edit mode for easier comprehension, for this reason I've published a &lt;a href=&quot;http://seb.box.re/2008/2/3/patch-for-inplaceeditor-adding-editonblank-feature&quot;&gt;patch to editOnBlank an InPlaceEditor&lt;/a&gt; or &lt;a href=&quot;http://inplacericheditor.box.re&quot; class=&quot;external&quot;&gt;InPlaceRichEditor&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Rails 2.0 users' happiness&lt;/h4&gt;
&lt;p&gt;In Rails 2.0 a new security feature introduce an authenticity_token to every form and &lt;a href=&quot;http://inplacericheditor.box.re&quot; class=&quot;external&quot;&gt;InPlaceRichEditor&lt;/a&gt; can work fine with this as well.&lt;br /&gt;Even if it's still not an easy-as-pie feature, it's pretty easy to build a work around for it.&lt;/p&gt;
&lt;p&gt;Railers, grab this &lt;a href=&quot;http://inplacericheditor.box.re/download/InPlaceRichEditor_with_rails_2.0.2_test.zip&quot;&gt;InPlaceRichEditor 1.3_rc0 with rails 2.0.2 demo&lt;/a&gt; to find more about it.&lt;/p&gt;

&lt;h4&gt;Security notice&lt;/h4&gt;
&lt;p&gt;DO NEVER FORGET to clean code sent by &lt;a href=&quot;http://inplacericheditor.box.re&quot; class=&quot;external&quot;&gt;InPlaceRichEditor&lt;/a&gt;, javascript cleaning is wonderful but purely useless when we speak about security.&lt;br /&gt;Railers may consider using &lt;b&gt;&lt;em&gt;white_list&lt;/em&gt;&lt;/b&gt; but you can also use what ever way you like to keep yourself secure.&lt;/p&gt;

&lt;h4&gt;Tested&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://inplacericheditor.box.re&quot; class=&quot;external&quot;&gt;InPlaceRichEditor&lt;/a&gt; has been tested on &lt;acronym title=&quot;Firefox&quot;&gt;FF&lt;/acronym&gt; 2, &lt;acronym title=&quot;Internet Explorer&quot;&gt;IE&lt;/acronym&gt; 6, &lt;acronym title=&quot;Internet Explorer&quot;&gt;IE&lt;/acronym&gt; 7, Safari 3 and Opera, all on Mac (except &lt;acronym title=&quot;Internet Explorer&quot;&gt;IE&lt;/acronym&gt;) and Windows&lt;/p&gt;
&lt;p&gt;Some bugs relative to &lt;b&gt;&lt;em&gt;fieldPostCreation&lt;/em&gt;&lt;/b&gt; are still present on some browser&lt;/p&gt;

&lt;h4&gt;Thanks&lt;/h4&gt;
&lt;p&gt;Thank you to all contributors, from feedbacks to patches, it's always a pleasure to listen about your experience using &lt;a href=&quot;http://inplacericheditor.box.re&quot; class=&quot;external&quot;&gt;InPlaceRichEditor&lt;/a&gt;.&lt;br /&gt;
A big thanks as well to the &lt;a href=&quot;http://www.prototypejs.org&quot; class=&quot;external&quot;&gt;prototype&lt;/a&gt; and &lt;a href=&quot;http://script.aculo.us&quot; class=&quot;external&quot;&gt;scriptaculous&lt;/a&gt; core team and contributors.&lt;br /&gt;
Of course big thanks to &lt;a href=&quot;http://www.moxiecode.com&quot;&gt;MoxieCode&lt;/a&gt; too for them great tool and support&lt;/p&gt;

&lt;p&gt;Have fun&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2008-02-03:56</id>
    <published>2008-02-03T11:24:00Z</published>
    <updated>2010-01-15T10:34:48Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2008/2/3/patch-for-inplaceeditor-adding-editonblank-feature" rel="alternate" type="text/html"/>
    <title>Patch for InPlaceEditor adding editOnBlank feature</title>
<content type="html">
            &lt;p&gt;Since a while I'm running on own patched version of &lt;a href=&quot;http://script.aculo.us&quot;&gt;InPlaceEditor&lt;/a&gt; for &lt;a href=&quot;http://www.tiarehq.com&quot;&gt;Tiare&lt;/a&gt;, mainly to support editOnBlank which allow an empty container to be turned as editable just after initialization.&lt;/p&gt;

&lt;p&gt;It turned to be useful as well if you accept blank response as it will keep in edit mode in this case&lt;/p&gt;

&lt;h6&gt;Notice&lt;/h6&gt;
&lt;p&gt;Please be aware that it's patching the actual version of InPlaceEditor, actually &amp;lt;strike&gt;at revision 8787&amp;lt;/strike&gt; on script.aculo.us 1.8.1 and it can make more damages on previous or later versions.&lt;/p&gt;

&lt;h6&gt;How to use&lt;/h6&gt;
&lt;pre class=&quot;brush:html&quot;&gt;
...
&amp;lt;head&gt;
  ...
  &amp;lt;script src=&quot;javascripts/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script src=&quot;javascripts/control.js&quot; type=&quot;text/javascript&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script src=&quot;javascripts/patch_inplaceeditor_1-8-1.js&quot; type=&quot;text/javascript&quot;&gt;&amp;lt;/script&gt;
  ...
&amp;lt;/head&gt;
...
&lt;/pre&gt;

&lt;h6&gt;Advise&lt;/h6&gt;
&lt;p&gt;I advise you to use the &lt;a href=&quot;http://seb.box.re/2008/2/3/temporary-patch-to-inplaceeditor-failure-issues&quot;&gt;InPlaceEditor's failure patch&lt;/a&gt; as well.&lt;/p&gt;

&lt;h6&gt;Download&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;http://seb.box.re/assets/2008/2/17/patch_inplaceeditor_editonblank_1-8-1.js&quot;&gt;InPlaceEditor's editOnBlank extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun ;-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2008-02-03:54</id>
    <published>2008-02-03T00:32:00Z</published>
    <updated>2010-01-15T10:35:39Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2008/2/3/temporary-patch-to-inplaceeditor-failure-issues" rel="alternate" type="text/html"/>
    <title>Temporary patch to InPlaceEditor failure issues</title>
<content type="html">
            &lt;p&gt;Working one the new &lt;a href=&quot;http://inplacericheditor.box.re&quot;&gt;InPlaceRichEditor&lt;/a&gt; version I first made a closer look again at &lt;a href=&quot;http://script.aculo.us&quot;&gt;InPlaceEditor from scriptaculous&lt;/a&gt; and found 2 bugs on the failure handling.&lt;/p&gt;

&lt;p&gt;I first made a &lt;a href=&quot;http://dev.rubyonrails.org/ticket/10984&quot;&gt;patch&lt;/a&gt; a help the core team fixing it but as I needed to apply this fix right away for my own use I made a &lt;a href=&quot;http://seb.box.re/assets/2008/2/17/patch_inplaceeditor_1-8-1.js&quot;&gt;small extension fixing this issues&lt;/a&gt;.&lt;/p&gt;

&lt;h6&gt;Notice&lt;/h6&gt;
&lt;p&gt;Please be aware that it's patching the actual version of InPlaceEditor, actually &amp;lt;strike&gt;at revision 8787&amp;lt;/strike&gt; on script.aculo.us 1.8.1 and it can make more damages on previous or later versions.&lt;/p&gt;

&lt;h6&gt;How to use&lt;/h6&gt;
&lt;p&gt;You just need to include the script after the original InPlaceEditor script&lt;/p&gt;
&lt;pre class=&quot;brush:html&quot;&gt;
...
&amp;lt;head&gt;
  ...
  &amp;lt;script src=&quot;javascripts/prototype.js&quot; type=&quot;text/javascript&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script src=&quot;javascripts/control.js&quot; type=&quot;text/javascript&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script src=&quot;javascripts/patch_inplaceeditor_1-8-1.js&quot; type=&quot;text/javascript&quot;&gt;&amp;lt;/script&gt;
  ...
&amp;lt;/head&gt;
...
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt;: You may also like to &lt;a href=&quot;http://seb.box.re/2008/2/3/patch-for-inplaceeditor-adding-editonblank-feature&quot;&gt;use the feature editOnBlank&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun ;-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2008-01-30:53</id>
    <published>2008-01-30T23:14:00Z</published>
    <updated>2008-01-30T23:18:19Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2008/1/30/inplacericheditor-v-1-2-released" rel="alternate" type="text/html"/>
    <title>InPlaceRichEditor V 1.2 released</title>
<content type="html">
            &lt;p&gt;Hi,&lt;br /&gt;
I'm pleased to announce &lt;a href=&quot;http://inplacericheditor.box.re&quot;&gt;InPlaceRichEditor v1.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For more details please refer to the &lt;a href=&quot;http://inplacericheditor.box.re/download&quot;&gt;download&lt;/a&gt; section&lt;/p&gt;
&lt;p&gt;It's now time to work on the v1.3_rc0 using TinyMCE 3.0 ;-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2008-01-19:52</id>
    <published>2008-01-19T01:48:00Z</published>
    <updated>2008-01-19T01:52:50Z</updated>
    <category term="Design"/>
    <category term="Development"/>
    <link href="http://seb.box.re/2008/1/19/zencocoon-got-refreshed" rel="alternate" type="text/html"/>
    <title>ZenCocoon got refreshed!</title>
<content type="html">
            &lt;p&gt;I just updated &lt;a href=&quot;http://zencocoon.com&quot;&gt;ZenCocoon.com&lt;/a&gt; with new services and a new design.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2007-11-15:50</id>
    <published>2007-11-15T11:28:00Z</published>
    <updated>2010-02-19T22:58:49Z</updated>
    <link href="http://seb.box.re/2007/11/15/inplacericheditor-v-1-2_rc0-released" rel="alternate" type="text/html"/>
    <title>InPlaceRichEditor V 1.2_rc0 released</title>
<content type="html">
            &lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt; InPlaceRichEditor Version 1.2_rc1 is out since a while ;-) No big changes, juste dependency ones.&lt;/p&gt;

&lt;p&gt;Yesterday I've released In Place Rich Editor V 1.2_rc0, it come as a full package including functional and unit test.&lt;/p&gt;

&lt;p&gt;This release of IPRE is a full rewrite and is made to work with Prototype 1.6 , Script.Aculo.Us 1.8 and TinyMCE 2.1.2&lt;/p&gt;

&lt;p&gt;To get more details please have a look at &lt;a href=&quot;http://inplacericheditor.box.re&quot;&gt;http://InPlaceRichEditor.Box.Re&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2007-10-22:49</id>
    <published>2007-10-22T16:31:00Z</published>
    <updated>2010-05-14T07:26:10Z</updated>
    <category term="Sports"/>
    <category term="Travel"/>
    <link href="http://seb.box.re/2007/10/22/windsurf-trip" rel="alternate" type="text/html"/>
    <title>Windsurf trip</title>
<content type="html">
            &lt;p&gt;Actually in Egypt for an other windsurf trip you can follow what's going on at &lt;a href=&quot;http://sebastiengrosjean.com&quot;&gt;http://sebastiengrosjean.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I've put my site on my website builder as it really simpler for me to update than mephisto, to check out why give a look at &lt;a href=&quot;http://tiarehq.com&quot;&gt;http://tiarehq.com&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2007-09-02:47</id>
    <published>2007-09-02T23:51:00Z</published>
    <updated>2007-09-02T23:56:00Z</updated>
    <category term="Development"/>
    <link href="http://seb.box.re/2007/9/2/rails-plugin-multi-site-updated" rel="alternate" type="text/html"/>
    <title>Rails Plugin : Multi Site : Updated</title>
<content type="html">
            &lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I've find out that the plugin multi_site I made broke when using find(:include). Well it's now fix and ready to use.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://box.svnrepository.com/svn/plugins/multi_site/&quot;&gt;http://box.svnrepository.com/svn/plugins/multi_site/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun ;-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2007-08-16:46</id>
    <published>2007-08-16T14:46:00Z</published>
    <updated>2007-08-16T14:52:48Z</updated>
    <link href="http://seb.box.re/2007/8/16/public-rails-plugins" rel="alternate" type="text/html"/>
    <title>Public Rails Plugins</title>
<content type="html">
            &lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I published few rails plugins today : &lt;a href=&quot;http://box.svnrepository.com/svn/plugins/&quot;&gt;http://box.svnrepository.com/svn/plugins/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are tested on Rails 1.2.3, don't forget to test them with your version of rails before using ;-)&lt;br /&gt;
And don't forget, I made them but are not responsable of any problems you can have using them.&lt;/p&gt;

&lt;p&gt;Have fun ;-)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://seb.box.re/">
    <author>
      <name>seb</name>
    </author>
    <id>tag:seb.box.re,2007-05-18:45</id>
    <published>2007-05-18T19:56:00Z</published>
    <updated>2010-02-19T23:00:15Z</updated>
    <link href="http://seb.box.re/2007/5/18/wifi-hotspot-in-sivota" rel="alternate" type="text/html"/>
    <title>Wifi Hotspot in Sivota</title>
<content type="html">
            &lt;p&gt;I've turned online my first hotspot, actually running since 2 days in Sivota (Ionion restaurant) ;-)&lt;/p&gt;
          </content>  </entry>
</feed>
