<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>RoRCraft | Ruby on Rails Development Blog  - Home</title>
  <id>tag:devblog.rorcraft.com,2009:mephisto/</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</generator>
  
  <link href="http://devblog.rorcraft.com/" rel="alternate" type="text/html" />
  <updated>2008-11-04T06:46:32Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/rorcraft_devblog" type="application/atom+xml" /><entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-11-04:200</id>
    <published>2008-11-04T06:27:00Z</published>
    <updated>2008-11-04T06:46:32Z</updated>
    <link href="http://devblog.rorcraft.com/2008/11/4/quick-guide-to-amazon-ebs" rel="alternate" type="text/html" />
    <title>Quick guide to Amazon EBS</title>
<content type="html">
            We've switched to use &lt;a href="http://aws.amazon.com/ebs/"&gt;Amazon EBS(Elastic Block Storage)&lt;/a&gt; for a few months now. Therefore, we have been able to have a good night's sleep without worrying our database disappearing. Here's a quick guide.
&lt;br /&gt;
It's very easy to use EBS for EC2. First make sure you downloaded the latest &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351"&gt;ec2-api-tools&lt;/a&gt; (you can't find EBS related tools in its old version). Here's my ec2-api-tools info (yours don't need to be exactly same with me):&lt;br /&gt;
&lt;br /&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt; &lt;span class="er"&gt;$&lt;/span&gt; ec2ver&lt;tt&gt;
&lt;/tt&gt;&lt;span class="fl"&gt;1.3&lt;/span&gt;&lt;span class="i"&gt;-24159&lt;/span&gt; &lt;span class="i"&gt;2008&lt;/span&gt;&lt;span class="i"&gt;-05&lt;/span&gt;&lt;span class="i"&gt;-05&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
 &lt;br /&gt;
EC2 instance can only use EBS in the same avaliablity zone with it, so we need to check the availability zone in which your ec2 instances are.&amp;nbsp; You can do this by&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;$ ec2din&lt;br /&gt;
...&lt;br /&gt;
INSTANCE&amp;nbsp;&amp;nbsp;&amp;nbsp; i-abc12345 &amp;nbsp;&amp;nbsp; ami-abc12345 &amp;nbsp;&amp;nbsp; ec2-...compute-1.amazonaws.com&amp;nbsp;&amp;nbsp;&amp;nbsp; ip-....ec2.internal&amp;nbsp;&amp;nbsp;&amp;nbsp; running&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; m1.small&amp;nbsp;&amp;nbsp;&amp;nbsp; 2008-06-23T23:12:26+0000&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;us-east-1b&lt;/strong&gt;
&lt;/blockquote&gt;

&lt;br /&gt;
So the instance is in us-east-1b. Now create a 200G storage block in this zone:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="er"&gt;$&lt;/span&gt; ec2-create-volume --size &lt;span class="i"&gt;200&lt;/span&gt; -z&amp;amp;nbsp; us-east&lt;span class="i"&gt;-1&lt;/span&gt;b&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;VOLUME&lt;/span&gt; vol&lt;span class="i"&gt;-4&lt;/span&gt;d826724 &lt;span class="i"&gt;200&lt;/span&gt; creating   &lt;span class="i"&gt;2008&lt;/span&gt;&lt;span class="i"&gt;-10&lt;/span&gt;&lt;span class="i"&gt;-14&lt;/span&gt;&lt;span class="co"&gt;T00&lt;/span&gt;:&lt;span class="i"&gt;00&lt;/span&gt;:&lt;span class="i"&gt;00&lt;/span&gt;&lt;span class="i"&gt;+0000&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


You can check the block by&lt;br /&gt;
&lt;br /&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="er"&gt;$&lt;/span&gt; ec2-describe-volumes vol&lt;span class="i"&gt;-4&lt;/span&gt;d826724&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;VOLUME&lt;/span&gt; vol&lt;span class="i"&gt;-4&lt;/span&gt;d826724 &lt;span class="i"&gt;200&lt;/span&gt; available &lt;span class="i"&gt;2008&lt;/span&gt;&lt;span class="i"&gt;-10&lt;/span&gt;&lt;span class="i"&gt;-14&lt;/span&gt;&lt;span class="co"&gt;T00&lt;/span&gt;:&lt;span class="i"&gt;00&lt;/span&gt;:&lt;span class="i"&gt;00&lt;/span&gt;&lt;span class="i"&gt;+0000&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


The block now is created. It's like we have bought a 200G harddisk from amazon, now let's install it on our ec2 instance:&lt;br /&gt;
&lt;br /&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="er"&gt;$&lt;/span&gt; ec2-attach-volume vol&lt;span class="i"&gt;-4&lt;/span&gt;d826724 -i i&lt;span class="i"&gt;-6058&lt;/span&gt;a509 -d &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;dev&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;s&lt;/span&gt;&lt;/span&gt;dh&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;ATTACHMENT&lt;/span&gt; vol&lt;span class="i"&gt;-4&lt;/span&gt;d826724 i&lt;span class="i"&gt;-6058&lt;/span&gt;a509 &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;dev&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;s&lt;/span&gt;&lt;/span&gt;dh attaching &lt;span class="i"&gt;2008&lt;/span&gt;&lt;span class="i"&gt;-10&lt;/span&gt;&lt;span class="i"&gt;-14&lt;/span&gt;&lt;span class="co"&gt;T00&lt;/span&gt;:&lt;span class="i"&gt;15&lt;/span&gt;:&lt;span class="i"&gt;00&lt;/span&gt;&lt;span class="i"&gt;+0000&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


This will let the system on ec2 instance recognize our new block storage on /dev/sdh (you can specify any device name that not the same with currently used, like /dev/sdz). Now you can use this device (/dev/sdh) as a normal block device like other real disk partitions(such as /dev/sda). For example,&lt;br /&gt;
&lt;br /&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="er"&gt;$&lt;/span&gt; mkreiserfs &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;dev&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;s&lt;/span&gt;&lt;/span&gt;dh &lt;span class="c"&gt;#this will format it with reiserfs&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="er"&gt;$&lt;/span&gt; mkdir &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;mnt&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;data&lt;tt&gt;
&lt;/tt&gt;&lt;span class="er"&gt;$&lt;/span&gt; mount &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;dev&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;s&lt;/span&gt;&lt;/span&gt;dh &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;mnt&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;data &lt;span class="c"&gt;#mount the block to /mnt/data, now all data write to /mnt/data dir will be &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# persistent on the block storage vol-4d826724. it won't lost after you reboot the machine&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


Some other useful tools are:&lt;br /&gt;
&lt;br /&gt;
ec2-describe-volumes: used to find the relationships between your blocks and instances&lt;br /&gt;

ec2-detach-volume: detach a block from instance&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1667&amp;amp;ref=featured"&gt;Here's a full manual of EBS&lt;/a&gt;.
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-08-29:128</id>
    <published>2008-08-29T08:09:00Z</published>
    <updated>2008-09-01T07:48:21Z</updated>
    <link href="http://devblog.rorcraft.com/2008/8/29/download-youtube-videos-with-ruby" rel="alternate" type="text/html" />
    <title>Download youtube videos with ruby</title>
<content type="html">
            &lt;p&gt;As you might know, we’ve released &lt;a href="http://ankoder.net"&gt;Ankoder.net&lt;/a&gt; for while now. It lets anyone to download videos into their iPods and various other formats. Scraping the flv url from Youtube &lt;span class="caps"&gt;HTML&lt;/span&gt; isnt exactly easy.&lt;/p&gt;


	&lt;p&gt;This is how we do it:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;parse_youtube&lt;/span&gt;(url)&lt;tt&gt;
&lt;/tt&gt;     youtube = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;http://www.youtube.com/&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     &lt;span class="c"&gt;# url =~ /(?:http\:\/\/.*youtube.com\/(?:watch\?v=|v\/))?(.*)$/&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     url =~ &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;watch&lt;/span&gt;&lt;span class="ch"&gt;\?&lt;/span&gt;&lt;span class="k"&gt;v=(.*)&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;     video_id = &lt;span class="gv"&gt;$1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     video_id = video_id.split(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)[&lt;span class="i"&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;     flv_url = &lt;span class="pc"&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     open(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;youtube&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;watch&lt;/span&gt;&lt;span class="ch"&gt;\?&lt;/span&gt;&lt;span class="k"&gt;v=&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;video_id&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt; |f|&lt;tt&gt;
&lt;/tt&gt;       f.each_line &lt;span class="r"&gt;do&lt;/span&gt; |line|&lt;tt&gt;
&lt;/tt&gt;         &lt;span class="r"&gt;if&lt;/span&gt; line =~ &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;watch_fullscreen&lt;/span&gt;&lt;span class="ch"&gt;\?&lt;/span&gt;&lt;span class="k"&gt;(.*?)video_id=([&lt;/span&gt;&lt;span class="ch"&gt;\w&lt;/span&gt;&lt;span class="k"&gt;-]+)&amp;amp;(.*?)&amp;amp;t=([&lt;/span&gt;&lt;span class="ch"&gt;\w&lt;/span&gt;&lt;span class="k"&gt;-]+)&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;           &lt;span class="c"&gt;# p line&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;           flv_url = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;youtube&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;get_video?video_id=&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$2&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;amp;t=&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$4&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;;auto&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;           &lt;span class="r"&gt;break&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;         &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;       &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     flv_url&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;USER_AGENT&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;%{&lt;/span&gt;&lt;span class="k"&gt;Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.11) &lt;tt&gt;
&lt;/tt&gt;Gecko/20071231 Firefox/2.0.0.11 Flock/1.0.5&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;IO&lt;/span&gt;.popen(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;curl -o &lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;file_name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; -L -A &lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;USER_AGENT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;parse_youtube(url)&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;  2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-08-25:120</id>
    <published>2008-08-25T07:17:00Z</published>
    <updated>2008-08-26T07:57:15Z</updated>
    <link href="http://devblog.rorcraft.com/2008/8/25/uploading-large-files-to-rails-with-merb" rel="alternate" type="text/html" />
    <title>Uploading large files to Rails with Merb</title>
<content type="html">
            &lt;p&gt;As you know Rails does bad on handling file upload, a large file will block your Rails app a long while, make it busy on receiving the file and can’t give response to other visitors, make them upset and leave you alone.&lt;/p&gt;


	&lt;p&gt;One solution is using merb to handle file upload for rails. The latest Merb that build on Rack(a cool framework who help you dealing with all kinds of http servers) does a really good job on uploading.&lt;/p&gt;


	&lt;p&gt;First, install merb:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;sudo gem install merb&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Second, create a merb app in your rails dir:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;    merb-gen app uploader&lt;tt&gt;
&lt;/tt&gt;    cd uploader&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;You can ignore all other files except &lt;strong&gt;config/rack.rb&lt;/strong&gt;, this is the only file we need to modify. 
Currently there’s only one line in the file:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;    run &lt;span class="co"&gt;Merb&lt;/span&gt;::&lt;span class="co"&gt;Rack&lt;/span&gt;::&lt;span class="co"&gt;Application&lt;/span&gt;.new&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;It will ask merb to handle the http request come from rack. 
Let us change this file to:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;require &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;cgi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;File&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;to_s&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    path&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# build a new handler to handler rack's request&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Uploader&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;call&lt;/span&gt;(env)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# leverage merb's utility to parse the request.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# Merb will save the file to a tempfile and save the tempfile's path in request's param&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      request = &lt;span class="co"&gt;Merb&lt;/span&gt;::&lt;span class="co"&gt;Request&lt;/span&gt;.new(env)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      params = request.params&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# pass the params directly to the real (rails) app&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      result = post(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;http://someplace.com/api&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, hash_to_params(params)).split(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)[&lt;span class="i"&gt;-1&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;     &lt;tt&gt;
&lt;/tt&gt;      &lt;span class="c"&gt;# processing result or just ignore it ...&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    private&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;post&lt;/span&gt;(url, params=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      curl_cmd = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;curl -H &lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Content-type: application/x-www-form-urlencoded&lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;url&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; -d &lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;params&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="ch"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      puts &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;curl_cmd = &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;curl_cmd&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      f = &lt;span class="co"&gt;IO&lt;/span&gt;.popen(curl_cmd +&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      result = f.read&lt;tt&gt;
&lt;/tt&gt;      f.close&lt;tt&gt;
&lt;/tt&gt;      result&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;hash_to_params&lt;/span&gt;(hash)&lt;tt&gt;
&lt;/tt&gt;      hash.map &lt;span class="r"&gt;do&lt;/span&gt; |k, v|&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;if&lt;/span&gt; v.kind_of? &lt;span class="co"&gt;Hash&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          h = {}&lt;tt&gt;
&lt;/tt&gt;          v.each { |kk, vv| h[&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;k&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;kk&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;]&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;] = vv }&lt;tt&gt;
&lt;/tt&gt;          hash_to_params h&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;k&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;=&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;CGI&lt;/span&gt;.escape v.to_s&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;run &lt;span class="co"&gt;Uploader&lt;/span&gt;.new&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


