<?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">
  <id>tag:www.rorcraft.com,2008:/posts</id>
  <link type="text/html" href="http://www.rorcraft.com/posts" rel="alternate" />
  
  <title>Rorcraft Blog</title>
  <updated>2009-10-27T07:28:48Z</updated>
  <generator uri="http://enkiblog.com">Enki</generator>
  <author>
    <name>RoRCraft Limited</name>
    <email>rex@rorcraft.com</email>
  </author>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/rorcraft_devblog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rorcraft_devblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <id>tag:www.rorcraft.com,2008:Post/373</id>
    <published>2009-04-13T05:30:29Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2009/04/13/ruby-url-safe-base62-string-like-youtube" rel="alternate" />
    <title>Ruby URL safe base62 string like youtube</title>
    <content type="html">&lt;p&gt;http://ronny.haryan.to/archives/2009/04/07/build-your-own-url-shortening-service/#more-191&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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;15&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;25&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;35&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;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;BaseCodec&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.base_n_decode(s, alphabets)&lt;tt&gt;
&lt;/tt&gt;    n = alphabets.length&lt;tt&gt;
&lt;/tt&gt;    rv = pos = &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    charlist = s.split(&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;).reverse&lt;tt&gt;
&lt;/tt&gt;    charlist.each &lt;span class="r"&gt;do&lt;/span&gt; |char|&lt;tt&gt;
&lt;/tt&gt;      rv += alphabets.index(char) * n ** pos&lt;tt&gt;
&lt;/tt&gt;      pos += &lt;span class="i"&gt;1&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;return&lt;/span&gt; rv&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="pc"&gt;self&lt;/span&gt;.base_n_encode(num, alphabets)&lt;tt&gt;
&lt;/tt&gt;    n = alphabets.length&lt;tt&gt;
&lt;/tt&gt;    rv = &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;    &lt;span class="r"&gt;while&lt;/span&gt; num != &lt;span class="i"&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      rv = alphabets[num % n, &lt;span class="i"&gt;1&lt;/span&gt;] + rv&lt;tt&gt;
&lt;/tt&gt;      num /= n&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;return&lt;/span&gt; rv&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;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Base62&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;BaseCodec&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="co"&gt;ALPHABETS&lt;/span&gt; = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&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;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.decode(s)&lt;tt&gt;
&lt;/tt&gt;    base_n_decode(s, &lt;span class="co"&gt;ALPHABETS&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;def&lt;/span&gt; &lt;span class="pc"&gt;self&lt;/span&gt;.encode(s)&lt;tt&gt;
&lt;/tt&gt;    base_n_encode(s, &lt;span class="co"&gt;ALPHABETS&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;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/376</id>
    <published>2009-04-07T04:00:00Z</published>
    <updated>2009-10-26T14:39:23Z</updated>
    <link type="text/html" href="http://rorcraft.com/2009/04/07/cloud-computing-presentation-hong-kong-institute-of-vocational-education" rel="alternate" />
    <title>Cloud Computing Presentation- Hong Kong Institute of Vocational Education</title>
    <content type="html">&lt;p&gt;Hello Everyone,&lt;/p&gt;
&lt;p&gt;My name is YinPeng, and I have been with the Ankoder/RoRCraft team since February this year. It has been a few months since arriving here, and already I have a taste of how a start-up company really works, instead of studying books and listening to University Professors.&lt;/p&gt;
&lt;p&gt;Let me update you on what has been happening in the last few weeks. Besides the fact that I am learning many new things, like branch related terms, we are working hard to improve the functions and the website in order to be able to meet the needs of our customers. Since the competition in the &lt;a href="http://www.ankoder.com"title="Video Encoder"  onclick="javascript:urchinTracker ('/outbound/article/www.ankoder.com');"&gt;video encoding&lt;/a&gt; world is growing with the popularity of online video, more and more new competitors arise in this industry each day.&lt;/p&gt;
&lt;p&gt;Last week, Rex Chung- founder of RoRCraft and Ankoder, went to the &lt;a href="http://www.vtc.edu.hk/vtc/web/template/institute_desc_list.jsp?fldr_id=438&amp;#038;lang=en"title="Hong Kong Institute of Vocational Education" target="_blank"  onclick="javascript:urchinTracker ('/outbound/article/www.vtc.edu.hk');"&gt;Hong Kong Institute of Vocational Education&lt;/a&gt; in TsingYi to talk about &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"title="Cloud Computing Wikipedia"  onclick="javascript:urchinTracker ('/outbound/article/en.wikipedia.org');"&gt;Cloud Computing&lt;/a&gt; and Online Video to the computing students present. The students were very enthusiastic about this subject, and asked a lot questions regarding the presentation. Given the nature of the students that attended, it is safe to say that there are going to be very skilled and motivated Internet skilled workers in the coming future.  On behalf of Rex and all of us here at RoRCraft, we would like to thank the Hong Kong Institute of Vocational Education for allowing the privelidge of presenting on such a new and upcoming topic.&lt;/p&gt;
&lt;p&gt;The slide content of the presentation is posted below.&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="Rex Chung - Rorcraft - Cloud Computing" src="http://farm4.static.flickr.com/3347/3408193117_259174b6e9_d.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;code&gt;&amp;lt;br /&amp;gt;
&lt;/code&gt;&lt;/p&gt;
&lt;div style="width: 425px; text-align: left" id="__ss_1184365"&gt;&lt;a href="http://www.slideshare.net/rorcraft/cloud-computing-online-video?type=powerpoint"style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline" title="Cloud Computing Online Video"  onclick="javascript:urchinTracker ('/outbound/article/www.slideshare.net');"&gt;Cloud Computing Online Video&lt;/a&gt;&lt;object height="355" width="425" style="margin: 0px"&gt;&lt;/p&gt;
&lt;p&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=cloudcomputingonlinevideo-090323084541-phpapp02&amp;#038;stripped_title=cloud-computing-online-video" /&gt;&lt;br /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;&lt;br /&gt;
&lt;param name="allowScriptAccess" value="always" /&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;
&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px"&gt;View more &lt;a href="http://www.slideshare.net/"style="text-decoration: underline"  onclick="javascript:urchinTracker ('/outbound/article/www.slideshare.net');"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/rorcraft"style="text-decoration: underline"  onclick="javascript:urchinTracker ('/outbound/article/www.slideshare.net');"&gt;Rex Chung&lt;/a&gt;.&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/364</id>
    <published>2009-04-03T02:42:06Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2009/04/03/port-install-ffmpeg-updated" rel="alternate" />
    <title>Port install FFmpeg updated.</title>
    <content type="html">&lt;p&gt;cd /opt/local/var/macports/sources/rsync.macports.org/release/ports/multimedia/ffmpeg&lt;/p&gt;
&lt;p&gt;vi PortFile&lt;/p&gt;
&lt;p&gt;7 configure.cflags-append    &lt;del&gt;DHAVE_LRINTF ${configure.cppflags}&lt;br /&gt;
 78 configure.args \&lt;br /&gt;
 79         &amp;#8212;disable-vhook \&lt;br /&gt;
 80         &amp;#8212;enable-gpl \&lt;br /&gt;
 81         &amp;#8212;enable-postproc \&lt;br /&gt;
 82         &amp;#8212;enable-swscale &amp;#8212;enable-avfilter &amp;#8212;enable-avfilter-lavf \&lt;br /&gt;
 83         &amp;#8212;enable-libmp3lame \&lt;br /&gt;
 84         &amp;#8212;enable-libvorbis \&lt;br /&gt;
 85         &amp;#8212;enable-libtheora \&lt;br /&gt;
 86         &amp;#8212;enable-libdirac &amp;#8212;enable-libschroedinger \&lt;br /&gt;
 87         &amp;#8212;enable-libfaac \&lt;br /&gt;
 88         &amp;#8212;enable-libfaad \&lt;br /&gt;
 89         &amp;#8212;enable-libxvid \&lt;br /&gt;
 90         &amp;#8212;enable-libx264 \&lt;br /&gt;
 91         &amp;#8212;mandir=${prefix}/share/man \&lt;br /&gt;
 92         &amp;#8212;enable-pthreads \&lt;br /&gt;
 93         &amp;#8212;enable-nonfree \                                                                                      &lt;br /&gt;
 94         &amp;#8212;enable-libamr-nb  &amp;#8212;enable-libamr-wb \&lt;br /&gt;
 95         &amp;#8212;cc=gcc-4.0&lt;br /&gt;
 96         #&lt;/del&gt;-disable-mmx \&lt;/p&gt;
&lt;p&gt;http://www.penguin.cz/~utx/amr&lt;br /&gt;
get libamrnb and libamrwb&lt;/p&gt;
&lt;p&gt;downgrading lame to 3.97&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/375</id>
    <published>2009-03-21T04:00:00Z</published>
    <updated>2009-10-26T14:38:10Z</updated>
    <link type="text/html" href="http://rorcraft.com/2009/03/21/quick-update-rorcraft-hong-kong-office-in-science-park" rel="alternate" />
    <title>Quick Update Rorcraft Hong Kong Office in Science Park</title>
    <content type="html">&lt;p&gt;We&amp;#8217;ve been quiet here for a while, which means we&amp;#8217;ve been very busy.&lt;/p&gt;
&lt;p&gt;We moved into our new HK office at the Science Park late 08.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve been working on some large projects since then, and we&amp;#8217;re also working hard on &lt;a href="http://www.ankoder.com" onclick="javascript:urchinTracker ('/outbound/article/www.ankoder.com');"&gt;Ankoder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s some photos from our new office.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3427/3222125486_b8dac0de8e.jpg?v=0" /&gt; &lt;img src="http://farm4.static.flickr.com/3304/3221275087_a431be333f.jpg?v=0" /&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/200</id>
    <published>2008-11-04T06:27:00Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/11/04/quick-guide-to-amazon-ebs" rel="alternate" />
    <title>Quick guide to Amazon EBS</title>
    <content type="html">&lt;p&gt;We&amp;#8217;ve switched to use &lt;a href="http://aws.amazon.com/ebs/"&gt;Amazon &lt;acronym title="Elastic Block Storage"&gt;&lt;span class="caps"&gt;EBS&lt;/span&gt;&lt;/acronym&gt;&lt;/a&gt; for a few months now. Therefore, we have been able to have a good night&amp;#8217;s sleep without worrying our database disappearing. Here&amp;#8217;s a quick guide.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
It&amp;#8217;s very easy to use &lt;span class="caps"&gt;EBS&lt;/span&gt; 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&amp;#8217;t find &lt;span class="caps"&gt;EBS&lt;/span&gt; related tools in its old version). Here&amp;#8217;s my ec2-api-tools info (yours don&amp;#8217;t need to be exactly same with me):&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&amp;#8212;- ruby $ ec2ver&lt;br /&gt;
1.3-24159 2008-05-05&lt;br /&gt;
&amp;#8212;- &lt;br /&gt;&lt;br /&gt;
EC2 instance can only use &lt;span class="caps"&gt;EBS&lt;/span&gt; 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;br /&gt;&lt;br /&gt;
&lt;blockquote&gt;$ ec2din&lt;br /&gt;&lt;br /&gt;
&amp;#8230;&lt;br /&gt;&lt;br /&gt;
&lt;span class="caps"&gt;INSTANCE&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i-abc12345 &amp;nbsp;&amp;nbsp; ami-abc12345 &amp;nbsp;&amp;nbsp; ec2-&amp;#8230;compute-1.amazonaws.com&amp;nbsp;&amp;nbsp;&amp;nbsp; ip-&amp;#8230;.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;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&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;br /&gt;&lt;br /&gt;
&amp;#8212;- ruby$ ec2-create-volume &amp;#8212;size 200 -z&amp;nbsp; us-east-1b&lt;br /&gt;
&lt;span class="caps"&gt;VOLUME&lt;/span&gt; vol-4d826724 200 creating   2008-10-14T00:00:00+0000&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;tt&gt;
&lt;/tt&gt;You can check the block by&amp;lt;br /&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;br /&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;--- ruby$ ec2-describe-volumes vol-4d826724&lt;tt&gt;
&lt;/tt&gt;VOLUME vol-4d826724 200 available 2008-10-14T00:00:00+0000&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The block now is created. It&amp;#8217;s like we have bought a 200G harddisk from amazon, now let&amp;#8217;s install it on our ec2 instance:&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8212;- ruby$ ec2-attach-volume vol-4d826724 -i i-6058a509 -d /dev/sdh&lt;br /&gt;
&lt;span class="caps"&gt;ATTACHMENT&lt;/span&gt; vol-4d826724 i-6058a509 /dev/sdh attaching 2008-10-14T00:15:00+0000&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;tt&gt;
&lt;/tt&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,&amp;lt;br /&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;br /&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;--- ruby$ mkreiserfs /dev/sdh #this will format it with reiserfs&lt;tt&gt;
&lt;/tt&gt;$ mkdir /mnt/data&lt;tt&gt;
&lt;/tt&gt;$ mount /dev/sdh /mnt/data #mount the block to /mnt/data, now all data write to /mnt/data dir will be &lt;tt&gt;
&lt;/tt&gt;# persistent on the block storage vol-4d826724. it won't lost after you reboot the machine&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Some other useful tools are:&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
ec2-describe-volumes: used to find the relationships between your blocks and instances&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;ec2-detach-volume: detach a block from instance&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1667&amp;amp;ref=featured"&gt;Here&amp;#8217;s a full manual of &lt;span class="caps"&gt;EBS&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/128</id>
    <published>2008-08-29T08:09:00Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/08/29/download-youtube-videos-with-ruby" rel="alternate" />
    <title>Download youtube videos with ruby</title>
    <content type="html">&lt;p&gt;As you might know, we&amp;#8217;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 class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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;15&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&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="idl"&gt;#{&lt;/span&gt;youtube&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;video_id&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;youtube&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$2&lt;/span&gt;&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;&lt;span class="gv"&gt;$4&lt;/span&gt;&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;file_name&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;USER_AGENT&lt;/span&gt;&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;parse_youtube(url)&lt;span class="idl"&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;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/120</id>
    <published>2008-08-25T07:17:00Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/08/25/uploading-large-files-to-rails-with-merb" rel="alternate" />
    <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&amp;#8217;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;p&gt;&amp;#8212;- rubysudo gem install merb&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;Second, create a merb app in your rails dir:&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;--- ruby&lt;tt&gt;
&lt;/tt&gt;    merb-gen app uploader&lt;tt&gt;
&lt;/tt&gt;    cd uploader&lt;tt&gt;
&lt;/tt&gt;&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. &lt;br /&gt;
Currently there&amp;#8217;s only one line in the file:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&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;tt&gt;
&lt;/tt&gt;&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. &lt;br /&gt;
Let us change this file to:&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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;15&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;25&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;35&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;45&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&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="idl"&gt;#{&lt;/span&gt;url&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;params&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;curl_cmd&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;k&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;kk&lt;span class="idl"&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="idl"&gt;#{&lt;/span&gt;k&lt;span class="idl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;=&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="idl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;CGI&lt;/span&gt;.escape v.to_s&lt;span class="idl"&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;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Run merb  by &lt;br /&gt;
&lt;macro:code&gt;&lt;br /&gt;
merb &lt;del&gt;p 1234 -c 1 -e production -d&lt;br /&gt;
-&lt;/del&gt;-&lt;/p&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&amp;#8217;t it?&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/374</id>
    <published>2008-08-21T04:00:00Z</published>
    <updated>2009-10-26T14:36:10Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/08/21/ankoder-net-download-youtube-videos-straight-to-your-ipods" rel="alternate" />
    <title>Ankoder.net - download youtube videos straight to your ipods</title>
    <content type="html">	&lt;p&gt;We released &lt;a href="http://free.ankoder.com" onclick="javascript:urchinTracker ('/outbound/article/free.ankoder.com');"&gt;http://free.ankoder.com&lt;/a&gt; a couple of months ago, there&amp;#8217;s been a steady growth. Many users wanted to download the videos straight to their ipods, and now we&amp;#8217;ve done it. We&amp;#8217;ve relaunched the site as &lt;a href="http://www.ankoder.net" onclick="javascript:urchinTracker ('/outbound/article/www.ankoder.net');"&gt;htt://www.ankoder.net&lt;/a&gt; and we&amp;#8217;ve given a it a long dued face lift as well.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20080821-xy4tysx9q6xbaudksxfyjdpcm5.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;First, &lt;a href="http://www.ankoder.net/signup"target="_blank"  onclick="javascript:urchinTracker ('/outbound/article/www.ankoder.net');"&gt;sign up for an account on Ankoder.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once logged in, goto &amp;#8220;My Videos&amp;#8221; and copy the podcast link.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20080821-q3hxqrd6cf3sr8df7q51jrcg6g.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Now goto iTunes &amp;gt; Advanced &amp;gt; Subscribe to podcast.  Paste that podcast link and click &amp;#8216;OK&amp;#8217;.&lt;br /&gt;&lt;br /&gt;
&lt;img src="http://img.skitch.com/20080821-kprq73kuap9j3fqstd4pjmx9g3.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20080821-nkp8r8hf44n3f6y4tg2ghe4gu9.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Now you can start downloading by inputting the youtube link and select &amp;#8220;ipod&amp;#8221;.&lt;br /&gt;&lt;br /&gt;
Then click &amp;#8220;Download&amp;#8221;.&lt;br /&gt;&lt;br /&gt;
The videos will be downloaded to your iTune and sync with your ipod or iphones automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20080821-jrgxk9ca4kmk9576wr7kp4m23e.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;img src="http://img.skitch.com/20080821-ra5myd8w4ttuqi9rycsq3q2yag.jpg" /&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/99</id>
    <published>2008-08-13T08:33:00Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/08/13/the-facebook-autocomplete-address-to-field" rel="alternate" />
    <title>The Facebook autocomplete address to: field.</title>
    <content type="html">&lt;p&gt;We&amp;#8217;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&amp;#8217;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;p&gt;&lt;img src="http://devblog.rorcraft.com/assets/2008/8/13/autocomplete.advancedlocal.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Concepts&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;json &amp;#8211; array of contacts with names and email address and any other fields you wish to search&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;The input box changes size dynamically and reposition itself according to the keystrokes&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;Each &amp;#8216;token&amp;#8217; created is an input field, submitting the id of the user or an email address&lt;/li&gt;&lt;/p&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" target="_blank"&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 style="overflow:auto"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;span class="kw"&gt;new&lt;/span&gt; Autocompleter.LocalAdvanced(id_of_text_field, id_of_div_to_populate, json_array, options)&lt;tt&gt;
&lt;/tt&gt;&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;&amp;#8220;name&amp;#8221;&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;&lt;span class="caps"&gt;HTML&lt;/span&gt;&lt;/h3&gt;
&lt;div style="overflow:auto"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&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;tt&gt;
&lt;/tt&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 style="overflow:auto"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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;15&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;               (&lt;span class="kw"&gt;new&lt;/span&gt; Image()).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;                        (&lt;span class="kw"&gt;new&lt;/span&gt; Image()).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;                        (&lt;span class="kw"&gt;new&lt;/span&gt; Image()).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;                        (&lt;span class="kw"&gt;new&lt;/span&gt; Image()).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="kw"&gt;var&lt;/span&gt; contacts = [&lt;tt&gt;
&lt;/tt&gt;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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;                        {&lt;span class="ke"&gt;name&lt;/span&gt;:&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;,&lt;span class="ke"&gt;email&lt;/span&gt;:&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="kw"&gt;var&lt;/span&gt; typeahead = &lt;span class="kw"&gt;new&lt;/span&gt; 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;                            &lt;span class="ke"&gt;frequency&lt;/span&gt;: &lt;span class="fl"&gt;0.1&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;                            &lt;span class="ke"&gt;updateElement&lt;/span&gt;: addContactToList,&lt;tt&gt;
&lt;/tt&gt;                            &lt;span class="ke"&gt;search_field&lt;/span&gt;: &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="kw"&gt;var&lt;/span&gt; hidden_input = &lt;span class="kw"&gt;new&lt;/span&gt; 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;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;h3&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt;&lt;/h3&gt;
&lt;div style="overflow:auto"&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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;15&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;25&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;35&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;45&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;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;/*&lt;/span&gt; &lt;span class="c"&gt;autcompleter.advancedlocal&lt;/span&gt; &lt;span class="c"&gt;css&lt;/span&gt; &lt;span class="c"&gt;*/&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt;{&lt;span class="ke"&gt;min-height&lt;/span&gt;:&lt;span class="fl"&gt;5px&lt;/span&gt;;&lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="fl"&gt;3px&lt;/span&gt; &lt;span class="fl"&gt;3px&lt;/span&gt;;&lt;span class="ke"&gt;width&lt;/span&gt;:&lt;span class="fl"&gt;100%&lt;/span&gt;;&lt;span class="ke"&gt;background&lt;/span&gt;:&lt;span class="cr"&gt;#fff&lt;/span&gt;;&lt;span class="ke"&gt;font-size&lt;/span&gt;:&lt;span class="fl"&gt;11px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer_locked&lt;/span&gt;{&lt;span class="ke"&gt;background&lt;/span&gt;:&lt;span class="cr"&gt;#f4f4f4&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="kw"&gt;*&lt;/span&gt;{&lt;span class="ke"&gt;cursor&lt;/span&gt;:&lt;span class="vl"&gt;text&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="kw"&gt;input&lt;/span&gt;{&lt;span class="ke"&gt;width&lt;/span&gt;:&lt;span class="fl"&gt;100%&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_input&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;{&lt;span class="ke"&gt;float&lt;/span&gt;:&lt;span class="vl"&gt;left&lt;/span&gt;;&lt;span class="ke"&gt;margin-right&lt;/span&gt;:&lt;span class="fl"&gt;3px&lt;/span&gt;;&lt;span class="ke"&gt;margin-top&lt;/span&gt;:&lt;span class="fl"&gt;3px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tab_stop&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_stretcher&lt;/span&gt;{&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;block&lt;/span&gt;;&lt;span class="ke"&gt;float&lt;/span&gt;:&lt;span class="vl"&gt;left&lt;/span&gt;;&lt;span class="ke"&gt;overflow&lt;/span&gt;:&lt;span class="vl"&gt;hidden&lt;/span&gt;;&lt;span class="ke"&gt;width&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tab_stop&lt;/span&gt;{&lt;span class="ke"&gt;height&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_stretcher&lt;/span&gt;{&lt;span class="ke"&gt;padding-top&lt;/span&gt;:&lt;span class="fl"&gt;7px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;#autocomplete_input&lt;/span&gt;{&lt;span class="ke"&gt;width&lt;/span&gt;:&lt;span class="fl"&gt;20px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;#facebook&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tab_stop&lt;/span&gt; &lt;span class="kw"&gt;input&lt;/span&gt;{&lt;span class="ke"&gt;border&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="vl"&gt;solid&lt;/span&gt; &lt;span class="vl"&gt;black&lt;/span&gt;;&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;inline&lt;/span&gt;;&lt;span class="ke"&gt;position&lt;/span&gt;:&lt;span class="vl"&gt;relative&lt;/span&gt;;&lt;span class="ke"&gt;left&lt;/span&gt;:&lt;span class="fl"&gt;-500px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;#facebook&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_input_borderless&lt;/span&gt; {&lt;span class="ke"&gt;left&lt;/span&gt;:&lt;span class="fl"&gt;4px&lt;/span&gt;;&lt;span class="ke"&gt;margin-left&lt;/span&gt;:&lt;span class="fl"&gt;-1px&lt;/span&gt;;&lt;span class="ke"&gt;overflow&lt;/span&gt;:&lt;span class="vl"&gt;hidden&lt;/span&gt;;&lt;span class="ke"&gt;position&lt;/span&gt;:&lt;span class="vl"&gt;relative&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;#facebook&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_input_borderless&lt;/span&gt;  &lt;span class="co"&gt;#autocomplete_input&lt;/span&gt;{&lt;span class="ke"&gt;border&lt;/span&gt;:&lt;span class="fl"&gt;3px&lt;/span&gt; &lt;span class="vl"&gt;solid&lt;/span&gt; &lt;span class="vl"&gt;white&lt;/span&gt;&lt;span class="im"&gt;!important&lt;/span&gt;;&lt;span class="ke"&gt;border-left&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;block&lt;/span&gt;;&lt;span class="ke"&gt;margin&lt;/span&gt;:&lt;span class="fl"&gt;-3px&lt;/span&gt; &lt;span class="fl"&gt;3px&lt;/span&gt; &lt;span class="fl"&gt;-4px&lt;/span&gt; &lt;span class="fl"&gt;-2px&lt;/span&gt;;&lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;&lt;span class="im"&gt;!important&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;/*&lt;/span&gt;&lt;span class="c"&gt;IE6-/Win&lt;/span&gt; &lt;span class="c"&gt;only&lt;/span&gt;&lt;span class="c"&gt;*/&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;/*&lt;/span&gt;&lt;span class="c"&gt;\&lt;/span&gt;&lt;span class="c"&gt;*/&lt;/span&gt; &lt;span class="kw"&gt;*&lt;/span&gt; &lt;span class="kw"&gt;html&lt;/span&gt;&lt;span class="co"&gt;#facebook&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_input_borderless&lt;/span&gt; &lt;span class="co"&gt;#autocomplete_input&lt;/span&gt; { &lt;span class="ke"&gt;border&lt;/span&gt;:&lt;span class="fl"&gt;3px&lt;/span&gt; &lt;span class="vl"&gt;solid&lt;/span&gt; &lt;span class="vl"&gt;black&lt;/span&gt;;&lt;span class="ke"&gt;margin&lt;/span&gt;: &lt;span class="fl"&gt;-3px&lt;/span&gt; &lt;span class="fl"&gt;3px&lt;/span&gt; &lt;span class="fl"&gt;-4px&lt;/span&gt; &lt;span class="fl"&gt;14px&lt;/span&gt;:&lt;span class="vl"&gt;padding-left&lt;/span&gt;:&lt;span class="fl"&gt;10px&lt;/span&gt;; } &lt;span class="c"&gt;/*&lt;/span&gt;&lt;span class="c"&gt;*/&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="ps"&gt;:-moz-first-node&lt;/span&gt;{&lt;span class="ke"&gt;padding-top&lt;/span&gt;:&lt;span class="fl"&gt;1px&lt;/span&gt;&lt;span class="im"&gt;!important&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer_input&lt;/span&gt;{&lt;span class="ke"&gt;max-width&lt;/span&gt;:&lt;span class="fl"&gt;450px&lt;/span&gt;;&lt;span class="ke"&gt;overflow&lt;/span&gt;:&lt;span class="vl"&gt;hidden&lt;/span&gt;;&lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;1px&lt;/span&gt; &lt;span class="fl"&gt;0px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="co"&gt;#facebook&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_input&lt;/span&gt; &lt;span class="kw"&gt;input&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer_input_shadow&lt;/span&gt;{&lt;span class="ke"&gt;border&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="vl"&gt;solid&lt;/span&gt; &lt;span class="vl"&gt;black&lt;/span&gt;;&lt;span class="ke"&gt;outline&lt;/span&gt;:&lt;span class="fl"&gt;0&lt;/span&gt;;&lt;span class="ke"&gt;font-family&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;lucida grande&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="vl"&gt;tahoma&lt;/span&gt;, &lt;span class="vl"&gt;verdana&lt;/span&gt;, &lt;span class="vl"&gt;arial&lt;/span&gt;, &lt;span class="vl"&gt;sans-serif&lt;/span&gt;;&lt;span class="ke"&gt;font-size&lt;/span&gt;:&lt;span class="fl"&gt;11px&lt;/span&gt;;&lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="fl"&gt;5px&lt;/span&gt;;&lt;span class="ke"&gt;margin&lt;/span&gt;:&lt;span class="fl"&gt;0&lt;/span&gt; &lt;span class="fl"&gt;0&lt;/span&gt; &lt;span class="fl"&gt;-1px&lt;/span&gt; &lt;span class="fl"&gt;0&lt;/span&gt;;&lt;span class="ke"&gt;white-space&lt;/span&gt;:&lt;span class="vl"&gt;pre&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer_input_shadow&lt;/span&gt;{&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;inline&lt;/span&gt;;&lt;span class="ke"&gt;left&lt;/span&gt;:&lt;span class="fl"&gt;-10000px&lt;/span&gt;;&lt;span class="ke"&gt;position&lt;/span&gt;:&lt;span class="vl"&gt;absolute&lt;/span&gt;;&lt;span class="ke"&gt;top&lt;/span&gt;:&lt;span class="fl"&gt;-10000px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.tokenizer_input_shadow&lt;/span&gt;{&lt;span class="ke"&gt;height&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;block&lt;/span&gt;;&lt;span class="ke"&gt;left&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;&lt;span class="ke"&gt;overflow&lt;/span&gt;:&lt;span class="vl"&gt;hidden&lt;/span&gt;;&lt;span class="ke"&gt;position&lt;/span&gt;:&lt;span class="vl"&gt;relative&lt;/span&gt;;&lt;span class="ke"&gt;top&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;url(&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;span class="ke"&gt;background-repeat&lt;/span&gt;:&lt;span class="vl"&gt;no-repeat&lt;/span&gt;;&lt;span class="ke"&gt;color&lt;/span&gt;:&lt;span class="vl"&gt;black&lt;/span&gt;;&lt;span class="ke"&gt;white-space&lt;/span&gt;:&lt;span class="vl"&gt;nowrap&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;url(&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;span class="ke"&gt;background-position&lt;/span&gt;:&lt;span class="vl"&gt;top&lt;/span&gt; &lt;span class="vl"&gt;right&lt;/span&gt;;&lt;span class="ke"&gt;background-repeat&lt;/span&gt;:&lt;span class="vl"&gt;no-repeat&lt;/span&gt;;&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;block&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-position&lt;/span&gt;:&lt;span class="vl"&gt;bottom&lt;/span&gt; &lt;span class="vl"&gt;right&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-position&lt;/span&gt;:&lt;span class="vl"&gt;bottom&lt;/span&gt; &lt;span class="vl"&gt;left&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;&lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;2px&lt;/span&gt; &lt;span class="fl"&gt;3px&lt;/span&gt; &lt;span class="fl"&gt;2px&lt;/span&gt; &lt;span class="fl"&gt;5px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer_locked&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;padding-right&lt;/span&gt;:&lt;span class="fl"&gt;5px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;html&lt;/span&gt; &lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer_locked&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;html&lt;/span&gt; &lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer_locked&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;url(&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;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;url(&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;span class="ke"&gt;text-decoration&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token_selected&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token_selected&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token_selected&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token_selected&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;url(&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;span class="ke"&gt;color&lt;/span&gt;:&lt;span class="vl"&gt;white&lt;/span&gt;;&lt;span class="ke"&gt;text-decoration&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;&lt;span class="cl"&gt;.x&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;&lt;span class="cl"&gt;.x_hover&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;&lt;span class="cl"&gt;.x&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt;&lt;span class="ps"&gt;:hover&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;&lt;span class="cl"&gt;.x_hover&lt;/span&gt;{&lt;span class="ke"&gt;background-image&lt;/span&gt;:&lt;span class="s"&gt;&lt;span class="dl"&gt;url(&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;span class="ke"&gt;background-position&lt;/span&gt;:&lt;span class="fl"&gt;4px&lt;/span&gt; &lt;span class="fl"&gt;2px&lt;/span&gt;;&lt;span class="ke"&gt;cursor&lt;/span&gt;:&lt;span class="vl"&gt;pointer&lt;/span&gt;;&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;inline&lt;/span&gt;;&lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="fl"&gt;6px&lt;/span&gt; &lt;span class="fl"&gt;0px&lt;/span&gt; &lt;span class="fl"&gt;5px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer_locked&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;&lt;span class="cl"&gt;.x&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer&lt;/span&gt;&lt;span class="cl"&gt;.tokenizer_locked&lt;/span&gt; &lt;span class="cl"&gt;.token&lt;/span&gt; &lt;span class="kw"&gt;span&lt;/span&gt;&lt;span class="cl"&gt;.x_hover&lt;/span&gt;{&lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.autocomplete&lt;/span&gt; {  &lt;span class="ke"&gt;position&lt;/span&gt;:&lt;span class="vl"&gt;absolute&lt;/span&gt;;  &lt;span class="ke"&gt;width&lt;/span&gt;:&lt;span class="fl"&gt;355px&lt;/span&gt;;  &lt;span class="ke"&gt;background-color&lt;/span&gt;:&lt;span class="vl"&gt;white&lt;/span&gt;;  &lt;span class="ke"&gt;border&lt;/span&gt;:&lt;span class="fl"&gt;1px&lt;/span&gt; &lt;span class="vl"&gt;solid&lt;/span&gt; &lt;span class="cr"&gt;#888&lt;/span&gt;;  &lt;span class="ke"&gt;margin-top&lt;/span&gt;:&lt;span class="fl"&gt;-2px&lt;/span&gt;;  &lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.autocomplete&lt;/span&gt; &lt;span class="kw"&gt;ul&lt;/span&gt; {  &lt;span class="ke"&gt;list-style-type&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;&lt;span class="ke"&gt;margin&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;; &lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;0px&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.autocomplete&lt;/span&gt; &lt;span class="kw"&gt;ul&lt;/span&gt; &lt;span class="kw"&gt;li&lt;/span&gt;&lt;span class="cl"&gt;.selected&lt;/span&gt; { &lt;span class="ke"&gt;background-color&lt;/span&gt;: &lt;span class="cr"&gt;#ffb&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="kw"&gt;div&lt;/span&gt;&lt;span class="cl"&gt;.autocomplete&lt;/span&gt; &lt;span class="kw"&gt;ul&lt;/span&gt; &lt;span class="kw"&gt;li&lt;/span&gt; {  &lt;span class="ke"&gt;list-style-type&lt;/span&gt;:&lt;span class="vl"&gt;none&lt;/span&gt;;  &lt;span class="ke"&gt;display&lt;/span&gt;:&lt;span class="vl"&gt;block&lt;/span&gt;;  &lt;span class="ke"&gt;margin&lt;/span&gt;:&lt;span class="fl"&gt;0&lt;/span&gt;;  &lt;span class="ke"&gt;padding&lt;/span&gt;:&lt;span class="fl"&gt;2px&lt;/span&gt;;  &lt;span class="ke"&gt;height&lt;/span&gt;:&lt;span class="fl"&gt;32px&lt;/span&gt;;&lt;span class="ke"&gt;cursor&lt;/span&gt;:&lt;span class="vl"&gt;pointer&lt;/span&gt;;}&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;/*&lt;/span&gt; &lt;span class="c"&gt;end&lt;/span&gt; &lt;span class="c"&gt;of&lt;/span&gt; &lt;span class="c"&gt;autcompleter.advancedlocal&lt;/span&gt; &lt;span class="c"&gt;css&lt;/span&gt; &lt;span class="c"&gt;*/&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&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&amp;#8217;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;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>
    <id>tag:www.rorcraft.com,2008:Post/41</id>
    <published>2008-08-08T12:21:00Z</published>
    <updated>2008-08-10T11:47:21Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/08/08/rorcraft-chinese-and-zendesk-chinese-on-080808" rel="alternate" />
    <title>RoRCraft ä¸­æ–‡ and Zendesk ä¸­æ–‡ åº†ç¥åŒ—äº¬å¥¥è¿ </title>
    <content type="html">&lt;p&gt;ä¸ºäº†åº†ç¥ä»Šå¤©08åŒ—äº¬å¥¥è¿ä¼šå¼€å¹•ï¼Œæˆ‘ä»¬éžå¸¸å…´å¥‹åœ°å®£å¸ƒæˆ‘ä»¬å°†ä¸Ž&lt;a href="http://chinese.zendesk.com"target="_blank"  onclick="javascript:urchinTracker ('/outbound/article/chinese.zendesk.com');"&gt;Zendesk&lt;/a&gt;çš„åˆä½œå¼€å‘helpdesk 2.0å¹¶åœ¨chinese.zendesk.comæŽ¨å‡ºä¸­æ–‡ç‰ˆçš„ç¦…å®—æœåŠ¡å°ã€‚ç¦…å®—æœåŠ¡å°ï¼ˆZendeskï¼‰æ˜¯ä¸€ä¸ªweb2.0é£Žæ ¼çš„åœ¨çº¿æ¡Œé¢å¸®åŠ©æ–¹æ¡ˆã€‚æˆ‘ ä»¬ä¹‹å‰æ›¾å¸®åŠ©ä»–ä»¬å‘è¡ŒiphoneæŽ¥å£ï¼ŒçŽ°åœ¨æˆ‘ä»¬å·²ç»å®žçŽ°äº†ç¦…å®—æœåŠ¡å°ä¸­æ–‡å¸‚åœºçš„æœ¬åœ°åŒ–ã€‚å¦‚é¡»ååŠ©å»ºç«‹æ±‰åŒ–ç‰ˆç¦…å®—å®¢æˆ·æœåŠ¡å°ï¼Œè¯·ç”µé‚®è‡´ rex@rorcraft.com ä¸Žæˆ‘å€‘è”ç»œã€‚&lt;/p&gt;
&lt;p&gt;åŒæ—¶æˆ‘ä»¬éžå¸¸é«˜å…´åœ°å®£å¸ƒæˆ‘ä»¬ç»ˆäºŽå»ºç«‹äº†è‡ªå·±çš„ä¸­æ–‡ç«™ç‚¹ &amp;#8211; &lt;a href="http://www.rorcraft.com/zh/" &gt;http://www.rorcraft.com/zh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are very excited to announce our cooperation with &lt;a href="http://www.zendesk.com"target="_blank"  onclick="javascript:urchinTracker ('/outbound/article/www.zendesk.com');"&gt;Zendesk &amp;#8211; helpdesk 2.0&lt;/a&gt; and the launch of a Chinese version of Zendesk at &lt;a href="http://chinese.zendesk.com/" onclick="javascript:urchinTracker ('/outbound/article/chinese.zendesk.com');"&gt;chinese.zendesk.com&lt;/a&gt; to celebrate the start of Beijing Olympics 08. Zendesk is a online helpdesk solution in web2.0 style. We&amp;#8217;ve previously helped them release their iphone interface and now we have localized it for the Chinese speaking market.&lt;/p&gt;
&lt;p&gt;For assistance in setting up your own chinese localized version of Zendesk please contact us at &lt;a href="mailto:rex@rorcraft.com"&gt;rex@rorcraft.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are also very happy to announce that we&amp;#8217;ve finally localized our own site &amp;#8211; &lt;a href="http://www.rorcraft.com/zh/" &gt;http://www.rorcraft.com/zh/&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;img src="http://chinese.zendesk.com/system/logos/0000/5796/Picture_11.png" /&gt;&lt;/div&gt;
&lt;h3 class="entry-header"&gt;&lt;a href="http://blog.zendesk.com/blog/2008/08/2008.html" onclick="javascript:urchinTracker ('/outbound/article/blog.zendesk.com');"&gt;ç†±çƒˆæ…¶ç¥2008åŒ—äº¬å¥§é‹&lt;/a&gt;&lt;/h3&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/92</id>
    <published>2008-08-01T09:25:00Z</published>
    <updated>2009-10-27T07:28:48Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/08/01/patching-paperclip-to-only-thumbnail-images" rel="alternate" />
    <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 &amp;#8220;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&amp;#8221; ( 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&amp;#8217;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;p&gt;&amp;#8212;- ruby129   # Returns true or false if the given content type is recognized as an image.&lt;br /&gt;
130       def image?(content_type)&lt;br /&gt;
131         content_types.include?(content_type)&lt;br /&gt;
132       end&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&amp;lt;p&amp;gt;Content types of images are initialized at the begin of the file:&amp;lt;/p&amp;gt;&lt;tt&gt;
&lt;/tt&gt;--- ruby5  @@content_types = ['image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png', 'image/jpg']&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 class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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 ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&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;tt&gt;
&lt;/tt&gt;&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;p&gt;&amp;#8212;- ruby243   # Creates or updates the thumbnail for the current attachment.&lt;br /&gt;
244       def create_or_update_thumbnail(temp_file, file_name_suffix, *size)&lt;br /&gt;
245         thumbnailable? || raise(ThumbnailError.new(&amp;#8220;Can&amp;#8217;t create a thumbnail if the content \&lt;br /&gt;
 type is not an image or there is no parent_id column&amp;#8221;))&lt;br /&gt;
246         returning find_or_initialize_thumbnail(file_name_suffix) do |thumb|&lt;br /&gt;
247           thumb.attributes = {&lt;br /&gt;
248             :content_type             =&amp;gt; content_type,&lt;br /&gt;
249             :filename                 =&amp;gt; thumbnail_name_for(file_name_suffix),&lt;br /&gt;
250             :temp_path                =&amp;gt; temp_file,&lt;br /&gt;
251             :thumbnail_resize_options =&amp;gt; size&lt;br /&gt;
252           }&lt;br /&gt;
253           callback_with_args :before_thumbnail_saved, thumb&lt;br /&gt;
254           thumb.save!&lt;br /&gt;
255         end&lt;br /&gt;
256       end&lt;/p&gt;&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"&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;5&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;15&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;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"&gt;&amp;lt;p&amp;gt;Paperclip has a similar structure like this, it makes it easier to make this patch.&amp;lt;/p&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;--- rubyFrom line #217&lt;tt&gt;
&lt;/tt&gt;    def post_process #:nodoc:&lt;tt&gt;
&lt;/tt&gt;      return if @queued_for_write[:original].nil?&lt;tt&gt;
&lt;/tt&gt;      logger.info(&amp;quot;[paperclip] Post-processing #{name}&amp;quot;)&lt;tt&gt;
&lt;/tt&gt;      @styles.each do |name, args|&lt;tt&gt;
&lt;/tt&gt;        begin&lt;tt&gt;
&lt;/tt&gt;          dimensions, format = args&lt;tt&gt;
&lt;/tt&gt;          dimensions = dimensions.call(instance) if dimensions.respond_to? :call&lt;tt&gt;
&lt;/tt&gt;          @queued_for_write[name] = Thumbnail.make(@queued_for_write[:original],&lt;tt&gt;
&lt;/tt&gt;                                                   dimensions,&lt;tt&gt;
&lt;/tt&gt;                                                   format,&lt;tt&gt;
&lt;/tt&gt;                                                   @whiny_thumnails)&lt;tt&gt;
&lt;/tt&gt;        rescue PaperclipError =&amp;gt; e&lt;tt&gt;
&lt;/tt&gt;          @errors &amp;lt;&amp;lt; e.message if @whiny_thumbnails&lt;tt&gt;
&lt;/tt&gt;        end&lt;tt&gt;
&lt;/tt&gt;      end&lt;tt&gt;
&lt;/tt&gt;    end&lt;tt&gt;
&lt;/tt&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;p&gt;&amp;#8212;- ruby213     def post_process #:nodoc:&lt;br /&gt;
214       return if &lt;code&gt;queued_for_write[:original].nil?
215       @styles.each do |name, args|
216         begin
                # Test here
217           thumbnailable? || raise(PaperclipError.new("Can not create thumbnails \
 if the content type is not an image."))
218           dimensions, format = args
219           dimensions = dimensions.call(instance) if dimensions.respond_to? :call
220           @queued_for_write[name] = Thumbnail.make(&lt;/code&gt;queued_for_write[:original],-&lt;br /&gt;
221                                                    dimensions,&lt;br /&gt;
222                                                    format,-&lt;br /&gt;
223                                                    @whiny_thumnails)&lt;br /&gt;
224         rescue PaperclipError =&amp;gt; e&lt;br /&gt;
225           @errors &amp;lt;&amp;lt; e.message if @whiny_thumbnails&lt;br /&gt;
226         end&lt;br /&gt;
227       end&lt;br /&gt;
228     end&lt;br /&gt;
&amp;#8212;-&lt;br /&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&amp;#8217;s all, now you can upload pdf files very fast.&lt;/p&gt;&lt;br /&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;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/40</id>
    <published>2008-07-01T21:49:55Z</published>
    <updated>2008-07-01T21:49:55Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/07/01/hangzhou-office" rel="alternate" />
    <title>Hangzhou office.</title>
    <content type="html">&lt;img alt="Rorcraft hangzhou office" id="image27" src="http://blog.rorcraft.com/wp-content/uploads/2008/07/img_0437.jpg" /&gt;&lt;img alt="Rorcraft hangzhou office" id="image25" src="http://blog.rorcraft.com/wp-content/uploads/2008/07/img_0418.jpg" /&gt;&lt;img alt="img_0425.jpg" id="image26" src="http://blog.rorcraft.com/wp-content/uploads/2008/07/img_0425.jpg" /&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/19</id>
    <published>2008-06-01T00:00:00Z</published>
    <updated>2009-10-27T07:28:47Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/06/01/using-xsendfile-to-prevent-memory-leak-in-mongrel" rel="alternate" />
    <title>Using XSendFile to prevent memory leak in mongrel</title>
    <content type="html">&lt;p&gt;When we working on the lastest project which allow user to download video that may be upto a few hundred MB, we see that the memory usage of mongrel start from 5MB in the beginning , and jump to to 300MB in a single night. After trace for a while, we found that the source of the leaking pointing to sendfile function that we currently use. So we looking for a solution to fix the memory leak , and that is the XSendFile which we are going to talk about.&lt;/p&gt;
&lt;p&gt;Most of the people would use mongrel as the application server to deploy the rails , while using apache as the load balance proxy to forward the traffic to the servers that running mongrel. By using XSendFile, instead of mongrel load the file , and pass the file stream to apache,&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/46</id>
    <published>2008-04-02T09:25:00Z</published>
    <updated>2009-10-27T07:28:47Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/04/02/amazon-ec2-finally-support-static-ip-addresses" rel="alternate" />
    <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,&lt;br /&gt;
  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;p&gt;&amp;#8212;- htmlmkdir &lt;sub&gt;/ec2&lt;br /&gt;
cd ~/ec2&lt;br /&gt;
unzip ec2-api-tools.zip&amp;#8212;-&lt;/p&gt;&lt;br /&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;br /&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;br /&gt;
&lt;p&gt;you have to download the private and public cert from amazon &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#8212;- htmlnano ~/.profile&lt;br /&gt;
export &lt;span class="caps"&gt;PATH&lt;/span&gt;=&lt;/sub&gt;/ec2/ec2-api-tools-1.3-19403/bin:$&lt;span class="caps"&gt;PATH&lt;/span&gt;&lt;br /&gt;
export EC2_HOME=~/ec2/ec2-api-tools-1.3-19403&lt;br /&gt;
export EC2_CERT=~/.ec2/cert-xxxxxxxxx.pem&lt;br /&gt;
export EC2_PRIVATE_KEY=~/.ec2/pk-yyyyyy.pem&amp;#8212;-&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;then you can start a new console so that the profile update will be effective.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;you can now allocate a new IP address for your account.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#8212;- htmlChris:~ chrischan$ ec2-allocate-address &lt;br /&gt;
&lt;span class="caps"&gt;ADDRESS&lt;/span&gt; 75.101.139.212&amp;#8212;-&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;This new IP 75.101.140.212 is not bundle to any &lt;span class="caps"&gt;AMI&lt;/span&gt; instance yet. &lt;br /&gt;&lt;br /&gt;
You have to manually assign this IP address to a instance&lt;/p&gt;&lt;br /&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;br /&gt;
&lt;p&gt;&amp;#8212;- htmlChris:~ chrischan$ ec2-describe-instances &lt;br /&gt;
  &lt;span class="caps"&gt;RESERVATION&lt;/span&gt;     r-3c1bea55      073126868754    default&lt;br /&gt;
&lt;span class="caps"&gt;INSTANCE&lt;/span&gt;        i-7124dd30      ami-5035d079    ec2-67-202-34-115.compute-1.amazonaws.com      &lt;br /&gt;
domU-12-31-38-00-6D-98.compute-1.internal       running         0m1.small 2008-03-05T15:51:36+0000 &lt;br /&gt;
us-east-1a&amp;#8212;-&lt;/p&gt;&lt;br /&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;br /&gt;
&lt;p&gt;&amp;#8212;- htmlChris:~ chrischan$ ec2-associate-address 75.101.140.212 &lt;del&gt;i i-7124dd30&lt;br /&gt;
&lt;span class="caps"&gt;ADDRESS&lt;/span&gt; 75.101.140.212  i-7124dd30&lt;/del&gt;&amp;#8212;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;If you want to check the address allocation status, you can use the follow command&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#8212;- htmlChris:~ chrischan$ ec2-describe-addresses &lt;br /&gt;
&lt;span class="caps"&gt;ADDRESS&lt;/span&gt; 75.101.140.212  i-7124dd30&amp;#8212;-&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;for any time if you want to free the IP , you can use &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#8212;- htmlec2-release-address IP-address&amp;#8212;- &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;If you want to assign the existing IP address to a new instance , you can use ec2-associate-address,&lt;br /&gt;
but this time , you assign the new instance IP, and the existing IP address bundling will remove, &lt;br /&gt;
so the single IP address will always only bundle to one instance. &lt;/p&gt;&lt;br /&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,&lt;br /&gt;
all the existing IP bundling will be removed. And all the IP address in this status will start to charge you account.&lt;br /&gt;
So whenever any IP allocate has finished , please make to use ec2-describe-addresses to check the IP address bundling status.&lt;/p&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>tag:www.rorcraft.com,2008:Post/44</id>
    <published>2008-03-26T09:16:00Z</published>
    <updated>2009-10-27T07:28:47Z</updated>
    <link type="text/html" href="http://rorcraft.com/2008/03/26/ankoder-architecture-presentation" rel="alternate" />
    <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&amp;#8217;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;&amp;lt;img src=&amp;#8220;http://devblog.rorcraft.com/assets/2008/3/28/IMG_1903.&lt;span class="caps"&gt;JPG&lt;/span&gt;&amp;#8221;/ width=&amp;quot;400&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;We did a presentation on our architecture and how we host a fault tolerant system on Amazon&amp;#8217;s EC2. 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&amp;#8217;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 style="width:425px;text-align:left" id="__ss_325279"&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=ankoder-system-architecture-1206698165511139-4"/&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=ankoder-system-architecture-1206698165511139-4" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;p&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" 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;&lt;/p&gt;</content>
  </entry>
</feed>
