<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Tom Pesman]]></title>
  <link href="http://tnux.net/atom.xml" rel="self"/>
  <link href="http://tnux.net/"/>
  <updated>2013-06-18T14:20:40+02:00</updated>
  <id>http://tnux.net/</id>
  <author>
    <name><![CDATA[Tom Pesman]]></name>
    <email><![CDATA[tom@tnux.net]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[DRS released with beta IFC exporter]]></title>
    <link href="http://tnux.net/blog/2013/06/13/drs-released-with-beta-ifc-exporter/"/>
    <updated>2013-06-13T08:59:00+02:00</updated>
    <id>http://tnux.net/blog/2013/06/13/drs-released-with-beta-ifc-exporter</id>
    <content type="html"><![CDATA[<p>Today the Dutch Revit user group (RevitGG) released the latest version of the <a href="http://revitgg.nl/index.php/7-slider/32-nieuwe-standaard-template-voor-nl">Dutch Revit Standard</a>. With some help of <a href="http://nl.linkedin.com/in/martijnderiet">Martijn de Riet</a> and Autodesk I&#8217;ve developed a modification to the <a href="http://sourceforge.net/projects/ifcexporter/">IFC Exporter for Revit</a>. It will now be possible to make a mapping file to map Revit parameters to the IFC properties. A mapping file looks like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Pset_WallCommon   FireRating    fire_rating
</span><span class='line'>Pset_WallCommon   Compartmentation  brandwerend
</span><span class='line'>Pset_WallCommon   SurfaceSpreadOfFlame  brandklasse
</span><span class='line'>Pset_WallCommon   Combustible   ontvlambaar
</span><span class='line'>Pset_WallCommon   AcousticRating    luchtgeluidsisolatie</span></code></pre></td></tr></table></div></figure>


<p>The Revit parameter &#8216;fire_rating&#8217; will be assigned to the &#8216;FireRating&#8217; IFC property for a wall. With the Dutch standard combined with my modification to the exporter, the only thing left to do is to make a default mapping file for the Dutch Revit Standard to create a full workflow from Revit model to IFC model all within the Dutch Revit Standard. The first standardized workflow from Revit to IFC in the world!</p>

<p>Later today Autodesk will release a beta version with the new functionality included.</p>

<p>Update: Beta is online <a href="http://sourceforge.net/projects/ifcexporter/files/">now</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Nummi website is online]]></title>
    <link href="http://tnux.net/blog/2012/01/20/nummi-website-is-online/"/>
    <updated>2012-01-20T19:30:00+01:00</updated>
    <id>http://tnux.net/blog/2012/01/20/nummi-website-is-online</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://tnux.net/images/content/nummi-screenshot.png" width="250" height="250" title="Nummi iOS Screenshot" ></p>

<p>Together with my sister we&#8217;ve released the website for the iOS application nummi! Shortly we will be able to publish the app in the AppStore. We&#8217;re also working on an Android version which we&#8217;ll publish within a few weeks. Please head over to the website and press the Facebook like button to receive the latest updates.</p>

<p><a href="http://nummi-app.com">nummi website</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Free Auto Number Add-in and x86 add-ins]]></title>
    <link href="http://tnux.net/blog/2011/12/19/free-auto-number-add-in-and-x86-add-ins/"/>
    <updated>2011-12-19T12:28:00+01:00</updated>
    <id>http://tnux.net/blog/2011/12/19/free-auto-number-add-in-and-x86-add-ins</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://tnux.net/images/content/revit-auto-number.png" width="150" height="150" title="Revit Auto Number Add-in" ></p>

<p>The <a href="http://tnux.net/pages/revit-auto-number-addin.html">Auto Number Add-in</a> is now available for free, a sort of Christmas present! This add-in can Mark any element which has a Mark parameter. You can use interval, prefix, postfix and offset options to get the output you want.</p>

<p>I&#8217;ve also added the x86 versions of the add-ins. So feel free to try these add-ins if you use 32bit!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Save Selection Add-in]]></title>
    <link href="http://tnux.net/blog/2011/11/16/save-selection-add-in/"/>
    <updated>2011-11-16T15:00:00+01:00</updated>
    <id>http://tnux.net/blog/2011/11/16/save-selection-add-in</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://tnux.net/images/content/revit-save-selection.png" width="150" height="150" title="Revit Save Selection Add-in" ></p>