Run merb  by 
&lt;pre&gt;&lt;code&gt;merb -p 1234 -c 1 -e production -d&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Remember to config your apache or your favorite webserver to redirect all request from /uploader to port 1234 (Your merb uploader is listening here!).&lt;/p&gt;


	&lt;p&gt;Pretty easy, isn’t it?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-08-13:99</id>
    <published>2008-08-13T08:33:00Z</published>
    <updated>2008-08-18T12:25:29Z</updated>
    <link href="http://devblog.rorcraft.com/2008/8/13/the-facebook-autocomplete-address-to-field" rel="alternate" type="text/html" />
    <title>The Facebook autocomplete address to: field.</title>
<content type="html">
            &lt;p&gt;We've extended the &lt;a href="http://github.com/madrobby/scriptaculous/wikis/autocompleter-local"&gt; Autocomplete.Local&lt;/a&gt; from &lt;a href="http://script.aculo.us"&gt;Scriptaculous&lt;/a&gt; to implement the autocomplete to: field mimicing the Facebook's features. This was a little challenging at the start, but &lt;a href="http://www.prototypejs.org"&gt;prototype.js&lt;/a&gt; and scriptaculous have just made it so much easier.
&lt;/p&gt;
&lt;img src="http://devblog.rorcraft.com/assets/2008/8/13/autocomplete.advancedlocal.jpg" /&gt;
&lt;br /&gt;
&lt;h2&gt;Concepts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;json - array of contacts with names and email address and any other fields you wish to search&lt;/li&gt;
&lt;li&gt;The input box changes size dynamically and reposition itself according to the keystrokes&lt;/li&gt;
&lt;li&gt;Each 'token' created is an input field, submitting the id of the user or an email address&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Straight to the source&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/rorcraft/autocomplete.localadvanced/tree/master"&gt;Browse source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rorcraft.com/autocomplete_advanced_local.zip"&gt;Full sourceAutocomplete_AdvancedLocal.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rorcraft.com/autocomplete_advanced_local/"&gt;Live Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Syntax&lt;/h2&gt;
&lt;div&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;new Autocompleter.LocalAdvanced(id_of_text_field, id_of_div_to_populate, json_array, options)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;/div&gt;
 &lt;p&gt;The constructor takes four parameters. The first two are, as usual, the id of the monitored textbox, and id of the autocompletion menu. The third is an array of strings that you want to autocomplete from, and the fourth is the options block.&lt;/p&gt;


	&lt;h3&gt;Extra local autocompletion options&lt;/h3&gt;


	&lt;table&gt;
		&lt;tr&gt;
			&lt;th&gt;&lt;em&gt;Option&lt;/em&gt;&lt;/th&gt;
			&lt;th&gt;&lt;em&gt;Default Value&lt;/em&gt;&lt;/th&gt;

			&lt;th&gt;&lt;em&gt;Description&lt;/em&gt;&lt;/th&gt;
		&lt;/tr&gt;
                &lt;tr&gt;
                        &lt;td&gt;&lt;code&gt;search_field&lt;/code&gt;&lt;/td&gt;
                        &lt;td&gt;"name"&lt;/td&gt;
                        &lt;td&gt;Which attribute to search in the json array.&lt;/td&gt;
               &lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;choices&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;10&lt;/td&gt;
			&lt;td&gt;How many autocompletion choices to offer&lt;/td&gt;
		&lt;/tr&gt;

		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;partialSearch&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;off&lt;/td&gt;
			&lt;td&gt;If false, the autocompleter will match entered text only at the beginning of strings in the autocomplete array. Defaults to true, which will match text at the beginning of any word in the strings in the autocomplete array. If you want to search anywhere in the string, additionally set the option fullSearch to true&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;fullSearch&lt;/code&gt;&lt;/td&gt;

			&lt;td&gt;false&lt;/td&gt;
			&lt;td&gt;Search anywhere in autocomplete array strings.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;partialChars&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;2&lt;/td&gt;
			&lt;td&gt;How many characters to enter before triggering a partial match (unlike minChars, which defines how many characters are required to do any match at all).&lt;/td&gt;

		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;code&gt;ignoreCase&lt;/code&gt;&lt;/td&gt;
			&lt;td&gt;true&lt;/td&gt;
			&lt;td&gt;Whether to ignore case when autocompleting&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;

&lt;h2&gt;Example&lt;/h2&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;div&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt; &lt;span class="ta"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="an"&gt;tabindex&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;-1&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;id&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ids&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;class&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;clearfix tokenizer&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;onclick&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$('autocomplete_input').focus()&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="ta"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="an"&gt;class&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;tokenizer_stretcher&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt;^_^&lt;span class="ta"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="an"&gt;class&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;tab_stop&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="an"&gt;type&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;id&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hidden_input&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;tabindex&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;-1&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class="ta"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="an"&gt;id&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;autocomplete_display&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;class&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;tokenizer_input&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt; &lt;span class="ta"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="an"&gt;type&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;size&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;tabindex&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;id&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;autocomplete_input&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;   &lt;span class="ta"&gt;/&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class="ta"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;                                                                          &lt;tt&gt;
&lt;/tt&gt; &lt;span class="ta"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="ta"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="an"&gt;id&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;autocomplete_populate&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;class&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;clearfix autocomplete typeahead_list&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="an"&gt;style&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;width: 358px; height: auto; overflow-y: hidden;display:none&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class="ta"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="an"&gt;class&lt;/span&gt;=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;typeahead_message&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta"&gt;&amp;gt;&lt;/span&gt;Type the name of a friend, friend list, or email address&lt;span class="ta"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;                       &lt;tt&gt;
&lt;/tt&gt; &lt;span class="ta"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;  &lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;/div&gt;
&lt;h3&gt;Javascript&lt;/h3&gt;
&lt;div&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;               (new &lt;span class="pt"&gt;Image&lt;/span&gt;()).src=&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/inbox/images/token.gif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;                        (new &lt;span class="pt"&gt;Image&lt;/span&gt;()).src=&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/inbox/images/token_selected.gif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;                        (new &lt;span class="pt"&gt;Image&lt;/span&gt;()).src=&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/inbox/images/token_hover.gif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;                        (new &lt;span class="pt"&gt;Image&lt;/span&gt;()).src=&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;/inbox/images/token_x.gif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;                        &lt;span class="r"&gt;var&lt;/span&gt; contacts = [&lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;phoenix zhuang&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;phoenix@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}, &lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;jian xie&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;jan.xie@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}, &lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;isaiah peng&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;isaiah.peng@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}, &lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chris chan&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chris.chan@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}, &lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rex chung&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rex@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;},&lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chung rex&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chung@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;},&lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chan chris&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chan@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;},&lt;tt&gt;
&lt;/tt&gt;                        {name:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;peng isaiah&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,email:&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;peng@rorcraft.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;} ];&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;                        &lt;span class="r"&gt;var&lt;/span&gt; typeahead = new Autocompleter.LocalAdvanced(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;autocomplete_input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;autocomplete_populate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, contacts, {                                                  &lt;tt&gt;
&lt;/tt&gt;                            frequency: 0.1,&lt;tt&gt;
&lt;/tt&gt;                            updateElement: addContactToList,&lt;tt&gt;
&lt;/tt&gt;                            search_field: &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                        });&lt;tt&gt;
&lt;/tt&gt;                        &lt;span class="r"&gt;var&lt;/span&gt; hidden_input = new HiddenInput(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;hidden_input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,typeahead);&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;/div&gt;

