<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>OnRails.org: Geoip data</title>
    <link>http://onrails.org/articles/2006/06/01/geoip-data</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Ruby On Rails and related matters.</description>
    <item>
      <title>Geoip data</title>
      <description>As part of the Rails Log Analyzer I want to show where, geographically speaking, the different users come from. The following 'ingredients' were required to achieve this:
&lt;ul&gt;
&lt;li&gt;The geoip gem by Clifford Heat&lt;/li&gt;
&lt;li&gt;The GeoLiteCity.dat file download from http://www.maxmind.com/app/geolitecity&lt;/li&gt;
&lt;li&gt;A vectorial world map in Flash from http://www.fabiovisentin.com/world_map/vectorial_world_map.asp&lt;/li&gt;
&lt;li&gt;And the Flex mx:BubbleChart component&lt;/li&gt;
&lt;/ul&gt;
The result is the following

&lt;p&gt;
&lt;img src="http://onrails.org/files/20060601_geoip1.gif" border="0" height="254" width="398" alt="20060601_geoip.gif"  /&gt;
&lt;/p&gt;
&lt;p&gt;

Note there are still some technical hurdles to overcome with the bubble chart as it behaves unexpectedly when setting the radius of the bubbles and the scaling of the world map as the background of the chart can not be precisely controlled. Also the world map needs to be zoomed in a little to make the graph more readable as not too much activity is going on at the south pole.

&lt;p&gt;
So now lets look at some code extracts.

&lt;p&gt;
&lt;strong&gt;Getting the geoip information [ruby]&lt;/strong&gt;
&lt;p&gt;
When parsing the log we retrieve the city information related to an ip address
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;	&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;geoip&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

	&lt;span class="ident"&gt;geo_ip&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;GeoIP&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{RAILS_ROOT}&lt;/span&gt;/data/GeoLiteCity.dat&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    	&lt;span class="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;items&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each_with_index&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
		 &lt;span class="ident"&gt;geo_info&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;geo_ip&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;city&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;ip&lt;/span&gt;&lt;span class="punct"&gt;'])&lt;/span&gt; 
             &lt;span class="punct"&gt;...&lt;/span&gt;
	&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

The _city_ method returns the following array
&lt;pre&gt;
         	[   hostname,			# 0 - Requested hostname
         	    ip,				# 1- Ip address as dotted quad
         	    CountryCode[code],	# 2 - ISO3166-1 code
         	    CountryCode3[code],	# 3 - ISO3166-2 code
         	    CountryName[code],	# 4 - Country name, per IS03166
         	    CountryContinent[code],# 5 - Continent code.
         	    region,			# 6 - Region name
         	    city,				# 7 - City name
         	    postal_code,		# 8 - Postal code
         	    latitude,			# 9 - Latitude
         	    longitude,			# 10 - Longitude
         	] 
&lt;/pre&gt;

&lt;p&gt;
&lt;strong&gt;Generating the geo data series [ruby]&lt;/strong&gt;
The log file data is stored in sqlite database for ease of querying and aggregation. &lt;i&gt;This will also allow to wrap the application as a packaged OSX application with the database embedded in the application.&lt;/i&gt; The following called is invoked by the controller that simply return the result of the query to the Flex application. 

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;Hit.sqlite_data&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;from_date&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;to_date&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;result&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{}&lt;/span&gt;
    &lt;span class="ident"&gt;query&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;geoip&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                  &lt;span class="symbol"&gt;:sql&lt;/span&gt;  &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;select count(*) as count, latitude, longitude, city, state, country from hits where &lt;span class="expr"&gt;#{scope}&lt;/span&gt; group by 2,3 order by 1 desc&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
                 &lt;span class="symbol"&gt;:column_names&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;count&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;latitude&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;longitude&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;city&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;state&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;county&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;
               &lt;span class="punct"&gt;}&lt;/span&gt;

	&lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;]]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Hit&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;geoip_serie&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;data&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;&lt;span class="ident"&gt;query&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:column_names&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:hit_count&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="symbol"&gt;:data&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;to_f&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
	&lt;span class="ident"&gt;result&lt;/span&gt;
   &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;Hit.geoip_serie&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;serie&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;title&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;column_names&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;total_count&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;result&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;title&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="ident"&gt;data&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[]&lt;/span&gt;
    &lt;span class="ident"&gt;serie&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;      
      &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;count&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;to_f&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="ident"&gt;total_count&lt;/span&gt;&lt;span class="punct"&gt;)*&lt;/span&gt;&lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
             &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;latitude&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;
             &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;longitude&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;
             &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;city&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;
             &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;state&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;
             &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;country&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;
             &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="ident"&gt;row&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;count&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;  &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt; &lt;span class="comment"&gt;#if row['count'] &amp;lt; 1&lt;/span&gt;
      &lt;span class="comment"&gt;#row['count']  = 5 if row['count'] &amp;gt; 5&lt;/span&gt;
      &lt;span class="ident"&gt;data&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:data&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;data&lt;/span&gt;
    &lt;span class="ident"&gt;result&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;strong&gt;Rendering the series [flex]&lt;/strong&gt;