<p>Yesterday Mark Wieringa of <a href="http://www.cepezed.nl">cepezed</a> pointed out the blog posting of Luke Johnson at <a href="http://whatrevitwants.blogspot.com/2011/11/quick-select-groups-of-objects-in-revit.html">What Revit Wants</a>. We thought this way of remembering a selection within Revit is a bit cumbersome. That&#8217;s why I created the Revit Save Selection Add-in and it is free to download from the <a href="http://tnux.net/pages/revit-save-selection.html">Revit Save Section</a> page. To speed up the selection process you can put the icons in the Quick Access Toolbar or assign Keyboard Shortcuts to it. Please leave a comment with your findings.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Gradient calculation in Ruby]]></title>
    <link href="http://tnux.net/blog/2011/10/26/gradient-calculation-in-ruby/"/>
    <updated>2011-10-26T07:24:00+02:00</updated>
    <id>http://tnux.net/blog/2011/10/26/gradient-calculation-in-ruby</id>
    <content type="html"><![CDATA[<p>For one of my projects I needed to calculate color values between two colors. This is what I came up with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Gradient</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:resolution</span><span class="p">,</span> <span class="ss">:R0</span><span class="p">,</span> <span class="ss">:G0</span><span class="p">,</span> <span class="ss">:B0</span><span class="p">,</span> <span class="ss">:R1</span><span class="p">,</span> <span class="ss">:G1</span><span class="p">,</span> <span class="ss">:B1</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">resolution</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@resolution</span> <span class="o">=</span> <span class="nb">Float</span><span class="p">(</span><span class="n">resolution</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@R0</span> <span class="o">=</span> <span class="p">(</span><span class="n">start</span> <span class="o">&amp;</span> <span class="mh">0xff0000</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span><span class="p">;</span>
</span><span class='line'>    <span class="vi">@G0</span> <span class="o">=</span> <span class="p">(</span><span class="n">start</span> <span class="o">&amp;</span> <span class="mh">0x00ff00</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">;</span>
</span><span class='line'>    <span class="vi">@B0</span> <span class="o">=</span> <span class="p">(</span><span class="n">start</span> <span class="o">&amp;</span> <span class="mh">0x0000ff</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@R1</span> <span class="o">=</span> <span class="p">(</span><span class="n">stop</span> <span class="o">&amp;</span> <span class="mh">0xff0000</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span><span class="p">;</span>
</span><span class='line'>    <span class="vi">@G1</span> <span class="o">=</span> <span class="p">(</span><span class="n">stop</span> <span class="o">&amp;</span> <span class="mh">0x00ff00</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">;</span>
</span><span class='line'>    <span class="vi">@B1</span> <span class="o">=</span> <span class="p">(</span><span class="n">stop</span> <span class="o">&amp;</span> <span class="mh">0x0000ff</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">gradient</span><span class="p">(</span><span class="n">step</span><span class="p">)</span>
</span><span class='line'>    <span class="n">r</span> <span class="o">=</span> <span class="n">interpolate</span><span class="p">(</span><span class="vi">@R0</span><span class="p">,</span> <span class="vi">@R1</span><span class="p">,</span> <span class="n">step</span><span class="p">);</span>
</span><span class='line'>    <span class="n">g</span> <span class="o">=</span> <span class="n">interpolate</span><span class="p">(</span><span class="vi">@G0</span><span class="p">,</span> <span class="vi">@G1</span><span class="p">,</span> <span class="n">step</span><span class="p">);</span>
</span><span class='line'>    <span class="n">b</span> <span class="o">=</span> <span class="n">interpolate</span><span class="p">(</span><span class="vi">@B0</span><span class="p">,</span> <span class="vi">@B1</span><span class="p">,</span> <span class="n">step</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">(((</span><span class="n">r</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">|</span> <span class="n">g</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">|</span> <span class="n">b</span><span class="p">;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">interpolate</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">step</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">start</span> <span class="o">&lt;</span> <span class="n">stop</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">(((</span><span class="n">stop</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">step</span> <span class="o">/</span> <span class="vi">@resolution</span><span class="p">))</span> <span class="o">+</span> <span class="n">start</span><span class="p">)</span><span class="o">.</span><span class="n">round</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">(((</span><span class="n">start</span> <span class="o">-</span> <span class="n">stop</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="p">(</span><span class="n">step</span> <span class="o">/</span> <span class="vi">@resolution</span><span class="p">)))</span> <span class="o">+</span> <span class="n">stop</span><span class="p">)</span><span class="o">.</span><span class="n">round</span><span class="p">;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can use it like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">g</span> <span class="o">=</span> <span class="no">Gradient</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="mh">0xe6ebf9</span><span class="p">,</span> <span class="mh">0x33abe3</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
</span><span class='line'><span class="n">g</span><span class="o">.</span><span class="n">gradient</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And with the optional <code>to_s(16)</code> it will return a hex value, which can be used in the CSS code.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Custom Revit Add-ins explained]]></title>
    <link href="http://tnux.net/blog/2011/08/24/custom-revit-add-ins-explained/"/>
    <updated>2011-08-24T07:53:00+02:00</updated>
    <id>http://tnux.net/blog/2011/08/24/custom-revit-add-ins-explained</id>
    <content type="html"><![CDATA[<p>Today I&#8217;ve posted a page on my site explaining how the process of developing a Revit add-in works. With this page I hope I can take away the fear of developing  your own add-ins.</p>

<p><a href="http://tnux.net/pages/custom-add-in">Read here</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New website released!]]></title>
    <link href="http://tnux.net/blog/2011/08/02/new-website-released/"/>
    <updated>2011-08-02T08:17:00+02:00</updated>
    <id>http://tnux.net/blog/2011/08/02/new-website-released</id>
    <content type="html"><![CDATA[<p>Earlier this week I&#8217;ve released my new website! My previous website was a standard WordPress blog, but I wanted more control of the blog and other pages so I&#8217;ve created my own site in Ruby on Rails. One of the extra functionalities I&#8217;ve added is a download section at the Revit pages, so everyone can try the add-ins before buying. I&#8217;m also planning to add more features in the future; like a store for add-ins, a search field and social network sharing buttons.</p>

<p>This site is built on the latest release candidate of Ruby on Rails 3.1. It uses the new asset pipeline with SASS and Coffeescript. I&#8217;ve used test driven development as the development process, which is very suitable for a Rails project. First tests are made and subsequently the code is added to the project to make the tests pass. My code is monitored with guard and has a 100% test coverage.</p>

<p>This site provides new opportunities for both my Ruby on Rails and my Revit projects. Please check out the rest of my site and if you are a Revit user, make sure you download some of my add-ins. I will be adding more of them in the upcoming days.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Couple of new Revit Add-ins]]></title>
    <link href="http://tnux.net/blog/2011/05/30/couple-of-new-revit-add-ins/"/>
    <updated>2011-05-30T10:45:00+02:00</updated>
    <id>http://tnux.net/blog/2011/05/30/couple-of-new-revit-add-ins</id>
    <content type="html"><![CDATA[<p>Just a quick update on the Revit Add-ins, I&#8217;ve made an add-in named: <a href="http://tnux.net/revit/revit-tag-by-filter/">Tag By Filter</a> and <a href="http://tnux.net/revit/revit-angle-validation/">Angle Validation</a>. Tag By Filter does exactly what you would expect: Tag elements per view which meet specific filter rules. These rules filter by element parameters and can be combined together. The Angle Validation plugin lets users check if all elements, mainly walls, are parallel or orthogonal to the grid. Both add-ins are small, fast and will save the designers a lot of time and will improve the quality of their Revit model.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Revit Wall Finish Add-in]]></title>
    <link href="http://tnux.net/blog/2011/03/24/revit-wall-finish-add-in/"/>
    <updated>2011-03-24T10:43:00+01:00</updated>
    <id>http://tnux.net/blog/2011/03/24/revit-wall-finish-add-in</id>
    <content type="html"><![CDATA[<p>The Dutch Revit User Group (RevitGG) meets on a regular basis to create standards and guidelines for the Dutch market. One of their efforts lately is a way to calculate the square meters of wall finish required for a project. This procedure is relatively accurate, but very time consuming to actually execute in a real project. Together with Arno de Lange from SEED architects I&#8217;m building a Revit Wall Finish Add-in which uses the guidelines of the Revit User Group and executes the procedure automatically. Right now the Add-in is in a beta stadium and I&#8217;m looking for beta-testers to help me improve the Add-in. If you are interested please let me know: <a href="mailto:tom@tnux.net">tom@tnux.net</a>. More <a href="http://tnux.net/pages/revit-wall-finish-add-in/">information</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First paid app online]]></title>
    <link href="http://tnux.net/blog/2011/01/15/first-paid-app-online/"/>
    <updated>2011-01-15T10:42:00+01:00</updated>
    <id>http://tnux.net/blog/2011/01/15/first-paid-app-online</id>
    <content type="html"><![CDATA[<p>Yesterday I&#8217;ve released my first paid application in the Revit App Store. It is an extended version of the Auto Number Parking Component application. This version allows the user to update the Mark parameter of all Families with the Mark parameter. The free version is also updated and is restricted to update only Parking Components. So if you are in doubt this application will perform as you would expect, try the free version first. If you have any suggestions or comments, please let me know.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Revit App Store]]></title>
    <link href="http://tnux.net/blog/2010/11/12/revit-app-store/"/>
    <updated>2010-11-12T10:40:00+01:00</updated>
    <id>http://tnux.net/blog/2010/11/12/revit-app-store</id>
    <content type="html"><![CDATA[<p>Today I published my first app in the <a href="http://www.revitappstore.com/">Revit App Store</a>. I think this way of distributing small add-ins for Revit can be very useful. As the first apps are distributed for free, I decided to make a small app that automatically numbers the parking spaces. If an user selects multiple parking lots, the user can specify a prefix, postfix, starting value and an interval for the numbering. The tool will also detect if the user will make duplicate mark values within the model, as duplicate marks are not preferable within Revit models.</p>

<p>I&#8217;m very curious how this App Store is developing in the upcoming months, as this can be a great opportunity for both developers and users of Revit. At this point the store isn&#8217;t very mature yet, for example, I think the buttons of the actual applications are located in a window of the app store in a secondary page, two mouse clicks away. I think the buttons should be located in the ribbon, directly accessible by the user. Anyway I keep an eye on the development of this app store.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Amazon S3 Query String Authentication and Ruby on Rails]]></title>
    <link href="http://tnux.net/blog/2010/11/09/amazon-s3-query-string-authentication-and-ruby-on-rails/"/>
    <updated>2010-11-09T10:38:00+01:00</updated>
    <id>http://tnux.net/blog/2010/11/09/amazon-s3-query-string-authentication-and-ruby-on-rails</id>
    <content type="html"><![CDATA[<p>Amazons S3 added this summer a new way to allow people to access your files stored on S3. This method is called Query String Authentication and by generating an url for a private file you can offer access to that file for a limited amount of time. First upload a file to Amazon S3 and use the acl &#8216;private&#8217; to store the file. To generate the url for to such a link I&#8217;ve made a helper for Ruby on Rails:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">generateTemporaryURL</span><span class="p">(</span><span class="n">resource</span><span class="p">)</span>
</span><span class='line'>  <span class="n">filename</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">RAILS_ROOT</span><span class="si">}</span><span class="s2">/config/amazon_s3.yml&quot;</span>
</span><span class='line'>  <span class="n">config</span> <span class="o">=</span> <span class="no">YAML</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>  <span class="n">bucket</span> <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]][</span><span class="s1">&#39;bucket_name&#39;</span><span class="o">]</span>
</span><span class='line'>  <span class="n">access_key_id</span> <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]][</span><span class="s1">&#39;access_key_id&#39;</span><span class="o">]</span>
</span><span class='line'>  <span class="n">secret_access_key</span> <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]][</span><span class="s1">&#39;secret_access_key&#39;</span><span class="o">]</span>
</span><span class='line'>  <span class="n">expires</span> <span class="o">=</span> <span class="mi">10</span><span class="o">.</span><span class="n">days</span><span class="o">.</span><span class="n">from_now</span><span class="o">.</span><span class="n">to_i</span> <span class="c1"># 10 days from now in epoch time in UTC</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">stringtosign</span> <span class="o">=</span> <span class="s2">&quot;GET</span><span class="se">\n\n\n</span><span class="si">#{</span><span class="n">expires</span><span class="si">}</span><span class="se">\n</span><span class="s2">/</span><span class="si">#{</span><span class="n">bucket</span><span class="si">}</span><span class="s2">/&quot;</span><span class="o">+</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]+</span><span class="s2">&quot;/</span><span class="si">#{</span><span class="n">resource</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;+&quot;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">signature</span> <span class="o">=</span> <span class="no">Base64</span><span class="o">.</span><span class="n">encode64</span><span class="p">(</span>
</span><span class='line'>                <span class="ss">OpenSSL</span><span class="p">:</span><span class="ss">:HMAC</span><span class="o">.</span><span class="n">digest</span><span class="p">(</span>
</span><span class='line'>                  <span class="ss">OpenSSL</span><span class="p">:</span><span class="ss">:Digest</span><span class="o">::</span><span class="no">Digest</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">&#39;sha1&#39;</span><span class="p">),</span>
</span><span class='line'>                  <span class="n">secret_access_key</span><span class="p">,</span> <span class="n">stringtosign</span><span class="o">.</span><span class="n">toutf8</span><span class="p">))</span>
</span><span class='line'>  <span class="c1"># cleanup the signature for the url</span>
</span><span class='line'>  <span class="n">signature</span> <span class="o">=</span> <span class="n">signature</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="s2">&quot;&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;+&quot;</span><span class="p">,</span><span class="s2">&quot;%2B&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="s2">&quot;http://</span><span class="si">#{</span><span class="n">bucket</span><span class="si">}</span><span class="s2">/&quot;</span><span class="o">+</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]+</span><span class="s2">&quot;/</span><span class="si">#{</span><span class="n">resource</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="s2">&quot;+&quot;</span><span class="p">)</span><span class="si">}</span><span class="s2">?AWSAccessKeyId=</span><span class="si">#{</span><span class="n">access_key_id</span><span class="si">}</span><span class="s2">&amp;Expires=</span><span class="si">#{</span><span class="n">expires</span><span class="si">}</span><span class="s2">&amp;Signature=</span><span class="si">#{</span><span class="n">signature</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This method generates an url which is valid for 10 days. I&#8217;m now 100% sure of the gsub method to convert spaces in a resource filename to a plus sign, maybe there are more characters you should be aware of. Anyway this method is based on the SWF Upload <a href="http://tnux.net/2010/01/17/swfupload-direct-to-amazon-s3-in-ruby-on-rails/">post</a>.</p>

<p><strong>Update:</strong> Thanks to Simon, I&#8217;ve updated the example where it would produce an invalid signature. The plus sign in the url needs to be url encoded.</p>

<p><strong>Update 2:</strong> Rob provided a Ruby 1.9 only <a href="https://gist.github.com/1032395">version</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Passenger and REE on Ubuntu 10.04]]></title>
    <link href="http://tnux.net/blog/2010/11/02/passenger-and-ree-on-ubuntu-10-04/"/>
    <updated>2010-11-02T10:35:00+01:00</updated>
    <id>http://tnux.net/blog/2010/11/02/passenger-and-ree-on-ubuntu-10-04</id>
    <content type="html"><![CDATA[<p><strong>UPDATE:</strong> that didn&#8217;t work well, now I&#8217;m using the passenger 3 from the gem which comes with REE. No installation of passenger from brightbox, only the REE, and then run the passenger-install-apache2-module. Done ;-)</p>

<p>A small post on how to install Passenger and Ruby Enterprise Edition on Ubuntu 10.04.</p>

<p>add:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>deb http://apt.brightbox.net lucid main
</span></code></pre></td></tr></table></div></figure>


<p>to <code>/etc/apt/sources.list.d/passenger</code></p>

<p>Get the public key to satisfy apt-get:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>wget http://apt.brightbox.net/release.asc
</span></code></pre></td></tr></table></div></figure>


<p>Install the key:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-key add release.asc
</span></code></pre></td></tr></table></div></figure>


<p>Get the latest version of REE from http://www.rubyenterpriseedition.com/download.html</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>wget http://rubyforge.org/frs/download.php/71100/ruby-enterprise_1.8.7-2010.02_i386_ubuntu10.04.deb
</span></code></pre></td></tr></table></div></figure>


<p>Install this package:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo dpkg -i ruby-enterprise_1.8.7-2010.02_i386_ubuntu10.04.deb
</span></code></pre></td></tr></table></div></figure>


<p>Install passenger:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install libapache2-mod-passenger
</span></code></pre></td></tr></table></div></figure>


<p>Restart apache:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo service apache2 restart
</span></code></pre></td></tr></table></div></figure>


<p>Done!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[MiniGeocode 0.0.1 released]]></title>
    <link href="http://tnux.net/blog/2010/09/18/minigeocode-0-0-1-released/"/>
    <updated>2010-09-18T10:34:00+02:00</updated>
    <id>http://tnux.net/blog/2010/09/18/minigeocode-0-0-1-released</id>
    <content type="html"><![CDATA[<p>Today I released my first Ruby on Rails plugin. This plugin does some basic geolocation lookups. It can be installed by issuing the <code>gem install mini_geocode</code> command. To add it to Rails 3 add <code>gem 'mini_geocode'</code> to your Gemfile in the root of your rails project. To use it in a Rails 2.x installation, add <code>config.gem 'mini_geocode'</code> to you environment.rb. This plugin has no dependencies so the installation should be very easy.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why is my KmlLayer in Google Maps v3 not working?]]></title>
    <link href="http://tnux.net/blog/2010/07/22/why-is-my-kmllayer-in-google-maps-v3-not-working/"/>
    <updated>2010-07-22T10:32:00+02:00</updated>
    <id>http://tnux.net/blog/2010/07/22/why-is-my-kmllayer-in-google-maps-v3-not-working</id>
    <content type="html"><![CDATA[<p>If you use some code like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">initialize</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">mapTypeId</span><span class="o">:</span> <span class="nx">google</span><span class="p">.</span><span class="nx">maps</span><span class="p">.</span><span class="nx">MapTypeId</span><span class="p">.</span><span class="nx">SATELLITE</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">streetViewControl</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">map</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">google</span><span class="p">.</span><span class="nx">maps</span><span class="p">.</span><span class="nx">Map</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;map&#39;</span><span class="p">),</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">kmlLayer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">google</span><span class="p">.</span><span class="nx">maps</span><span class="p">.</span><span class="nx">KmlLayer</span><span class="p">(</span><span class="s1">&#39;http://127.0.0.1:3000/kmlfile.kml&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">kmlLayer</span><span class="p">.</span><span class="nx">setMap</span><span class="p">(</span><span class="nx">map</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">loadScript</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">script</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;script&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">script</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s2">&quot;text/javascript&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">script</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">&quot;http://maps.google.com/maps/api/js?sensor=false&amp;callback=initialize&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">script</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="nx">loadScript</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In a typical Ruby on Rails development environment you will have your server running on your localhost on port 3000. The way Google Maps accesses your KML file is not directly from the script locally, but via Google itself. So the solution is to have your KML online accessible by Google Maps. I hope this tip saved you some valuable time! ;-)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Force file_column to regenerate the thumbnails]]></title>
    <link href="http://tnux.net/blog/2010/07/18/force-file_column-to-regenerate-the-thumbnails/"/>
    <updated>2010-07-18T10:32:00+02:00</updated>
    <id>http://tnux.net/blog/2010/07/18/force-file_column-to-regenerate-the-thumbnails</id>
    <content type="html"><![CDATA[<p>A small post to show how to let file_column to regenerate the already generated thumbnails.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">update_attributes</span><span class="p">(</span><span class="n">att</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>  <span class="k">super</span><span class="p">(</span><span class="n">att</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>When you put this piece of code in the model where the file_column is used, the only thing that needs to be changed is the &#8216;path&#8217; variable into the file_column name. The update_attributes method is often used in the update method in the controllers.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[VMware ESXi 4.0 + QNAP TS-410]]></title>
    <link href="http://tnux.net/blog/2010/07/10/vmware-esxi-4-0-qnap-ts-410/"/>
    <updated>2010-07-10T10:29:00+02:00</updated>
    <id>http://tnux.net/blog/2010/07/10/vmware-esxi-4-0-qnap-ts-410</id>
    <content type="html"><![CDATA[<p><strong>UPDATE:</strong> There are problems with iSCSI on the QNAP with VMware. After I wrote this blog post my complete setup crashed and I lost all my virtual machines. So this blog post shows how to setup iSCSI with VMware, but do not use it with the QNAP’s. Right now I’m using NFS as a datastore with 7 virtual machines without any problems.</p>

<p>I&#8217;ve updated my server setup at home with some new hardware. First of all a new QNAP TS-410 NAS with 4 Western Digital Caviar Green 2TB disks attached to the NAS. For my new server I will use an old HP dc7700 P4 with 5 Gb of RAM. To connect the NAS to the server I took a Cisco 8 port Gigabit switch (SLM2008).</p>

<p><strong>QNAP TS-410</strong>
First of all I installed the disks and booted the system for the first time. Using the configuration utility I configured the disks in a RAID 5 setup, so totally I have 6TB of disk space available. During this setup I also installed the latest firmware, which I took from the QNAP website. The synchronisation of the RAID 5 setup took over 24 hours! Which is quite long, but this is only done once. The reason I bought this TS-410 is because this is the cheapest 4 disk NAS with iSCSI enabled. The iSCSI we can use to connect the VMware ESXi 4.0 to the storage. In the QNAP web interface the iSCSI service should be enabled and a iSCSI target and LUN should be created. A target is similar to the SCSI card we used years ago and is used to connect the remote system with. The LUN&#8217;s are similar to physical disks, but with iSCSI these are virtual. Now we have created the basis of our storage network for the VMware ESXi 4.0 server.</p>

<p><strong>VMware ESXi 4.0</strong>
First I cleaned the old HP dc7700 pc and removed the hard disks. Next I inserted an flash drive of 1 Gigabyte, but this one turned out to be broken. So I took a 2 Gigabyte disk, but 1 is sufficient. I booted from the installation CD and installed the ESXi server on the flash drive. After rebooting I was able to connect with my browser to the server. Using the console a fixed IP was given to the server. Next we need to configure the VMware ESXi 4.0 server using the vSphere Client which can be downloaded from the management IP address.</p>

<p><strong>VMware vSphere Client</strong>
In VMware vSphere Client we need to get the data storage working as the server doesn&#8217;t have local storage. So open server -> configuration -> networking to add a VMkernel port to the virtual switch. This is to allow the storage adapter access the NAS.</p>

<p><img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/vmware-networking-1024x726.png" alt="vmware-networking" /></p>

<p>Now goto storage adapters and select the properties of the iSCSI adapter. Click configure and select enable to enable the iSCSI adapter, click on dynamic discovery and add your NAS ip:3260. It is now possible to see the device in the details below.</p>

<p><img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/vmware-storage-1024x726.png" alt="vmware-storage" />
<img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/vmware-storage-2-1024x726.png" alt="vmware-storage2" />
<img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/vmware-storage-3-1024x726.png" alt="vmware-storage3" /></p>

<p>In the storage configuration we need to add the LUN to VMware so this LUN can be used in a virtual machine.
<img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/vmware-storage-4-1024x726.png" alt="vmware-storage4" /></p>

<p><strong>Cisco Switch</strong>
To connect the NAS with all network interfaces to the switch, the switch has to be properly configured. The ports need to have the LACP option enabled.</p>

<p><img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/nas-network-2-1024x711.png" alt="vmware-network-2" /></p>

<p>Once this is done in the management interface of the switch, the NAS needs to be configured to use the IEEE 802.3ad Dynamic Link Aggregation.</p>

<p><img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/nas-network-1-1024x711.png" alt="nas-network-1" /></p>

<p>Finally the second network interface can be connected to the switch. Use the management interface on the switch to see if it is working correctly.</p>

<p><img src="http://wordpress.tnux.net/wp-content/uploads/2010/07/nas-network-3-1024x711.png" alt="nas-network-3" /></p>

<p>Now we have a nice system to experiment with. The only thing what I have to do now is to migrate my existing CentOS XEN server to this VMware system.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby on Rails MiniWiki plugin released]]></title>
    <link href="http://tnux.net/blog/2010/01/17/ruby-on-rails-miniwiki-plugin-released/"/>
    <updated>2010-01-17T10:27:00+01:00</updated>
    <id>http://tnux.net/blog/2010/01/17/ruby-on-rails-miniwiki-plugin-released</id>
    <content type="html"><![CDATA[<p>To create a wiki in a Ruby on Rails app, I&#8217;ve created a plugin called: MiniWiki. With 3 simple steps it is possible to add a very basic wiki to your application. The only dependency is RedCloth and the generator creates a migration for only two tables in your database. For more detailed information see the <a href="https://github.com/tompesman/mini_wiki">Github</a> page.</p>

<p>Try <a href="http://tnux.net/pages/mini_wiki/">here</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SWFUpload direct to Amazon S3 in Ruby on Rails]]></title>
    <link href="http://tnux.net/blog/2010/01/17/swfupload-direct-to-amazon-s3-in-ruby-on-rails/"/>
    <updated>2010-01-17T10:18:00+01:00</updated>
    <id>http://tnux.net/blog/2010/01/17/swfupload-direct-to-amazon-s3-in-ruby-on-rails</id>
    <content type="html"><![CDATA[<p>I&#8217;m working on various projects and for one certain project this company wanted a file sharing website, like yousendit.com for example, but the site should be in-house. I proposed Amazon S3 for the storage of the files, otherwise the VPS will become very expensive. This file sharing website should also handle large files, so a reliable upload method is desired. SWFUpload is a well known Flash upload application. So the requirements are now complete: Ruby on Rails, Amazon S3 and SWFUpload.</p>

<p>First I created a config file to enter my Amazon S3 credentials. The credentials are dependent on the Ruby on Rails environment.</p>

<p><code>config/amazon_s3.yml</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="ss">development</span><span class="p">:</span>
</span><span class='line'>  <span class="n">bucket_name</span><span class="p">:</span> <span class="no">BUCKET_NAME</span>
</span><span class='line'>  <span class="n">access_key_id</span><span class="p">:</span> <span class="no">ACCESS_KEY_ID</span>
</span><span class='line'>  <span class="n">secret_access_key</span><span class="p">:</span> <span class="no">SECRET_ACCESS_KEY</span>
</span><span class='line'>
</span><span class='line'><span class="nb">test</span><span class="p">:</span>
</span><span class='line'>  <span class="n">bucket_name</span><span class="p">:</span> <span class="no">BUCKET_NAME</span>
</span><span class='line'>  <span class="n">access_key_id</span><span class="p">:</span> <span class="no">ACCESS_KEY_ID</span>
</span><span class='line'>  <span class="n">secret_access_key</span><span class="p">:</span> <span class="no">SECRET_ACCESS_KEY</span>
</span><span class='line'>
</span><span class='line'><span class="ss">production</span><span class="p">:</span>
</span><span class='line'>  <span class="n">bucket_name</span><span class="p">:</span> <span class="no">BUCKET_NAME</span>
</span><span class='line'>  <span class="n">access_key_id</span><span class="p">:</span> <span class="no">ACCESS_KEY_ID</span>
</span><span class='line'>  <span class="n">secret_access_key</span><span class="p">:</span> <span class="no">SECRET_ACCESS_KEY</span>
</span></code></pre></td></tr></table></div></figure>


<p>Created a controller and added the index method. The method reads the S3 settings from the config file and generates the fields required for SWFUpload and S3.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="n">filename</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">RAILS_ROOT</span><span class="si">}</span><span class="s2">/config/amazon_s3.yml&quot;</span>
</span><span class='line'>    <span class="n">config</span> <span class="o">=</span> <span class="no">YAML</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">bucket</span>            <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]][</span><span class="s1">&#39;bucket_name&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="n">access_key_id</span>     <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]][</span><span class="s1">&#39;access_key_id&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="n">secret_access_key</span> <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]][</span><span class="s1">&#39;secret_access_key&#39;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">key</span>             <span class="o">=</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="n">acl</span>             <span class="o">=</span> <span class="s1">&#39;public-read&#39;</span>
</span><span class='line'>    <span class="n">expiration_date</span> <span class="o">=</span> <span class="mi">10</span><span class="o">.</span><span class="n">hours</span><span class="o">.</span><span class="n">from_now</span><span class="o">.</span><span class="n">utc</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y-%m-%dT%H:%M:%S.000Z&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">max_filesize</span>    <span class="o">=</span> <span class="mi">2</span><span class="o">.</span><span class="n">gigabyte</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">policy</span> <span class="o">=</span> <span class="no">Base64</span><span class="o">.</span><span class="n">encode64</span><span class="p">(</span>
</span><span class='line'>      <span class="s2">&quot;{&#39;expiration&#39;: &#39;</span><span class="si">#{</span><span class="n">expiration_date</span><span class="si">}</span><span class="s2">&#39;,</span>
</span><span class='line'><span class="s2">        &#39;conditions&#39;: [</span>
</span><span class='line'><span class="s2">          {&#39;bucket&#39;: &#39;</span><span class="si">#{</span><span class="n">bucket</span><span class="si">}</span><span class="s2">&#39;},</span>
</span><span class='line'><span class="s2">          [&#39;starts-with&#39;, &#39;$key&#39;, &#39;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">&#39;],</span>
</span><span class='line'><span class="s2">          {&#39;acl&#39;: &#39;</span><span class="si">#{</span><span class="n">acl</span><span class="si">}</span><span class="s2">&#39;},</span>
</span><span class='line'><span class="s2">          {&#39;success_action_status&#39;: &#39;201&#39;},</span>
</span><span class='line'><span class="s2">          [&#39;starts-with&#39;, &#39;$Filename&#39;, &#39;&#39;],</span>
</span><span class='line'><span class="s2">          [&#39;content-length-range&#39;, 0, </span><span class="si">#{</span><span class="n">max_filesize</span><span class="si">}</span><span class="s2">]</span>
</span><span class='line'><span class="s2">        ]</span>
</span><span class='line'><span class="s2">      }&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/\n|\r/</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">signature</span> <span class="o">=</span> <span class="no">Base64</span><span class="o">.</span><span class="n">encode64</span><span class="p">(</span>
</span><span class='line'>                  <span class="ss">OpenSSL</span><span class="p">:</span><span class="ss">:HMAC</span><span class="o">.</span><span class="n">digest</span><span class="p">(</span>
</span><span class='line'>                    <span class="ss">OpenSSL</span><span class="p">:</span><span class="ss">:Digest</span><span class="o">::</span><span class="no">Digest</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">&#39;sha1&#39;</span><span class="p">),</span>
</span><span class='line'>                    <span class="n">secret_access_key</span><span class="p">,</span> <span class="n">policy</span><span class="p">))</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@post</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;key&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">/${filename}&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;AWSAccessKeyId&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">access_key_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;acl&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">acl</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;policy&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">policy</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;signature&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">signature</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;success_action_status&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;201&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@upload_url</span> <span class="o">=</span> <span class="s2">&quot;http://</span><span class="si">#{</span><span class="n">bucket</span><span class="si">}</span><span class="s2">.s3.amazonaws.com/&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the index.html.erb view.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
</pre></td><td class='code'><pre><code class='rhtml'><span class='line'><span class="cp">&lt;%</span> <span class="n">content_for</span> <span class="ss">:head</span> <span class="k">do</span> <span class="cp">%&gt;</span>
</span><span class='line'><span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">&quot;/stylesheets/swfupload.css&quot;</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">type=</span><span class="s">&quot;text/css&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="cp">&lt;%</span> <span class="k">end</span><span class="cp">%&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;/javascripts/swfupload/swfupload.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;/javascripts/swfupload/swfupload.queue.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;/javascripts/swfupload/fileprogress.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;/javascripts/swfupload/handlers.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">swfu</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">settings</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">flash_url</span> <span class="o">:</span> <span class="s2">&quot;/assets/swfupload.swf&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">upload_url</span><span class="o">:</span> <span class="s2">&quot;</span><span class="cp">&lt;%=</span> <span class="vi">@upload_url</span> <span class="cp">%&gt;</span><span class="s2">&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">http_success</span> <span class="o">:</span> <span class="p">[</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">204</span> <span class="p">],</span>        <span class="c1">// FOR AWS</span>
</span><span class='line'>          
</span><span class='line'>          <span class="nx">file_size_limit</span> <span class="o">:</span> <span class="s2">&quot;2 GB&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_types</span> <span class="o">:</span> <span class="s2">&quot;*.*&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_types_description</span> <span class="o">:</span> <span class="s2">&quot;All Files&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_upload_limit</span> <span class="o">:</span> <span class="mi">100</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_queue_limit</span> <span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_post_name</span> <span class="o">:</span> <span class="s2">&quot;file&quot;</span><span class="p">,</span>                <span class="c1">// FOR AWS</span>
</span><span class='line'>          
</span><span class='line'>          <span class="nx">custom_settings</span> <span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">progressTarget</span> <span class="o">:</span> <span class="s2">&quot;fsUploadProgress&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">cancelButtonId</span> <span class="o">:</span> <span class="s2">&quot;btnCancel&quot;</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="nx">debug</span><span class="o">:</span> <span class="cp">&lt;%=</span> <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;RAILS_ENV&#39;</span><span class="o">]==</span><span class="s1">&#39;development&#39;</span> <span class="p">?</span> <span class="s1">&#39;true&#39;</span> <span class="p">:</span> <span class="s1">&#39;false&#39;</span> <span class="cp">%&gt;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>          <span class="c1">// Button settings</span>
</span><span class='line'>          <span class="nx">button_image_url</span> <span class="o">:</span> <span class="s2">&quot;/images/buttonUploadText.png&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">button_placeholder_id</span> <span class="o">:</span> <span class="s2">&quot;spanButtonPlaceHolder&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">button_width</span><span class="o">:</span> <span class="mi">61</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">button_height</span><span class="o">:</span> <span class="mi">22</span><span class="p">,</span>
</span><span class='line'>          
</span><span class='line'>          <span class="c1">// The event handler functions are defined in handlers.js</span>
</span><span class='line'>          <span class="nx">file_queued_handler</span> <span class="o">:</span> <span class="nx">fileQueued</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_queue_error_handler</span> <span class="o">:</span> <span class="nx">fileQueueError</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">file_dialog_complete_handler</span> <span class="o">:</span> <span class="nx">fileDialogComplete</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">upload_start_handler</span> <span class="o">:</span> <span class="nx">uploadStart</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">upload_progress_handler</span> <span class="o">:</span> <span class="nx">uploadProgress</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">upload_error_handler</span> <span class="o">:</span> <span class="nx">uploadError</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">upload_success_handler</span> <span class="o">:</span> <span class="nx">uploadSuccess</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">upload_complete_handler</span> <span class="o">:</span> <span class="nx">uploadComplete</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">queue_complete_handler</span> <span class="o">:</span> <span class="nx">queueComplete</span><span class="p">,</span>   <span class="c1">// Queue plugin event</span>
</span><span class='line'>          
</span><span class='line'>          <span class="nx">post_params</span><span class="o">:</span> <span class="cp">&lt;%=</span> <span class="vi">@post</span><span class="o">.</span><span class="n">to_json</span> <span class="cp">%&gt;</span>        <span class="c1">// FOR AWS</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">swfu</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SWFUpload</span><span class="p">(</span><span class="nx">settings</span><span class="p">);</span>
</span><span class='line'>     <span class="p">};</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;form</span> <span class="na">id=</span><span class="s">&quot;form&quot;</span> <span class="na">action=</span><span class="s">&quot;/upload/upload&quot;</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">enctype=</span><span class="s">&quot;multipart/form-data&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fieldset flash&quot;</span> <span class="na">id=</span><span class="s">&quot;fsUploadProgress&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>          <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;legend&quot;</span><span class="nt">&gt;</span>Upload Queue<span class="nt">&lt;/span&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;divStatus&quot;</span><span class="nt">&gt;</span>0 Files Uploaded<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>          <span class="nt">&lt;div&gt;</span>
</span><span class='line'>              <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;spanButtonPlaceHolder&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>              <span class="nt">&lt;input</span> <span class="na">id=</span><span class="s">&quot;btnCancel&quot;</span> <span class="na">type=</span><span class="s">&quot;button&quot;</span> <span class="na">value=</span><span class="s">&quot;Cancel All Uploads&quot;</span> <span class="na">onclick=</span><span class="s">&quot;swfu.cancelQueue();&quot;</span> <span class="na">disabled=</span><span class="s">&quot;disabled&quot;</span> <span class="na">style=</span><span class="s">&quot;margin-left: 2px; font-size: 8pt; height: 29px;&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>          <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;/form&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Upload the file <code>crossdomain.xml</code> to the root of your bucket. This is for Flash to upload to a different domain.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot;?&gt;</span>
</span><span class='line'><span class="cp">&lt;!DOCTYPE cross-domain-policy SYSTEM &quot;http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd&quot;&gt;</span>
</span><span class='line'><span class="nt">&lt;cross-domain-policy&gt;</span>
</span><span class='line'>  <span class="nt">&lt;allow-access-from</span> <span class="na">domain=</span><span class="s">&quot;*&quot;</span> <span class="na">secure=</span><span class="s">&quot;false&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;/cross-domain-policy&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally took the files from the SWFUpload simpledemo and placed them in the following directories:</p>

<ul>
<li>swfupload.swf in public/assets/</li>
<li>fileprogress.js, handles.js, swfupload.js and swfupload.queue.js in public/javascripts/swfupload/</li>
<li>buttonUploadText.png in public/images/</li>
</ul>


<p>Now SWFUpload should be working in your Ruby on Rails application.</p>

<p><strong>Callback</strong>
For my application I needed a callback to let my application know there was a file successfully uploaded to the S3 bucket. To get this functionality I added a function to the controller and modified the <code>handlers.js</code> file.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">upload_done</span>
</span><span class='line'>    <span class="n">file</span> <span class="o">=</span> <span class="no">ShareFile</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">file</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:name</span><span class="o">]</span>
</span><span class='line'>    <span class="n">file</span><span class="o">.</span><span class="n">filestatus</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:filestatus</span><span class="o">]</span>
</span><span class='line'>    <span class="n">file</span><span class="o">.</span><span class="n">filetype</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:type</span><span class="o">]</span>
</span><span class='line'>    <span class="n">file</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:size</span><span class="o">]</span>
</span><span class='line'>    <span class="n">file</span><span class="o">.</span><span class="n">s3_available</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">file</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">uploadSuccess</span><span class="p">(</span><span class="nx">file</span><span class="p">,</span> <span class="nx">serverData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// HERE: Send a notification upload has succeeded</span>
</span><span class='line'>  <span class="k">new</span> <span class="nx">Ajax</span><span class="p">.</span><span class="nx">Request</span><span class="p">(</span><span class="s1">&#39;/share/upload_done?&#39;</span><span class="o">+</span><span class="nb">Object</span><span class="p">.</span><span class="nx">toQueryString</span><span class="p">(</span><span class="nx">file</span><span class="p">),</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">method</span><span class="o">:</span><span class="s1">&#39;get&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">asynchronous</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">onSuccess</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">progress</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FileProgress</span><span class="p">(</span><span class="nx">file</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">customSettings</span><span class="p">.</span><span class="nx">progressTarget</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">progress</span><span class="p">.</span><span class="nx">setStatus</span><span class="p">(</span><span class="s2">&quot;Sending meta data.&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="c1">// HERE: end</span>
</span><span class='line'>  
</span><span class='line'>  <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">progress</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FileProgress</span><span class="p">(</span><span class="nx">file</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">customSettings</span><span class="p">.</span><span class="nx">progressTarget</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">progress</span><span class="p">.</span><span class="nx">setComplete</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">progress</span><span class="p">.</span><span class="nx">setStatus</span><span class="p">(</span><span class="s2">&quot;Complete.&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">progress</span><span class="p">.</span><span class="nx">toggleCancel</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">ex</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">debug</span><span class="p">(</span><span class="nx">ex</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>When SWFUpload is done uploading it uses the javascript callback to update the status of the form and to send a notification to the Ruby on Rails application.</p>

<p>Good luck!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[XEN, Ruby Enterprise Edition and 4gb seg fixup]]></title>
    <link href="http://tnux.net/blog/2010/01/17/xen-ree-4gbsegfixup/"/>
    <updated>2010-01-17T10:16:00+01:00</updated>
    <id>http://tnux.net/blog/2010/01/17/xen-ree-4gbsegfixup</id>
    <content type="html"><![CDATA[<p>My new CentOS XEN server has a virtual machine which serves as a dedicated web server. The on the console and in /var/log/messages the following message appeared:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>4gb seg fixup, process ruby <span class="o">(</span>pid 20252<span class="o">)</span>, cs:ip 73:00e0a636
</span><span class='line'>printk: 151939 messages suppressed.
</span></code></pre></td></tr></table></div></figure>


<p>The console is unusable, because every second a new message appears. The logfile is unusable as well, because it is very large and takes long to open in a text editor and interesting messages are difficult to find. After some google&#8217;ing I&#8217;ve found the following <a href="http://groups.google.com/group/emm-ruby/browse_thread/thread/1b9beffe8fa694a7/82fd6839307d9298">page</a> with some instructions to fix it. I&#8217;ve mixed up various methods, but this is the most robust one to use. It creates a wrapper around the gcc and g++ binaries with the correct parameters.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>mv /usr/bin/gcc /usr/bin/gcc.orig
</span><span class='line'>mv /usr/bin/g++ /usr/bin/g++.orig
</span><span class='line'><span class="nb">echo</span> <span class="s1">&#39;#!/bin/sh&#39;</span> &gt; /usr/bin/gcc
</span><span class='line'><span class="nb">echo</span> <span class="s1">&#39;#!/bin/sh&#39;</span> &gt; /usr/bin/g++
</span><span class='line'><span class="nb">echo</span> <span class="s1">&#39;exec gcc.orig -mno-tls-direct-seg-refs $@&#39;</span> &gt;&gt; /usr/bin/gcc
</span><span class='line'><span class="nb">echo</span> <span class="s1">&#39;exec g++.orig -mno-tls-direct-seg-refs $@&#39;</span> &gt;&gt; /usr/bin/g++
</span><span class='line'>chmod a+x /usr/bin/gcc
</span><span class='line'>chmod a+x /usr/bin/g++
</span></code></pre></td></tr></table></div></figure>


<p>Extract the Ruby Enterprise Edition. Be careful to use a fresh extracted version to compile, because the files will not be recompiled. Compile and install Ruby Enterprise Edition as stated in the manual.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>tar zxvf ruby-enterprise-1.8.7-2009.10.tar.gz
</span><span class='line'>./ruby-enterprise-1.8.7-2009.10/installer
</span></code></pre></td></tr></table></div></figure>


<p>Don&#8217;t forget to reinstall passenger, and off course reinstall all the gems from the old installation.</p>

<p>Now you can restore gcc and g++ as this will probably break yum updates of gcc and g++.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>rm -rf /usr/bin/gcc <span class="o">&amp;&amp;</span> mv /usr/bin/gcc.orig /usr/bin/gcc
</span><span class='line'>rm -rf /usr/bin/g++ <span class="o">&amp;&amp;</span> mv /usr/bin/g++.orig /usr/bin/g++
</span></code></pre></td></tr></table></div></figure>


<p>Hopefully I&#8217;ve saved you guys some time ;-)</p>
]]></content>
  </entry>
  
</feed>