&lt;h3&gt;CSS&lt;/h3&gt;
&lt;div&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;/* autcompleter.advancedlocal css */&lt;tt&gt;
&lt;/tt&gt;.tokenizer{min-height:5px;padding:0px 0px 3px 3px;width:100%;background:#fff;font-size:11px;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer_locked{background:#f4f4f4;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer,&lt;tt&gt;
&lt;/tt&gt;.tokenizer *{cursor:text}&lt;tt&gt;
&lt;/tt&gt;.tokenizer input{width:100%;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer .tokenizer_input,&lt;tt&gt;
&lt;/tt&gt;.tokenizer .token{float:left;margin-right:3px;margin-top:3px;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer .tab_stop,&lt;tt&gt;
&lt;/tt&gt;.tokenizer .tokenizer_stretcher{display:block;float:left;overflow:hidden;width:0px;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer .tab_stop{height:0px;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer .tokenizer_stretcher{padding-top:7px;}&lt;tt&gt;
&lt;/tt&gt;#autocomplete_input{width:20px;}&lt;tt&gt;
&lt;/tt&gt;#facebook .tokenizer .tab_stop input{border:0px solid black;display:inline;position:relative;left:-500px;}&lt;tt&gt;
&lt;/tt&gt;#facebook .tokenizer .tokenizer_input_borderless {left:4px;margin-left:-1px;overflow:hidden;position:relative;}&lt;tt&gt;
&lt;/tt&gt;#facebook .tokenizer_input_borderless  #autocomplete_input{border:3px solid white!important;border-left:none;display:block;margin:-3px 3px -4px -2px;padding:0px!important;}&lt;tt&gt;
&lt;/tt&gt;/*IE6-/Win only*/&lt;tt&gt;
&lt;/tt&gt;/*\*/ * html#facebook .tokenizer_input_borderless #autocomplete_input { border:3px solid black;margin: -3px 3px -4px 14px:padding-left:10px; } /**/&lt;tt&gt;
&lt;/tt&gt;.tokenizer div:-moz-first-node{padding-top:1px!important;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer_input{max-width:450px;overflow:hidden;padding:1px 0px;}&lt;tt&gt;
&lt;/tt&gt;#facebook .tokenizer_input input,&lt;tt&gt;
&lt;/tt&gt;.tokenizer_input_shadow{border:0px solid black;outline:0;font-family:'lucida grande', tahoma, verdana, arial, sans-serif;font-size:11px;padding:0px 5px;margin:0 0 -1px 0;white-space:pre;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer_input_shadow{display:inline;left:-10000px;position:absolute;top:-10000px;}&lt;tt&gt;
&lt;/tt&gt;.tokenizer .tokenizer_input_shadow{height:0px;display:block;left:0px;overflow:hidden;position:relative;top:0px;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token{background-image:url('/inbox/images/token.gif');background-repeat:no-repeat;color:black;white-space:nowrap;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token span{background-image:url('/inbox/images/token.gif');background-position:top right;background-repeat:no-repeat;display:block;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token span span{background-position:bottom right;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token span span span{background-position:bottom left;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token span span span span{background-image:none;padding:2px 3px 2px 5px;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer.tokenizer_locked .token span span span span{padding-right:5px;}&lt;tt&gt;
&lt;/tt&gt;html div.tokenizer_locked .token:hover,&lt;tt&gt;
&lt;/tt&gt;html div.tokenizer_locked .token:hover span{background-image:url('/inbox/images/token.gif');}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token:hover,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token:hover span{background-image:url('/inbox/images/token_hover.gif');text-decoration:none;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token_selected,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token_selected span,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token_selected:hover,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token_selected:hover span{background-image:url('/inbox/images/token_selected.gif');color:white;text-decoration:none;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token span.x,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token span.x_hover,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token:hover span.x,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer .token:hover span.x_hover{background-image:url('/inbox/images/token_x.gif');background-position:4px 2px;cursor:pointer;display:inline;padding:0px 6px 0px 5px;}&lt;tt&gt;
&lt;/tt&gt;div.tokenizer.tokenizer_locked .token span.x,&lt;tt&gt;
&lt;/tt&gt;div.tokenizer.tokenizer_locked .token span.x_hover{display:none;}&lt;tt&gt;
&lt;/tt&gt;div.autocomplete {  position:absolute;  width:355px;  background-color:white;  border:1px solid #888;  margin-top:-2px;  padding:0px;}&lt;tt&gt;
&lt;/tt&gt;div.autocomplete ul {  list-style-type:none;margin:0px; padding:0px;}&lt;tt&gt;
&lt;/tt&gt;div.autocomplete ul li.selected { background-color: #ffb;}&lt;tt&gt;
&lt;/tt&gt;div.autocomplete ul li {  list-style-type:none;  display:block;  margin:0;  padding:2px;  height:32px;cursor:pointer;}&lt;tt&gt;
&lt;/tt&gt;/* end of autcompleter.advancedlocal css */&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;/div&gt;

&lt;h3&gt;Download the full source&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.rorcraft.com/autocomplete_advanced_local.zip"&gt;Autocomplete_AdvancedLocal.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[update] We've forked a version of the control.js and changed all reference to element.style to setStyle(). It was causing script errors in IE.&lt;br /&gt;
&lt;a href="http://github.com/rorcraft/scriptaculous/tree/master/src/controls.js"&gt;http://github.com/rorcraft/scriptaculous/tree/master/src/controls.js&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>isaiah</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-08-01:92</id>
    <published>2008-08-01T09:25:00Z</published>
    <updated>2008-08-01T09:38:33Z</updated>
    <link href="http://devblog.rorcraft.com/2008/8/1/patching-paperclip-to-only-thumbnail-images" rel="alternate" type="text/html" />
    <title>Patching paperclip to create thumbnails only for images</title>
<content type="html">
            &lt;p&gt;Paperclip has some good features over attachment_fu that "attached files don’t need to have a seperare model (thank god). Your attachments are treated just like any other atribute. Images aren’t saved until your model is saved" ( by Jim Neath ).&lt;/p&gt;
&lt;p&gt;The fall back of paperclip is that it tries to create a thumbnail for any type of file, including pdf. It won't cause much problem if it cannot create a thumbnail to a certain file. But when it comes to pdf file, paperclip tries to generate a thumbnail for every page of the file, it becomes very slow when uploading the pdf file if the file has hundreds of pages. Sometimes it even times out! At the same time, attachment_fu does not have this problem.&lt;/p&gt;
&lt;p&gt;attachment_fu.rb includes a class method #images? to distinguish if the file is an image.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="i"&gt;129&lt;/span&gt;   &lt;span class="c"&gt;# Returns true or false if the given content type is recognized as an image.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;130&lt;/span&gt;       &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;image?&lt;/span&gt;(content_type)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;131&lt;/span&gt;         content_types.include?(content_type)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;132&lt;/span&gt;       &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Content types of images are initialized at the begin of the file:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="i"&gt;5&lt;/span&gt;  &lt;span class="cv"&gt;@@content_types&lt;/span&gt; = [&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;image/jpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;image/pjpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;image/gif&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;image/png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;image/x-png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;image/jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Then the #image? method is called in a instantial method #thumbnailable:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;216       # Checks whether the attachment's content type is an image content type&lt;tt&gt;
&lt;/tt&gt;217       def image?&lt;tt&gt;
&lt;/tt&gt;218         self.class.image?(content_type)&lt;tt&gt;
&lt;/tt&gt;219       end&lt;tt&gt;
&lt;/tt&gt;220&lt;tt&gt;
&lt;/tt&gt;221       # Returns true/false if an attachment is thumbnailable.  &lt;tt&gt;
&lt;/tt&gt;            # A thumbnailable attachment has an image content type and the parent_id attribute.&lt;tt&gt;
&lt;/tt&gt;222       def thumbnailable?&lt;tt&gt;
&lt;/tt&gt;223         image? &lt;span class="er"&gt;&amp;amp;&lt;/span&gt;&lt;span class="er"&gt;&amp;amp;&lt;/span&gt; respond_to?(:parent_id) &lt;span class="er"&gt;&amp;amp;&lt;/span&gt;&lt;span class="er"&gt;&amp;amp;&lt;/span&gt; parent_id.nil?&lt;tt&gt;
&lt;/tt&gt;224       end&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;In the #create_or_update_thumbnail it test if the content is thumbnailable? to determine going or not.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="i"&gt;243&lt;/span&gt;   &lt;span class="c"&gt;# Creates or updates the thumbnail for the current attachment.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;244&lt;/span&gt;       &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;create_or_update_thumbnail&lt;/span&gt;(temp_file, file_name_suffix, *size)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;245&lt;/span&gt;         thumbnailable? || raise(&lt;span class="co"&gt;ThumbnailError&lt;/span&gt;.new(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Can't create a thumbnail if the content &lt;/span&gt;&lt;span class="ch"&gt;\&lt;tt&gt;
&lt;/tt&gt;&lt;/span&gt;&lt;span class="k"&gt; type is not an image or there is no parent_id column&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;246&lt;/span&gt;         returning find_or_initialize_thumbnail(file_name_suffix) &lt;span class="r"&gt;do&lt;/span&gt; |thumb|&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;247&lt;/span&gt;           thumb.attributes = {&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;248&lt;/span&gt;             &lt;span class="sy"&gt;:content_type&lt;/span&gt;             =&amp;gt; content_type,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;249&lt;/span&gt;             &lt;span class="sy"&gt;:filename&lt;/span&gt;                 =&amp;gt; thumbnail_name_for(file_name_suffix),&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;250&lt;/span&gt;             &lt;span class="sy"&gt;:temp_path&lt;/span&gt;                =&amp;gt; temp_file,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;251&lt;/span&gt;             &lt;span class="sy"&gt;:thumbnail_resize_options&lt;/span&gt; =&amp;gt; size&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;252&lt;/span&gt;           }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;253&lt;/span&gt;           callback_with_args &lt;span class="sy"&gt;:before_thumbnail_saved&lt;/span&gt;, thumb&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;254&lt;/span&gt;           thumb.save!&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;255&lt;/span&gt;         &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;256&lt;/span&gt;       &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Paperclip has a similar structure like this, it makes it easier to make this patch.&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="co"&gt;From&lt;/span&gt; line &lt;span class="c"&gt;#217&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;post_process&lt;/span&gt; &lt;span class="c"&gt;#:nodoc:&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@queued_for_write&lt;/span&gt;[&lt;span class="sy"&gt;:original&lt;/span&gt;].nil?&lt;tt&gt;
&lt;/tt&gt;      logger.info(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;[paperclip] Post-processing &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;name&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="iv"&gt;@styles&lt;/span&gt;.each &lt;span class="r"&gt;do&lt;/span&gt; |name, args|&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          dimensions, format = args&lt;tt&gt;
&lt;/tt&gt;          dimensions = dimensions.call(instance) &lt;span class="r"&gt;if&lt;/span&gt; dimensions.respond_to? &lt;span class="sy"&gt;:call&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;          &lt;span class="iv"&gt;@queued_for_write&lt;/span&gt;[name] = &lt;span class="co"&gt;Thumbnail&lt;/span&gt;.make(&lt;span class="iv"&gt;@queued_for_write&lt;/span&gt;[&lt;span class="sy"&gt;:original&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;                                                   dimensions,&lt;tt&gt;
&lt;/tt&gt;                                                   format,&lt;tt&gt;
&lt;/tt&gt;                                                   &lt;span class="iv"&gt;@whiny_thumnails&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;rescue&lt;/span&gt; &lt;span class="co"&gt;PaperclipError&lt;/span&gt; =&amp;gt; e&lt;tt&gt;
&lt;/tt&gt;          &lt;span class="iv"&gt;@errors&lt;/span&gt; &amp;lt;&amp;lt; e.message &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@whiny_thumbnails&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;The trick here is to add the #thumbnailable? method in right after the #begin keyword and raise a PaperclipError if it fails:&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="i"&gt;213&lt;/span&gt;     &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;post_process&lt;/span&gt; &lt;span class="c"&gt;#:nodoc:&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;214&lt;/span&gt;       &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@queued_for_write&lt;/span&gt;[&lt;span class="sy"&gt;:original&lt;/span&gt;].nil?&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;215&lt;/span&gt;       &lt;span class="iv"&gt;@styles&lt;/span&gt;.each &lt;span class="r"&gt;do&lt;/span&gt; |name, args|&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;216&lt;/span&gt;         &lt;span class="r"&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                &lt;span class="c"&gt;# Test here&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;217&lt;/span&gt;           thumbnailable? || raise(&lt;span class="co"&gt;PaperclipError&lt;/span&gt;.new(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Can not create thumbnails &lt;/span&gt;&lt;span class="ch"&gt;\&lt;tt&gt;
&lt;/tt&gt;&lt;/span&gt;&lt;span class="k"&gt; if the content type is not an image.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;218&lt;/span&gt;           dimensions, format = args&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;219&lt;/span&gt;           dimensions = dimensions.call(instance) &lt;span class="r"&gt;if&lt;/span&gt; dimensions.respond_to? &lt;span class="sy"&gt;:call&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;220&lt;/span&gt;           &lt;span class="iv"&gt;@queued_for_write&lt;/span&gt;[name] = &lt;span class="co"&gt;Thumbnail&lt;/span&gt;.make(&lt;span class="iv"&gt;@queued_for_write&lt;/span&gt;[&lt;span class="sy"&gt;:original&lt;/span&gt;],-&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;221&lt;/span&gt;                                                    dimensions,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;222&lt;/span&gt;                                                    format,-&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;223&lt;/span&gt;                                                    &lt;span class="iv"&gt;@whiny_thumnails&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;224&lt;/span&gt;         &lt;span class="r"&gt;rescue&lt;/span&gt; &lt;span class="co"&gt;PaperclipError&lt;/span&gt; =&amp;gt; e&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;225&lt;/span&gt;           &lt;span class="iv"&gt;@errors&lt;/span&gt; &amp;lt;&amp;lt; e.message &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="iv"&gt;@whiny_thumbnails&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;226&lt;/span&gt;         &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;227&lt;/span&gt;       &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="i"&gt;228&lt;/span&gt;     &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Add the #image? and #thumbnailable? method to attachment.rb of paperclip, and initialize the thumbnailable content types at the beginning. That's all, now you can upload pdf files very fast.&lt;/p&gt;
&lt;p&gt;About how to use paperclip, Jim Neath has a great tutorial &lt;a href="http://jimneath.org/2008/04/17/paperclip-attaching-files-in-rails/"&gt;Paperclip: Attaching Files in Rails&lt;/a&gt;. Enjoy it!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>moming2k</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-04-02:46</id>
    <published>2008-04-02T09:25:00Z</published>
    <updated>2008-04-02T09:26:39Z</updated>
    <link href="http://devblog.rorcraft.com/2008/4/2/amazon-ec2-finally-support-static-ip-addresses" rel="alternate" type="text/html" />
    <title>Amazon EC2 finally support static IP addresses</title>
<content type="html">
            &lt;p&gt;To enable the static IP addresses function , you need to download the latest Amazon EC2 Command-Line Tools,
  the download link of it is &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&amp;amp;categoryID=88"&gt;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&amp;amp;categoryID=88&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;after download, I recommend to unzip it to a folder call ec2 under your home path&lt;/p&gt;
&lt;p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;mkdir ~/ec2&lt;tt&gt;
&lt;/tt&gt;cd ~/ec2&lt;tt&gt;
&lt;/tt&gt;unzip ec2-api-tools.zip&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;you can now see a folder call ec2-api-tools-1.3-19403 under the ec2 folder.&lt;/p&gt;
&lt;p&gt;now it is time to update the .profile , so that EC2 tool can find the library that it use.&lt;/p&gt;
&lt;p&gt;you have to download the private and public cert from amazon &lt;/p&gt;
&lt;p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;nano ~/.profile&lt;tt&gt;
&lt;/tt&gt;export PATH=~/ec2/ec2-api-tools-1.3-19403/bin:$PATH&lt;tt&gt;
&lt;/tt&gt;export EC2_HOME=~/ec2/ec2-api-tools-1.3-19403&lt;tt&gt;
&lt;/tt&gt;export EC2_CERT=~/.ec2/cert-xxxxxxxxx.pem&lt;tt&gt;
&lt;/tt&gt;export EC2_PRIVATE_KEY=~/.ec2/pk-yyyyyy.pem&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;then you can start a new console so that the profile update will be effective.&lt;/p&gt;
&lt;p&gt;you can now allocate a new IP address for your account.&lt;/p&gt;
&lt;p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;Chris:~ chrischan$ ec2-allocate-address &lt;tt&gt;
&lt;/tt&gt;ADDRESS 75.101.139.212&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;This new IP 75.101.140.212 is not bundle to any AMI instance yet. &lt;br /&gt;
You have to manually assign this IP address to a instance&lt;/p&gt;
&lt;p&gt;First, you need to know the instance that you have already started. you can use the following command&lt;/p&gt;
&lt;p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;Chris:~ chrischan$ ec2-describe-instances &lt;tt&gt;
&lt;/tt&gt;  RESERVATION     r-3c1bea55      073126868754    default&lt;tt&gt;
&lt;/tt&gt;INSTANCE        i-7124dd30      ami-5035d079    ec2-67-202-34-115.compute-1.amazonaws.com      &lt;tt&gt;
&lt;/tt&gt;domU-12-31-38-00-6D-98.compute-1.internal       running         0m1.small 2008-03-05T15:51:36+0000 &lt;tt&gt;
&lt;/tt&gt;us-east-1a&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;you can see that the instance id is i-7124dd30, we can then assign the IP to that instance&lt;/p&gt;
&lt;p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;Chris:~ chrischan$ ec2-associate-address 75.101.140.212 -i i-7124dd30&lt;tt&gt;
&lt;/tt&gt;ADDRESS 75.101.140.212  i-7124dd30&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;If you want to check the address allocation status, you can use the follow command&lt;/p&gt;
&lt;p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;Chris:~ chrischan$ ec2-describe-addresses &lt;tt&gt;
&lt;/tt&gt;ADDRESS 75.101.140.212  i-7124dd30&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;for any time if you want to free the IP , you can use &lt;/p&gt;
&lt;p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;ec2-release-address IP-address&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
 &lt;/p&gt;
&lt;p&gt;If you want to assign the existing IP address to a new instance , you can use ec2-associate-address,
but this time , you assign the new instance IP, and the existing IP address bundling will remove, 
so the single IP address will always only bundle to one instance. &lt;/p&gt;
&lt;p&gt;Also, a instance can only have one IP address assocate to it , so when you assign a new IP address to a instance,
all the existing IP bundling will be removed. And all the IP address in this status will start to charge you account.
So whenever any IP allocate has finished , please make to use ec2-describe-addresses to check the IP address bundling status.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-03-26:44</id>
    <published>2008-03-26T09:16:00Z</published>
    <updated>2008-03-28T10:08:26Z</updated>
    <link href="http://devblog.rorcraft.com/2008/3/26/ankoder-architecture-presentation" rel="alternate" type="text/html" />
    <title>Ankoder Architecture presentation</title>
<content type="html">
            &lt;p&gt;In March, we had a ruby on rails user group meetup in Hangzhou, China. It was exciting to meet more rails developers in China and shares some experience on our projects. Hangzhou is famous for it’s West Lake, it is just 1.5 hrs south of Shanghai. It is turning into the Silicon Valley of China, because several large internet companies are based in Hangzhou, such as Alibaba. They are also experimenting with Rails, because of its amazing productivity gains.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://devblog.rorcraft.com/assets/2008/3/28/IMG_1903.JPG" /&gt;&lt;/p&gt;


	&lt;p&gt;We did a presentation on our architecture and how we host a fault tolerant system on Amazon’s &lt;span class="caps"&gt;EC2&lt;/span&gt;. We will already need to change this a little since Amazon has just released the long been waited feature &lt;i&gt;Static IP&lt;/i&gt;. Now you don’t need to rely on &lt;span class="caps"&gt;DNS&lt;/span&gt; to failover to your new server, you can at least start a new instance and point your IP to the new host.&lt;/p&gt;


&lt;div&gt;&amp;lt;object height="355" width="425" style="margin:0px"&gt;&amp;lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=ankoder-system-architecture-1206698165511139-4" /&gt;&amp;lt;param name="allowFullScreen" value="true" /&gt;&amp;lt;param name="allowScriptAccess" value="always" /&gt;&amp;lt;embed allowfullscreen="true" type="application/x-shockwave-flash" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=ankoder-system-architecture-1206698165511139-4" allowscriptaccess="always" height="355" width="425"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;&lt;div&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" alt="SlideShare" /&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/rorcraft/ankoder-system-architecture?src=embed" title="View 'Ankoder System Architecture' on SlideShare"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-02-25:42</id>
    <published>2008-02-25T10:45:00Z</published>
    <updated>2008-02-25T11:01:45Z</updated>
    <link href="http://devblog.rorcraft.com/2008/2/25/ankoder-api-ruby-library" rel="alternate" type="text/html" />
    <title>Ankoder API ruby library released</title>
<content type="html">
            &lt;p&gt;Do you need to build a mini youtube for your client?&lt;/p&gt;


	&lt;p&gt;Do you want to include video functionalities to your site?&lt;/p&gt;


	&lt;p&gt;We’ve released the ruby library that we are already using on &lt;a href="http://free.ankoder.com"&gt;http://free.ankoder.com&lt;/a&gt; both in rails plugin form as well as ruby gem form.&lt;/p&gt;


	&lt;p&gt;Install it and have a look at the rdoc&lt;/p&gt;


	&lt;h3&gt;Rails Plugin&lt;/h3&gt;


	&lt;p&gt;&lt;a href="http://ankoder.googlecode.com"&gt;http://ankoder.googlecode.com&lt;/a&gt;&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;script/plugin install http&lt;span class="sy"&gt;:/&lt;/span&gt;/ankoder.googlecode.com/svn/trunk/trunk/ankoder_on_rails&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h3&gt;Ruby Gem&lt;/h3&gt;


	&lt;p&gt;&lt;a href="http://rubyforge.org/projects/ankoder/"&gt;http://rubyforge.org/projects/ankoder/&lt;/a&gt;&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="er"&gt;$&lt;/span&gt; sudo gem install ankoder&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Password&lt;/span&gt;:&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Bulk&lt;/span&gt; updating &lt;span class="co"&gt;Gem&lt;/span&gt; source index &lt;span class="r"&gt;for&lt;/span&gt;: http&lt;span class="sy"&gt;:/&lt;/span&gt;/gems.rubyforge.org&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Successfully&lt;/span&gt; installed ankoder&lt;span class="fl"&gt;-0.0&lt;/span&gt;.&lt;span class="i"&gt;2&lt;/span&gt;-&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Installing&lt;/span&gt; ri documentation &lt;span class="r"&gt;for&lt;/span&gt; ankoder&lt;span class="fl"&gt;-0.0&lt;/span&gt;.&lt;span class="i"&gt;2&lt;/span&gt;-...&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;Installing&lt;/span&gt; &lt;span class="co"&gt;RDoc&lt;/span&gt; documentation &lt;span class="r"&gt;for&lt;/span&gt; ankoder&lt;span class="fl"&gt;-0.0&lt;/span&gt;.&lt;span class="i"&gt;2&lt;/span&gt;-...&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Send us an email if you’re keen to try it.&lt;/p&gt;


	&lt;p&gt;We’re working on our payment model and cleaning up the UI so you can manage your services.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>devon</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-01-15:24</id>
    <published>2008-01-15T02:01:00Z</published>
    <updated>2008-01-15T02:13:13Z</updated>
    <link href="http://devblog.rorcraft.com/2008/1/15/mpeg4aac-for-ffmpeg-problem" rel="alternate" type="text/html" />
    <title>mpeg4aac for ffmpeg problem</title>
<content type="html">
            &lt;p&gt;&lt;strong&gt;Error Message:&lt;/strong&gt;&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;library: cannot resolve faacDecGetErrorMessage in libfaad.so.0!&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;


First you should comfirm that libfaad.so.0 library is located in the path which are defined by the LD_LIBRARY_PATH environment variable. Otherwise, you can use 
&lt;pre&gt;&lt;code&gt;
export LD_LIBRARY_PATH=/home/ffmpeg/usr/local/lib 
&lt;/code&gt;&lt;/pre&gt;
to add the libfaad.so.0 to the LD_LIBRARY_PATH. (in this case, libfaad.so.0 is in the /home/ffmpeg/usr/local/lib ).
&lt;br&gt;&lt;br&gt;
Second, Modify libavcodec/libfaad.c in ffmpeg source code
&lt;pre&gt;&lt;code&gt;
change line:
do { static const char* n = "faacDec" #a; \
To:
do { static const char* n = "NeAACDec" #a; \

change line:
#define dfaac(a, b)     s-&amp;gt;faacDec ## a = faacDec ## a
To:
#define dfaac(a, b)     s-&amp;gt;faacDec ## a = NeAACDec ## a
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Re-compile ffmpeg.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2008-01-08:20</id>
    <published>2008-01-08T02:51:00Z</published>
    <updated>2008-02-25T10:56:07Z</updated>
    <link href="http://devblog.rorcraft.com/2008/1/8/ec2-on-leopard" rel="alternate" type="text/html" />
    <title>Step by step guide to preparing EC2 on MacOSX</title>
<content type="html">
            &lt;h2&gt;Amazon provides two types of tool.&lt;/h2&gt;

&lt;p&gt;1. Operational tools that use to startup and shutdown AMI instances&lt;/p&gt;

&lt;p&gt;2. Packaging tool to pack the AMI that created , or modify on existing public AMI and rebundle to new private AMI&lt;/p&gt;

&lt;h3&gt;Operational tool&lt;/h3&gt;

&lt;p&gt;Create a new AWS Access Identifiers if you don't already have.&lt;/p&gt;

&lt;p&gt;$ mkdir  ~/.ec2&lt;/p&gt;

&lt;p&gt;download both the Private Key file and X.509 Certificate file to ~/.ec2&lt;/p&gt;

&lt;p&gt;rename the pk-xxxxxxxxxx.pem one to PrivateKey.pem&lt;br /&gt;
rename the cert-xxxxxxxxx.pem one to 509certificate.pem&lt;br /&gt;
( xxxxxxxxxx stand for the random name generate by amazon )&lt;/p&gt;

&lt;p&gt;visit the following to download the packaged file to Download folder&lt;/p&gt;

&lt;p&gt;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&amp;categoryID=88&lt;/p&gt;

&lt;p&gt;$ mkdir ~/ec2&lt;/p&gt;

&lt;p&gt;$ cp ~/Downloads/ec2-api-tools.zip ~/ec2/&lt;/p&gt;

&lt;p&gt;$ cd ~/ec2/&lt;/p&gt;

&lt;p&gt;$ unzip ec2-api-tools.zip&lt;/p&gt;

&lt;p&gt;$ nano ~/.profile &lt;/p&gt;

&lt;p&gt;append the follow line to the end&lt;/p&gt;

&lt;p&gt;export JAVA_HOME=/Library/Java/Home&lt;br /&gt;
export PATH=~/ec2/ec2-api-tools-1.2-13740/bin:$PATH&lt;br /&gt;
export EC2_HOME=~/ec2/ec2-api-tools-1.2-13740&lt;br /&gt;
export EC2_PRIVATE_KEY=~/.ec2/PrivateKey.pem&lt;br /&gt;
export EC2_CERT=~/.ec2/509certificate.pem&lt;/p&gt;

&lt;p&gt;restart the terminal to active the changes on bash profile&lt;/p&gt;

&lt;p&gt;$ ec2-describe-images  -o amazon
IMAGE   ami-20b65349    ec2-public-images/fedora-core4-base.manifest.xml        amazon  available       public&lt;br /&gt;
IMAGE   ami-22b6534b    ec2-public-images/fedora-core4-mysql.manifest.xml       amazon  available       public&lt;br /&gt;
IMAGE   ami-23b6534a    ec2-public-images/fedora-core4-apache.manifest.xml      amazon  available       public&lt;br /&gt;
IMAGE   ami-25b6534c    ec2-public-images/fedora-core4-apache-mysql.manifest.xml        amazon  available      public&lt;br /&gt; 
IMAGE   ami-26b6534f    ec2-public-images/developer-image.manifest.xml  amazon  available       public&lt;br /&gt;
IMAGE   ami-2bb65342    ec2-public-images/getting-started.manifest.xml  amazon  available       public&lt;br /&gt;
IMAGE   ami-36ff1a5f    ec2-public-images/fedora-core6-base-x86_64.manifest.xml amazon  available       public&lt;br /&gt;
IMAGE   ami-bd9d78d4    ec2-public-images/demo-paid-AMI.manifest.xml    amazon  available       public  A79EC0DB&lt;/p&gt;

&lt;p&gt;If install sucessfully , will show the list of the AMI that amazon provide&lt;/p&gt;

&lt;p&gt;$ ec2-add-keypair demo-keypair     
KEYPAIR ankoder d9:d9:85:95:5f:ef:19:c9:33:5b:78:e6:e7:82:cc:e2:6a:9f:70:76&lt;br /&gt;
-----BEGIN RSA PRIVATE KEY-----&lt;br /&gt;
MIIEowIBAAKCAQEAyfG40k8HRgFaZZqDUQu5FZAjyKFDOKgMLb0DpmP10oM3RCz4KBqHQfJgyjqs&lt;br /&gt;
5cz++qG1NDQ1HYVs7Ke45OshRU+ibIvRh57L1EcRetEerpXNZJ3qKkcj+wMvyAhEYo515DKCQbWG&lt;br /&gt;
+M8SVNDTdXDIFAZBxs2Bo9wvrbRn8J+cCyqRSkYl+CpfIen8LcU0TD6ssCASIaUW++z+Sj0iH9p/&lt;br /&gt;
+PirmSWhbEbFqgYNqUPrIuNitSYE1wEsPF+ckHuL18Vn7Zc4gMM9eOQ4+u+NgGpPMAs8ZY8Fu7tJ&lt;br /&gt;
Oq2pZQhHI3E18QVh7/CkRNl7quYGm+WQUermSycFNOABU6+KEWdoYwIDAQABAoIBAAp9L6hcynfs&lt;br /&gt;
YhGc8O0ourhQAEvPdHpg4CEQDDx8PKxufFRiMZGDrzrRqA1Y9toIx8Wk2JCZlZiu8XVpUMUzIUtE&lt;br /&gt;
U59ns75jlRq1hkbmzb0rsrtjKGKBx3CmPbkaFNM5qw3rQbDACP6rYrxdDF6xOPMxUAFPc0hbi25u&lt;br /&gt;
TGfHIofB2npVu5YxqHUambJI/mgbXMIU5xuZ0Ha1ALYM4dtG66q1HzpYTPw+DXh+PtpgIKFBuL7K&lt;br /&gt;
+6WZpaX3Z5ll9JbYclnxIjnZProeZa4Hty5/ND1TbeMWfi9e1TLXbpP02Um0pTCxE8kdmkqqtfg3&lt;br /&gt;
t6CW39zY53jxmPS2HWTVzSM3V4ECgYEA/3UnllaaPZY1XmQ81lz4Fia4w4z/SjBjB6FY1s5qkfnD&lt;br /&gt;
tBVCRs1anxf8nKI75GGY+logV77iKPKMbWmhM2Jj6dnMbtfpPfpGzUgPrkccMeRTv/XpfMuT1hh+&lt;br /&gt;
p2NLHfld7/7MLC+AidrBZxryfwo/Fa6v+aJg4KnFDx+UDxmUx/MCgYEAyl97Xue4nsfw3v/HfNYs&lt;br /&gt;
pvkvQ7aSPd16XU+6fKQa4FZi2N8Soiz7qiOoBjBSGoFW5EF5Ai7i56RLGDqXHNXd8WnduhflFc2l&lt;br /&gt;
jtzifP1DFDsyR+dYbblT7b5DW2WntXTVsAk3Xn+oGcriL2qFvbGmce9H1fVnPaOKsZsMl3g86dEC&lt;br /&gt;
gYEAvQWGFlKFHGEB+mc3MPK3y0Q5oNC6sb2d+S5lGwS/jGYAbkbwtI0Myf2ouIm+wV2KIW0A04x1&lt;br /&gt;
shDO4cKwOeJKxeWXxEjU2DxRmWIB4FXTwgMOCVM/wkyshlW3mcn58iLrZELn9qXreZW5V75zwpbl&lt;br /&gt;
WPjaU1/YSUS1gFxAZO/rzAsCgYA3/w+OBSQqmzxlF/VE76ZPVWfknqH8iEoRg7wgPPBK3txfEeqA&lt;br /&gt;
AV5ph5A4lipBt0QpyIwJNJwIaId23s9tZSgSYq69jVsQG2USEMCCwTlMYczZ5IOtaLh2ck0E/y3W&lt;br /&gt;
oct2+DXf6gbDjEXlxN3YzU02/XStGUhF3/kCiBqF1vlT4QKBgFtaVjtc1VO/t0+vQ8CmTn4Y03Ml&lt;br /&gt;
pCORn4081m1w5PhfEbei+qzAY66r8AkB1Du9CT/NhrGXMsTTrsTiaApjoJ2HMUW3Pr/m6x/QIpTf&lt;br /&gt;
/4cFSHaDKnb5plNB3+DwPjjtDx/37PC6XAVTOPxaANr/lEkkST0vub+MkkQ/RxShLxKg&lt;br /&gt;
-----END RSA PRIVATE KEY-----&lt;/p&gt;

&lt;p&gt;copy the above text including -----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATE KEY-----
to ~/.ssh/id_rsa-demo-keypair  &lt;/p&gt;

&lt;p&gt;$ nano ~/.ssh/id_rsa-demo-keypair  &lt;/p&gt;

&lt;p&gt;paste all the content to it and save&lt;/p&gt;

&lt;p&gt;$ ec2-run-instances ami-25b6534c -k demo-keypair  &lt;/p&gt;

&lt;p&gt;RESERVATION     r-b7fc17de      119012238391    default&lt;br /&gt;
INSTANCE        i-6ea05007      ami-25b6534c                    pending ankoder 0               m1.small       &lt;br /&gt; 2008-01-07T05:49:15+0000&lt;/p&gt;

&lt;p&gt;if the terminal return the message similar to this , you have successfully started a AMI instance.&lt;/p&gt;

&lt;p&gt;To show all the instances currently running can use the ec2-describe-instances command&lt;/p&gt;
&lt;p&gt;$ ec2-describe-instances&lt;br /&gt;
INSTANCE        i-6ea05007      ami-25b6534c    ec2-67-202-24-116.compute-1.amazonaws.com      &lt;br /&gt; domU-12-31-38-00-29-48.compute-1.internal       running ankoder m1.small &lt;br /&gt;2008-01-07T05:49:15+0000&lt;/p&gt;

&lt;p&gt;To shutdown a running instance, can first find the instance id by using `ec2-describe-instances` , the one that in format of i-xxxxxxxx is the instance id&lt;/p&gt;

&lt;p&gt;$ ec2-terminate-instances i-6ea05007&lt;br /&gt;
INSTANCE        i-6ea05007      running shutting-down&lt;/p&gt;

&lt;p&gt;Allow the instance to be accessable from outside&lt;/p&gt;

&lt;p&gt;$ ec2-authorize default -p 22&lt;br /&gt;
PERMISSION     default  ALLOWS  tcp     22      22      FROM    CIDR   0.0.0.0/0&lt;/p&gt;

&lt;p&gt;$ ec2-authorize default -p 80&lt;br /&gt;
PERMISSION     default  ALLOWS  tcp     80      80      FROM    CIDR   0.0.0.0/0&lt;/p&gt;

&lt;p&gt;$ ec2-authorize default -p 21&lt;br /&gt;
PERMISSION     default  ALLOWS  tcp     80      21      FROM    CIDR   0.0.0.0/0&lt;/p&gt;

&lt;p&gt;To connect to the AMI instance from SSH&lt;br /&gt;
first check the hostname &lt;/p&gt;

&lt;p&gt;$ ec2-describe-instances &lt;br /&gt;
INSTANCE        i-55a0503c      ami-25b6534c    ec2-67-202-2-199.compute-1.amazonaws.com        &lt;br /&gt;domU-12-31-38-00-42-55.compute-1.internal       running ankoder m1.small &lt;br /&gt;2008-01-07T06:02:38+0000&lt;/p&gt;

&lt;p&gt;using the private key that you generated to login &lt;br /&gt;
$ ssh root@ec2-67-202-2-199.compute-1.amazonaws.com -i ~/.ssh/id_rsa-demo-keypair  &lt;/p&gt;

&lt;p&gt;you can do whatever you like in this instance&lt;/p&gt;

&lt;p&gt;install ec2onrails support tool &lt;br /&gt;
$ sudo gem install ec2onrails&lt;/p&gt;

&lt;h3&gt;As the Amazon EC2 tool is in rpm format, and MacOSX doesn't come with it.&lt;br /&gt;
so we have to use DarwinPorts to install rpm first &lt;/h3&gt;

&lt;p&gt;Install the rpm&lt;/p&gt;

&lt;p&gt;$ sudo port install rpm&lt;/p&gt;

&lt;p&gt;Install Amazon packaging tool &lt;/p&gt;

&lt;p&gt;$ wget http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm&lt;/p&gt;
&lt;p&gt;$ sudo rpm -i ec2-ami-tools.noarch.rpm --nodeps --ignoreos&lt;/p&gt;


&lt;p&gt;Also, there is a gem for access the EC2 from ruby&lt;/p&gt;

&lt;p&gt;$ sudo gem install amazon-ec2 --include-dependencies&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>devon</name>
    </author>
    <id>tag:devblog.rorcraft.com,2007-12-19:17</id>
    <published>2007-12-19T23:30:00Z</published>
    <updated>2007-12-26T07:05:56Z</updated>
    <link href="http://devblog.rorcraft.com/2007/12/19/generate-pdfs-in-rails-with-rfpdf" rel="alternate" type="text/html" />
    <title>Generate PDFs in Rails with RFPDF</title>
<content type="html">
            &lt;p&gt;&lt;strong&gt;1, Install railsrfpdf plugin&lt;/strong&gt;
ruby script/plugin install http://cnruby.googlecode.com/svn/trunk/rails-projects/infoq_rfpdf/vendor/plugins/railsrfpdf/&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;2, add new Mime type to environment.rb&lt;/strong&gt;：
Mime::Type.register “application/pdf”, :pdf&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;3, in the controller&lt;/strong&gt;：
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;respond_to &lt;span class="r"&gt;do&lt;/span&gt; |format| &lt;tt&gt;
&lt;/tt&gt;  format.html &lt;span class="c"&gt;# show.rhtml &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  format.xml  { render &lt;span class="sy"&gt;:xml&lt;/span&gt; =&amp;amp;gt; &lt;span class="iv"&gt;@page&lt;/span&gt;.to_xml } &lt;tt&gt;
&lt;/tt&gt;  format.pdf &lt;span class="r"&gt;do&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf = &lt;span class="co"&gt;FPDF&lt;/span&gt;.new &lt;tt&gt;
&lt;/tt&gt;    pdf.&lt;span class="co"&gt;AddPage&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="i"&gt;18&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Cell(&lt;span class="i"&gt;100&lt;/span&gt;, &lt;span class="i"&gt;20&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    send_data pdf.&lt;span class="co"&gt;Output&lt;/span&gt;, &lt;span class="sy"&gt;:filename&lt;/span&gt; =&amp;amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hello.pdf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:type&lt;/span&gt; =&amp;amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;application/pdf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://devblog.rorcraft.com/assets/2007/12/19/hello.png" /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Useful method in &lt;span class="caps"&gt;RPDF&lt;/span&gt;&lt;/strong&gt;
SetFont(string family [, string style [, float size]])
SetMargins(float left, float top [, float right])
SetTextColor(int r [, int g, int b])
SetXY(float x, float y)
AddFont(string family [, string style [, string file]])
Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, int fill [, mixed link]]]]]]])
Image(string file, float x, float y [, float w [, float h [, string type [, mixed link]]]])
Line(float x1, float y1, float x2, float y2)
MultiCell(float w, float h, string txt [, mixed border [, string align [, int fill]]])
Rect(float x, float y, float w, float h [, string style])&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;A case in real world&lt;/strong&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;    pdf = &lt;span class="co"&gt;FPDF&lt;/span&gt;.new(&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;portrait&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;pt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, [&lt;span class="i"&gt;800&lt;/span&gt;, &lt;span class="i"&gt;1380&lt;/span&gt;]) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetAutoPageBreak(&lt;span class="pc"&gt;false&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.&lt;span class="co"&gt;AddPage&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# draw a rectangle &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    pdf.SetFillColor(&lt;span class="i"&gt;240&lt;/span&gt;, &lt;span class="i"&gt;240&lt;/span&gt;, &lt;span class="i"&gt;240&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Rect(&lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;800&lt;/span&gt;, &lt;span class="i"&gt;895&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;)    pdf.Image(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/public/images/a.jpg&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;800&lt;/span&gt;, &lt;span class="i"&gt;600&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# add four images &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    pdf.Image(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/public/images/b.jpg&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;700&lt;/span&gt;, &lt;span class="i"&gt;260&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Image(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/public/images/c.jpg&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;270&lt;/span&gt;, &lt;span class="i"&gt;700&lt;/span&gt;, &lt;span class="i"&gt;260&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Image(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/public/images/d.jpg&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;540&lt;/span&gt;, &lt;span class="i"&gt;700&lt;/span&gt;, &lt;span class="i"&gt;260&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# write text &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    txt = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Agile Web Development&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;38&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetXY(&lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;600&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Cell(&lt;span class="i"&gt;800&lt;/span&gt;, &lt;span class="i"&gt;100&lt;/span&gt;, txt, &lt;span class="i"&gt;10&lt;/span&gt;, &lt;span class="i"&gt;1&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetTextColor(&lt;span class="i"&gt;10&lt;/span&gt;, &lt;span class="i"&gt;10&lt;/span&gt;, &lt;span class="i"&gt;10&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    txt = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;What is Ruby FPDF?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;30&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetXY(&lt;span class="i"&gt;20&lt;/span&gt;, &lt;span class="i"&gt;920&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Cell(&lt;span class="i"&gt;300&lt;/span&gt;, &lt;span class="i"&gt;30&lt;/span&gt;, txt, &lt;span class="i"&gt;10&lt;/span&gt;, &lt;span class="i"&gt;1&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    txt = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Ruby FPDF is a Ruby port of Olivier Plathey's excellent PDF generator, /&lt;tt&gt;
&lt;/tt&gt; FPDF. FPDF is written in PHP, &lt;tt&gt;
&lt;/tt&gt;and as such can only be used From PHP scripts. /&lt;tt&gt;
&lt;/tt&gt;Ruby FPDF, as the name suggests, is written in Ruby and /&lt;tt&gt;
&lt;/tt&gt;can be used From Ruby scripts.    Ruby FPDF was ported and is maintained by Brian Ollenberger. /&lt;tt&gt;
&lt;/tt&gt; If you need to contact me, see the contact link abovenYou can download Ruby FPDF below. /&lt;tt&gt;
&lt;/tt&gt; It is released under a permissive license, similar to that of FPDF. I only ask that you retain the /&lt;tt&gt;
&lt;/tt&gt; copyright notice at the top of the source file. You may make modifications to FPDF, but if you /&lt;tt&gt;
&lt;/tt&gt;redistribute those modifications, make it clear in a comment immediately before or after the /&lt;tt&gt;
&lt;/tt&gt; copyright notice that you have modified it. I also wouldn't mind if you sent patches back to me, /&lt;tt&gt;
&lt;/tt&gt; but you are not strictly required to do so.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;18&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetXY(&lt;span class="i"&gt;20&lt;/span&gt;, &lt;span class="i"&gt;960&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.MultiCell(&lt;span class="i"&gt;500&lt;/span&gt;, &lt;span class="i"&gt;20&lt;/span&gt;, txt) &lt;tt&gt;
&lt;/tt&gt;    txt = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;Ruby | On | Rails&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;24&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetXY(&lt;span class="i"&gt;540&lt;/span&gt;, &lt;span class="i"&gt;920&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Cell(&lt;span class="i"&gt;260&lt;/span&gt;, &lt;span class="i"&gt;30&lt;/span&gt;, txt, &lt;span class="i"&gt;10&lt;/span&gt;, &lt;span class="i"&gt;1&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;#draw rectangle &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    pdf.SetFillColor(&lt;span class="i"&gt;240&lt;/span&gt;, &lt;span class="i"&gt;240&lt;/span&gt;, &lt;span class="i"&gt;240&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Rect(&lt;span class="i"&gt;550&lt;/span&gt;, &lt;span class="i"&gt;960&lt;/span&gt;, &lt;span class="i"&gt;230&lt;/span&gt;, &lt;span class="i"&gt;300&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;#write text &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    txt = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;* Get Excitednn* Get Startedn* Get BetternnContactnnEnjoy Railsnenjoyrails@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;18&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetXY(&lt;span class="i"&gt;560&lt;/span&gt;, &lt;span class="i"&gt;970&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.MultiCell(&lt;span class="i"&gt;220&lt;/span&gt;, &lt;span class="i"&gt;36&lt;/span&gt;, txt) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFillColor(&lt;span class="i"&gt;170&lt;/span&gt;, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;1&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Rect(&lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;1310&lt;/span&gt;, &lt;span class="i"&gt;800&lt;/span&gt;, &lt;span class="i"&gt;70&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    txt = &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;View this page at http://devblog.rorcraft.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    pdf.SetTextColor(&lt;span class="i"&gt;255&lt;/span&gt;, &lt;span class="i"&gt;255&lt;/span&gt;, &lt;span class="i"&gt;255&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetFont(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Arial&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="i"&gt;28&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.SetXY(&lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;1330&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    pdf.Cell(&lt;span class="i"&gt;800&lt;/span&gt;, &lt;span class="i"&gt;24&lt;/span&gt;, txt, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="i"&gt;0&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;    send_data pdf.&lt;span class="co"&gt;Output&lt;/span&gt;, &lt;span class="sy"&gt;:filename&lt;/span&gt; =&amp;amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;hello_advance.pdf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:type&lt;/span&gt; =&amp;amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;application/pdf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://devblog.rorcraft.com/assets/2007/12/19/hello_advance-4.png" /&gt;&lt;/p&gt;


	&lt;p&gt;Reference：
1: &lt;a href="http://www.21andy.com/fpdf-manual/"&gt;fpdf manual&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;2: &lt;a href="http://wiki.rubyonrails.org/rails/pages/HowtoGeneratePDFs"&gt;How to Generate PDFs&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;3: &lt;a href="http://www.ruby-forum.com/topic/69929"&gt;&lt;span class="caps"&gt;PDF&lt;/span&gt;::Writer VS Ruby &lt;span class="caps"&gt;FPDF&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;4: &lt;a href="http://ruby-doc.org/stdlib/libdoc/iconv/rdoc/index.html"&gt;Iconv Rdoc&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;5: &lt;a href="http://zeropluszero.com/software/fpdf/"&gt;fpdf website&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:devblog.rorcraft.com,2007-12-05:15</id>
    <published>2007-12-05T06:12:00Z</published>
    <updated>2007-12-05T06:20:52Z</updated>
    <link href="http://devblog.rorcraft.com/2007/12/5/validating-datetime" rel="alternate" type="text/html" />
    <title>Validating datetime - MultiparameterAssignmentErrors</title>
<content type="html">
            &lt;p&gt;If you use the date_select, datetime_select helepers you’ll most likely see this error when the user submit an invalid date e.g. (Feb 30). Rails will raise MultiparameterAssignmentErrors.&lt;/p&gt;


	&lt;p&gt;The easiest way to fix this is by using this plugin for validates_datetime
&lt;a href="http://agilewebdevelopment.com/plugins/validates_date_time"&gt;http://agilewebdevelopment.com/plugins/validates_date_time&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;However I just found that it has a bug with datetime_select, where it parse the (day, hour, minute)  into (hour, minute, seconds).&lt;/p&gt;


Here is why:
on line 179 of validates_date_time.rb in the lib/ folder of the plugin.
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;extract_time_from_multiparameter_attributes&lt;/span&gt;(values)&lt;tt&gt;
&lt;/tt&gt;        values.last( &lt;span class="i"&gt;3&lt;/span&gt; ).map { |s| s.rjust(&lt;span class="i"&gt;2&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) }.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# change it to this, it'll fix the problem.&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;extract_time_from_multiparameter_attributes&lt;/span&gt;(values)&lt;tt&gt;
&lt;/tt&gt;        values.last( values.size &amp;gt; &lt;span class="i"&gt;5&lt;/span&gt; ? &lt;span class="i"&gt;3&lt;/span&gt; : &lt;span class="i"&gt;2&lt;/span&gt; ).map { |s| s.rjust(&lt;span class="i"&gt;2&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) }.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>RexChung</name>
    </author>
    <id>tag:devblog.rorcraft.com,2007-11-20:14</id>
    <published>2007-11-20T08:20:00Z</published>
    <updated>2007-11-20T08:34:28Z</updated>
    <link href="http://devblog.rorcraft.com/2007/11/20/optimising-your-search-results-with-ferret" rel="alternate" type="text/html" />
    <title>Optimising your search results with ferret</title>
<content type="html">
            &lt;p&gt;Acts_as_ferret is a great plugin for adding search capability to your active records. If you use the default setup, you might find that ferret does not return some expected results. For example, if you have an article:&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;article: &lt;tt&gt;
&lt;/tt&gt;  id: &lt;span class="i"&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  title: this is an article&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Article&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  acts_as_ferret( {&lt;span class="sy"&gt;:fields&lt;/span&gt; =&amp;gt; {&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="sy"&gt;:name&lt;/span&gt; =&amp;gt; {&lt;span class="sy"&gt;:boost&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;3&lt;/span&gt; },&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="sy"&gt;:published_at_for_sort&lt;/span&gt; =&amp;gt; {&lt;span class="sy"&gt;:index&lt;/span&gt; =&amp;gt; &lt;span class="sy"&gt;:untokenized_omit_norms&lt;/span&gt;, &lt;span class="sy"&gt;:term_vector&lt;/span&gt; =&amp;gt; &lt;span class="sy"&gt;:no&lt;/span&gt;} &lt;tt&gt;
&lt;/tt&gt;  }, &lt;span class="sy"&gt;:remote&lt;/span&gt; =&amp;gt; &lt;span class="co"&gt;AAF_REMOTE&lt;/span&gt;} )&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Article.find_by_contents(“article”)&lt;/p&gt;


	&lt;p&gt;return 1 result&lt;/p&gt;


	&lt;p&gt;Article.find_by_contents(“this is the article title”)&lt;/p&gt;


	&lt;p&gt;return 0 result&lt;/p&gt;


	&lt;h2&gt;How to solve this?&lt;/h2&gt;


	&lt;h2&gt;Omit Stopword&lt;/h2&gt;


	&lt;p&gt;The default analyser will remove common stop-words like “and”, “the”, “a” and “for”. 
You can create a new StandardAnalyzer that doesn’t remove those stopwords.&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Article&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  acts_as_ferret( {&lt;span class="sy"&gt;:fields&lt;/span&gt; =&amp;gt; {&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="sy"&gt;:name&lt;/span&gt; =&amp;gt; {&lt;span class="sy"&gt;:boost&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;3&lt;/span&gt; },&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="sy"&gt;:published_at_for_sort&lt;/span&gt; =&amp;gt; {&lt;span class="sy"&gt;:index&lt;/span&gt; =&amp;gt; &lt;span class="sy"&gt;:untokenized_omit_norms&lt;/span&gt;, &lt;span class="sy"&gt;:term_vector&lt;/span&gt; =&amp;gt; &lt;span class="sy"&gt;:no&lt;/span&gt;} &lt;tt&gt;
&lt;/tt&gt;  }, &lt;span class="sy"&gt;:remote&lt;/span&gt; =&amp;gt; &lt;span class="co"&gt;AAF_REMOTE&lt;/span&gt;} ,  {&lt;span class="sy"&gt;:analyzer&lt;/span&gt; =&amp;gt; &lt;span class="co"&gt;Ferret&lt;/span&gt;::&lt;span class="co"&gt;Analysis&lt;/span&gt;::&lt;span class="co"&gt;StandardAnalyzer&lt;/span&gt;.new([&lt;span class="pc"&gt;nil&lt;/span&gt;]) } )&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h2&gt;PerFieldAnalyzer&lt;/h2&gt;


	&lt;p&gt;Using the way above will include all the stopwords in every field, that is usually not what you want. What you need is to use PerFieldAnalyzer and only omit stopwords for title.&lt;/p&gt;


	&lt;p&gt;From the mailing list archive, there’s reported problem with the C version of PerFieldAnalayser.
“Thanks to Ben from omdb.org for tracking this down and creating this workaround. You can read more about the issue there: blog.omdb-beta.org/2007/7/29/tracking-down-a-memory-leak-in-ferret-0-11-4”&lt;/p&gt;


	&lt;p&gt;Save this file as per_field_analaysis.rb in /lib&lt;/p&gt;


	&lt;p&gt;http://pastie.caboo.se/83194&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Article&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActiveRecord&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  pfa = &lt;span class="co"&gt;PerFieldAnalyzer&lt;/span&gt;.new( &lt;span class="co"&gt;Ferret&lt;/span&gt;::&lt;span class="co"&gt;Analysis&lt;/span&gt;::&lt;span class="co"&gt;StandardAnalyzer&lt;/span&gt;.new )&lt;tt&gt;
&lt;/tt&gt;  pfa[&lt;span class="sy"&gt;:name&lt;/span&gt;] = &lt;span class="co"&gt;Ferret&lt;/span&gt;::&lt;span class="co"&gt;Analysis&lt;/span&gt;::&lt;span class="co"&gt;StandardAnalyzer&lt;/span&gt;.new([])&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  acts_as_ferret( {&lt;span class="sy"&gt;:fields&lt;/span&gt; =&amp;gt; {&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="sy"&gt;:name&lt;/span&gt; =&amp;gt; {&lt;span class="sy"&gt;:boost&lt;/span&gt; =&amp;gt; &lt;span class="i"&gt;3&lt;/span&gt; },&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="sy"&gt;:published_at_for_sort&lt;/span&gt; =&amp;gt; {&lt;span class="sy"&gt;:index&lt;/span&gt; =&amp;gt; &lt;span class="sy"&gt;:untokenized_omit_norms&lt;/span&gt;, &lt;span class="sy"&gt;:term_vector&lt;/span&gt; =&amp;gt; &lt;span class="sy"&gt;:no&lt;/span&gt;} &lt;tt&gt;
&lt;/tt&gt;  }, &lt;span class="sy"&gt;:remote&lt;/span&gt; =&amp;gt; &lt;span class="co"&gt;AAF_REMOTE&lt;/span&gt;} ,  {&lt;span class="sy"&gt;:analyzer&lt;/span&gt; =&amp;gt; pfa } )&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>devon</name>
    </author>
    <id>tag:devblog.rorcraft.com,2007-11-05:13</id>
    <published>2007-11-05T09:53:00Z</published>
    <updated>2007-11-05T10:07:55Z</updated>
    <link href="http://devblog.rorcraft.com/2007/11/5/nagios-4-notify-by-twitter" rel="alternate" type="text/html" />
    <title>Nagios 4: notify by twitter</title>
<content type="html">
            &lt;h3&gt;Install Net::Twitter (perl version)&lt;/h3&gt;


	&lt;p&gt;download from search.cpan.org&lt;/p&gt;


	&lt;p&gt;http://search.cpan.org/~cthom/Net-Twitter/&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;tar zxvf Net-Twitter-1.06.tar.gz&lt;tt&gt;
&lt;/tt&gt;cd Net-Twitter-1.06&lt;tt&gt;
&lt;/tt&gt;perl Makefile.PL&lt;tt&gt;
&lt;/tt&gt;make&lt;tt&gt;
&lt;/tt&gt;make test&lt;tt&gt;
&lt;/tt&gt;sudo make install&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Install other perl package if required（HTML-Tagset, libwww-perl, &lt;span class="caps"&gt;JSON&lt;/span&gt;-Any）&lt;/p&gt;


	&lt;p&gt;download them from &lt;a href="http://search.cpan.org/"&gt;http://search.cpan.org/&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The script for twitter notify( change the user_name and password for twitter )&lt;/p&gt;


	&lt;p&gt;vi /usr/local/nagios/libexec/twitter.pl&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;#!/usr/bin/perl -w&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;use strict;&lt;tt&gt;
&lt;/tt&gt;use Net::Twitter;&lt;tt&gt;
&lt;/tt&gt;my $msg = shift;&lt;tt&gt;
&lt;/tt&gt;my $twit = new Net::Twitter(username =&lt;span class="er"&gt;&amp;gt;&lt;/span&gt; &amp;quot;yourname&amp;quot;,password =&lt;span class="er"&gt;&amp;gt;&lt;/span&gt; &amp;quot;yourpass&amp;quot;);&lt;tt&gt;
&lt;/tt&gt;if (defined($msg) &lt;span class="er"&gt;&amp;amp;&lt;/span&gt;&lt;span class="er"&gt;&amp;amp;&lt;/span&gt; $msg !~ /^\s*$/) {&lt;tt&gt;
&lt;/tt&gt;  $twit-&lt;span class="er"&gt;&amp;gt;&lt;/span&gt;update($msg);&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;sudo chown nagios:nagios twitter.pl&lt;/p&gt;


	&lt;p&gt;sudo chmod +x twitter.pl&lt;/p&gt;


	&lt;p&gt;send the test message to twitter&lt;/p&gt;


	&lt;p&gt;/usr/local/nagios/libexec/twitter.pl ‘hello world’&lt;/p&gt;


	&lt;p&gt;Add new command for notify in nagios&lt;/p&gt;


sudo vi /usr/local/nagios/etc/objects/commands.cfg
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;define command {&lt;tt&gt;
&lt;/tt&gt;        command_name notify-by-twitter&lt;tt&gt;
&lt;/tt&gt;        command_line /usr/local/nagios/libexec/twitter.pl &amp;quot;$NOTIFICATIONTYPE$ -$HOSTNAME$-$SERVICEDESC$ - $SERVICESTATE$ - $SERVICEOUTPUT$&amp;quot;&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Then in the contacts.cfg, use this:&lt;/p&gt;


	&lt;p&gt;service_notification_commands   notify-by-twitter&lt;/p&gt;


	&lt;p&gt;Reference: &lt;a href="http://configfun.com/blog/2007/03/26/twitter-as-nagios-notification-gateway/"&gt; Twitter as Nagios notification gateway&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://devblog.rorcraft.com/">
    <author>
      <name>devon</name>
    </author>
    <id>tag:devblog.rorcraft.com,2007-11-05:12</id>
    <published>2007-11-05T09:39:00Z</published>
    <updated>2007-11-05T09:50:56Z</updated>
    <link href="http://devblog.rorcraft.com/2007/11/5/nagios-3-install-nrpe" rel="alternate" type="text/html" />
    <title>Nagios 3: Install nrpe</title>
<content type="html">
            &lt;blockquote&gt;
		&lt;p&gt;“NRPE: Nagios Remote Plugin Executor allows you to execute local plugins on remote hosts.”&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;h3&gt;1, Add user and group named ‘nagios’&lt;/h3&gt;


	&lt;p&gt;/usr/sbin/useradd nagios&lt;/p&gt;


	&lt;p&gt;passwd nagios&lt;/p&gt;


	&lt;h3&gt;2, compile nagios-plugin&lt;/h3&gt;


download: http://sourceforge.net/project/showfiles.php?group_id=29880
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;tar zxvf nagios-pluginxxx.tar.gz&lt;tt&gt;
&lt;/tt&gt;cd nagios-plugin&lt;tt&gt;
&lt;/tt&gt;./configure&lt;tt&gt;
&lt;/tt&gt;make&lt;tt&gt;
&lt;/tt&gt;make install&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;chown nagios:nagios /usr/local/nagios&lt;tt&gt;
&lt;/tt&gt;chown -R nagios:nagios /usr/local/nagios/libexec&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h3&gt;3, compile nrpe&lt;/h3&gt;


download: http://sourceforge.net/project/showfiles.php?group_id=26589
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;tar zxvf  nrpexxx.tar.gz&lt;tt&gt;
&lt;/tt&gt;cd nrpe&lt;tt&gt;
&lt;/tt&gt;./configure&lt;tt&gt;
&lt;/tt&gt;make all&lt;tt&gt;
&lt;/tt&gt;sudo make install-plugin&lt;tt&gt;
&lt;/tt&gt;sudo make install-daemon&lt;tt&gt;
&lt;/tt&gt;sudo make install-daemon-config&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h3&gt;4, Start nrpe&lt;/h3&gt;


	&lt;p&gt;vi /usr/local/nagios/etc/nrpe.cfg&lt;/p&gt;


	&lt;p&gt;allowed_hosts=127.0.0.1,123.12.1.2&lt;/p&gt;


	&lt;p&gt;123.12.1.2 is your nagios server address&lt;/p&gt;


	&lt;p&gt;start nagios:&lt;/p&gt;


	&lt;p&gt;/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d&lt;/p&gt;


	&lt;p&gt;Check the nrpe on nagios server&lt;/p&gt;


	&lt;p&gt;/usr/local/nagios/libexec/check_nrpe -H 123.12.1.5&lt;/p&gt;


	&lt;p&gt;123.12.1.5 is the ip adress of the nrpe deamon(the remote pc)&lt;/p&gt;


	&lt;p&gt;You should see something like:&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;NRPE&lt;/span&gt; v2.9&lt;/p&gt;


	&lt;p&gt;Congratulate! your nrpe works now.&lt;/p&gt;
          </content>  </entry>
</feed>