&lt;p&gt;
As seen in a previous article on how to exchange data between Flex and a Rails application using JSON,  the server returns the data as a string that is simply transformed to an actionscript object using JSON.decode. This object is then passed to a custom component named BubbleSerieChart (I know, I find a more descriptive name)

&lt;div class="typocode"&gt;&lt;div class="codetitle"&gt;Passing the series to a custom Flex component&lt;/div&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;	&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;local&lt;/span&gt;&lt;span class="symbol"&gt;:BubbleSerieChart&lt;/span&gt; &lt;span class="ident"&gt;time_serie&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{geoip}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;serie_name&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;GeoIP&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;/&amp;gt;&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="typocode"&gt;&lt;div class="codetitle"&gt;The full source of the custom component.&lt;/div&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;notextile&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="char"&gt;?x&lt;/span&gt;&lt;span class="ident"&gt;ml&lt;/span&gt; &lt;span class="ident"&gt;version&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;1.0&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;encoding&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;utf-8&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="char"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:Panel&lt;/span&gt;  &lt;span class="ident"&gt;xmlns&lt;/span&gt;&lt;span class="symbol"&gt;:mx=&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://www.adobe.com/2006/mxml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
	        &lt;span class="ident"&gt;title&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;{serie_name}&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;height&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;100%&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;width&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;100%&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;	

	&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:Script&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;![&lt;/span&gt;&lt;span class="constant"&gt;CDATA&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;
			&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;controls&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;Alert&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
		    &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;Bindable&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
			&lt;span class="ident"&gt;public&lt;/span&gt; &lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;time_serie&lt;/span&gt;&lt;span class="symbol"&gt;:Object&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
			&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;Bindable&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
			&lt;span class="ident"&gt;public&lt;/span&gt; &lt;span class="ident"&gt;var&lt;/span&gt; &lt;span class="ident"&gt;serie_name&lt;/span&gt;&lt;span class="symbol"&gt;:String&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
			
			
			&lt;span class="ident"&gt;private&lt;/span&gt; &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="ident"&gt;getLabel&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="symbol"&gt;:Object&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;field&lt;/span&gt;&lt;span class="symbol"&gt;:String&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="symbol"&gt;:uint&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;percentValue&lt;/span&gt;&lt;span class="symbol"&gt;:Number&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;span class="symbol"&gt;:String&lt;/span&gt;
        	&lt;span class="punct"&gt;{&lt;/span&gt;
            	&lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;item&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;key&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;
        	&lt;span class="punct"&gt;}&lt;/span&gt;

		&lt;span class="punct"&gt;]]&amp;gt;&lt;/span&gt;
	&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;mx:Script&amp;gt;
    &amp;lt;mx:BubbleChart id=&amp;quot;chart&amp;quot; dataProvider=&amp;quot;{time_serie}&amp;quot; showDataTips=&amp;quot;true&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; &amp;gt;
		&amp;lt;mx:backgroundElements&amp;gt; 
				&amp;lt;mx:Array&amp;gt; 
					&amp;lt;mx:Image source=&amp;quot;@Embed('political_world_map_grey.swf')&amp;quot; &lt;/span&gt;&lt;span class="punct"&gt;/&amp;gt;&lt;/span&gt; 
				&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;mx:Array&amp;gt; 
		&amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:backgroundElements&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;


        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:horizontalAxis&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:LinearAxis&lt;/span&gt; &lt;span class="ident"&gt;minimum&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;-180&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;maximum&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;180&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;mx:horizontalAxis&amp;gt;

		&amp;lt;mx:verticalAxis&amp;gt;
			&amp;lt;mx:LinearAxis  minimum=&amp;quot;-90&amp;quot; maximum=&amp;quot;90&amp;quot;&lt;/span&gt;&lt;span class="punct"&gt;/&amp;gt;&lt;/span&gt;
		&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;mx:verticalAxis&amp;gt;
	
        &amp;lt;mx:series&amp;gt;
            &amp;lt;mx:Array&amp;gt;
                &amp;lt;mx:BubbleSeries xField=&amp;quot;longitude&amp;quot; yField=&amp;quot;latitude&amp;quot; radiusField=&amp;quot;count&amp;quot;  maxRadius=&amp;quot;5&amp;quot;&lt;/span&gt;&lt;span class="punct"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;mx:Array&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:series&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;mx:BubbleChart&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;mx&lt;/span&gt;&lt;span class="symbol"&gt;:Panel&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/notextile&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</description>
      <pubDate>Thu, 01 Jun 2006 12:20:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:73ccc7c0-7396-4d68-996e-3a08ba715d27</guid>
      <author>Daniel Wanja</author>
      <link>http://onrails.org/articles/2006/06/01/geoip-data</link>
      <category>Ruby On Rails</category>
    </item>
  </channel>
</rss>
