<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Moves On Rails</title>
    <link>http://movesonrails.com/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>New ways to look at software</description>
    <item>
      <title>Rails/Javascript programmer at Nedap</title>
      <description>&lt;p&gt;Location: Groenlo, The Netherlands&lt;/p&gt;

&lt;p&gt;URL: &lt;a href="http://www.nedaphealthcare.com"&gt;http://www.nedaphealthcare.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://jobs.37signals.com/logos/0000/1700/logo.gif?1229595344"/&gt;&lt;/p&gt;

&lt;p&gt;Nedap Healthcare, market leader in the dutch home healthcare sector, is looking for a skilled and motivated web developer with a knack for interaction design. We provide an inspiring work environment with a mixture of coding and direct contact with our customers.&lt;/p&gt;

&lt;p&gt;Even though Nedap is a fairly large company we work in small teams. Should you choose to accept, you will become the fourth member of our Moves team. Moves is a two year old web application that is sold to home healthcare organizations in combination with a 24" iMac. It allows planners to create routes that make the client, nurse and managers happy. If you want some more info about what we build and how we think, check our blog (listed below).&lt;/p&gt;

&lt;p&gt;As a developer you should be proficient in HTML/CSS/Javascript and Ruby on Rails. Flash is a bonus, just like photoshop skills. Working in the healthcare business, we aim to develop most of our code using a BDD methodology.&lt;/p&gt;

&lt;p&gt;We are based in Groenlo, a small dutch town near the german border. Though we are not necessarily looking for an on site developer we do prefer someone who is able to drop by from time to time regularly. Freelance is an option if you prefer.&lt;/p&gt;

&lt;p&gt;We are offering a great job and unique company culture. It is important to us to build an excellent product by cherry-picking great people, not by bloating our team.&lt;/p&gt;

&lt;p&gt;To apply
If you are interested send your resume to &lt;a href="mailto:andre.foeken@nedap.com"&gt;andre.foeken@nedap.com&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 18 Dec 2008 23:41:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6da83900-00e0-44f9-9b32-7eb9faddeb0b</guid>
      <author>bart.tenbrinke@movesonrails.com (Bart ten Brinke)</author>
      <link>http://movesonrails.com/articles/2008/12/18/rails-javascript-programmer-at-nedap</link>
      <category>Rails</category>
      <category>Ruby</category>
      <category>Nedap</category>
      <category>rails</category>
      <category>nedap</category>
      <category>Moves</category>
      <category>Job</category>
      <category>offer</category>
    </item>
    <item>
      <title>Trust</title>
      <description>&lt;p&gt;Every time I read a set of terms and conditions attached to a piece of software my heart bleeds a little. I wanted to share a small excerpt from a dutch company that I translated. I replaced the company name.&lt;/p&gt;

&lt;p&gt;The product in question is a web-based tool for small/medium sized companies to handle their invoicing. Some would consider this piece of software 'critical' to the companies' survival.&lt;/p&gt;

&lt;p&gt;Would you trust this company with your finances if their terms stated the following?&lt;/p&gt;

&lt;blockquote&gt;
We have the right to close any account, with or without notice. If you lose content because of this we are not responsible.
&lt;/blockquote&gt;

&lt;p&gt;Wow! At any moment they may decide to kill your 'critical' business proces. This doesn't feel right... But it goes on.&lt;/p&gt;

&lt;blockquote&gt;
We preserve the right to suspend or stop [product] at any time, with or without notice.
&lt;/blockquote&gt;

&lt;p&gt;In other words: if we get bored, we can just quit. We don't even have to tell you!&lt;/p&gt;

&lt;p&gt;In my opinion the next one is characteristic about what is wrong with the software industry as a whole.&lt;/p&gt;

&lt;blockquote&gt;
We don't guarantee that: 1) [product] meets your specific requirements, 2) [product] works correctly, 3) errors in [product] will be fixed.
&lt;/blockquote&gt;

&lt;p&gt;One can argue about the first point but the last two? Would you accept this behaviour if you bought a car? Luckily they have a specific condition in their terms to handle their customers reaction to these terms!&lt;/p&gt;

&lt;blockquote&gt;
Every form of threat/contempt directed at [company] employees will result in immediate closure of your account.
&lt;/blockquote&gt;

&lt;p&gt;Well there you have it, unfortunately some terms might be required to protect your startup from the big bad world around. But using your terms to give yourself an easy way out? Dubious.&lt;/p&gt;</description>
      <pubDate>Thu, 27 Nov 2008 21:57:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:0b97f60f-f5ac-47e1-854b-4ce1eef275a9</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/11/27/trust</link>
      <category>terms</category>
      <category>bad</category>
      <category>industry</category>
    </item>
    <item>
      <title>RoR Workshop - 26 nov 2008</title>
      <description>&lt;p&gt;This afternoon we held our first Ruby on Rails Workshop at Twente University. We got 20 Apple MacBooks together and allowed 25 people to bask in the glory of Rails!&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src="http://www.movesonrails.com/files/IMG_2547.JPG" width="320"/&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;We want to thank everyone who attended for their enthousiasm and energy. We had a great time! Also great thanks to Pragmatic Programmer for giving us a good deal on their latest Rails book and Inter-&lt;i&gt;Actief&lt;/i&gt; (Michel) for their organisational skills.&lt;/p&gt;

&lt;p&gt;Below are the sheets we used, courtesy of SlideShare.&lt;/p&gt;

&lt;div style="width:425px;text-align:left" id="__ss_791431"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/foeken/nedap-rails-workshop-presentation?type=powerpoint" title="Nedap Rails Workshop"&gt;Nedap Rails Workshop&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=rails-workshop-v2-1227725331819432-9&amp;stripped_title=nedap-rails-workshop-presentation" /&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=rails-workshop-v2-1227725331819432-9&amp;stripped_title=nedap-rails-workshop-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View SlideShare &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/foeken/nedap-rails-workshop-presentation?type=powerpoint" title="View Nedap Rails Workshop on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/nedap"&gt;nedap&lt;/a&gt; &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/rails"&gt;rails&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 26 Nov 2008 19:44:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:b730322d-22d7-43ab-b8f3-51bbc3dffc19</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/11/26/ror-workshop-26-nov-2008</link>
      <category>Rails</category>
      <category>Ruby</category>
      <category>Nedap</category>
      <category>workshop</category>
      <category>inter</category>
      <category>actief</category>
    </item>
    <item>
      <title>User Authorization in Rails</title>
      <description>&lt;p&gt;A lot of rails apps use some form of user login.
Usually a user identifies itself by entering a username/password combination into a form.
The application will then check the combination and use the session of the user to store which user authenticated for that session.&lt;/p&gt;

&lt;p&gt;Plugins like acts_as_authenticated give a nice starting point, but must applications write authorazation themselves as it is quite simple to do in Rails. If you have done this too, then here are a number of security points which such login process should take into account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brute forcing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rails apps are usually tweaked to respond to requests as quickly as possible.
If a response is slow, it will block my mongrel!
This makes Rails apps a very good partner for the brute forcing of passwords.
Action against this is surprisingly simple.
You can count the number of incorrect login attempts.
If this becomes more then 10, let the user enter a captcha.
Or really degrade the login by rejecting every login attempt with a 403, when the last incorrect login attempt was less then two or three seconds ago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP login posting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many sites offer a login box on their front page.
This is a very user friendly and I would be the last person to tell you not to do this.
However, this often means that you are letting a user authenticate over HTTP, which is not very secure.
Anyone snooping the traffic of that user will see a plaintext username and password being posted to your site.
Poke around with Webscarab or Firebug in Firefox to pick up on these things easily.&lt;/p&gt;

&lt;p&gt;Solutions are again easy. If you have a HTTPS part of your site, make sure the login form posts to it.
If you do not have HTTPS, you can encrypt the password in the clients browser with javascript via a public/private key combination. A lot of good examples of this can be found all over the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session hacking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the moment Rails supports two types of sessions.
It can reside serverside in a file or database and clientside in the cookie of the client.&lt;/p&gt;

&lt;p&gt;We will first discuss the server side session, as this was the default before Rails 2.1.
When a user connects to your website, he will automatically receive a unique session id.
This is is the only thing your application can use to distinguish between unique users and their requests.
The default session ids in Rails are generated correctly, so that is very hard for someone to guess ids of other users using your application.
But if a hacker does acquire a session id of another user, Rails will not offer you any protection by default.
And there actually quite a few ways for a hacker to obtain session ids of other users.
The two most commonly used being: Cross Site Scripting exploits (XSS) and code injection.&lt;/p&gt;

&lt;p&gt;Why is this a problem? Well if an attacker shares a session id with another user, and that user logs in, the attacker will share their session.
This means that the attacker will have the same privileges as the user.
Countering this can be a bit of a hassle, but as every application is sure to have a XSS exploit somewhere, it is a hole that is important to plug.&lt;/p&gt;

&lt;p&gt;First you need to reset sessions after a logon. This will counter any creatively crafted URL attacks.
Secondly it is a good idea to fixate your sessions on the ip used in the login attempt and you also should take a look at sesion expiration.&lt;/p&gt;

&lt;p&gt;Clientside sessions have the same problems, so don't count on them as being the ultimate solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL injection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially I wanted to leave this out, i as the problem is still so common, I decided to have it here anyway.
Rail does provide you with SQL injection protection, but you still have to use it correctly in order to be safe.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;User.find(:conditions =&amp;gt;
   ["username = #{username} AND password = MD5(#{password})"])

User.find_by_username_and_password(username, SHA(password))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;They both work, but the first one can be easily exploited through SQL injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This will not magically fix all your user authorization problems, but it should point you in some interesting directions.  Want to read more? Here are a few good places to start reading.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://guides.rails.info/securing_rails_applications/security.html"&gt;http://guides.rails.info/securing&lt;em&gt;rails&lt;/em&gt;applications/security.html&lt;/a&gt;
&lt;a href="http://www.rorsecurity.info"&gt;http://www.rorsecurity.info&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 22 Oct 2008 10:51:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1749dd8c-eb30-4dfd-9155-409b59f79a72</guid>
      <author>bart.tenbrinke@movesonrails.com (Bart ten Brinke)</author>
      <link>http://movesonrails.com/articles/2008/10/22/user-authorization-in-rails</link>
      <category>use</category>
      <category>authorization</category>
      <category>problem</category>
      <category>rails</category>
    </item>
    <item>
      <title>Friday afternoon ...</title>
      <description>&lt;p&gt;A nice time to build a realtime thermometer of the usage of our latest product...&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src="http://www.movesonrails.com/files/IMG_0135.JPG" border="0" width="400"/&gt;&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 26 Sep 2008 16:47:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:44233e49-d9aa-49e5-9129-87d8f02c80f4</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/09/26/friday-afternoon</link>
      <category>Nedap</category>
    </item>
    <item>
      <title>Webrat Story Steps driving Selenium</title>
      <description>&lt;p&gt;From now on driving Selenium with your stories is a breeze. If you have been using the webrat_story_steps plugin (available &lt;a href="http://github.com/foeken/webrat_story_steps/"&gt;here&lt;/a&gt; ) you can now add a single file and get started right away. You don't even have to rewrite your stories (unless you have some custom steps, that took me about 10 minutes to rewrite)!&lt;/p&gt;

&lt;p&gt;The new changes to the plugin require you to do some installing beforehand (2 gems and 2 other plugins) but after that it's easy.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;embed id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=-5697116161033113243&amp;amp;hl=en&amp;amp;fs=true" style="width:400px;height:326px" allowFullScreen="true" allowScriptAccess="always" type="application/x-shockwave-flash"&gt; &lt;/embed&gt;&lt;/center&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 11 Sep 2008 09:32:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:58cb94b0-d89c-40f9-a93c-f342ede61534</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/09/11/webrat-sory-steps-driving-selenium</link>
      <category>Rspec</category>
      <category>Stories</category>
      <category>selenium</category>
      <category>easy</category>
      <category>start</category>
    </item>
    <item>
      <title>Simple Net::Http stubbing / mocking</title>
      <description>&lt;p&gt;Recently I've been implementing a simple web-service protocol that used Net::Http instead of ActiveResource magic. Although it was easy to mock ActiveResource objects, I found it hard to find any intel on how to mock actual Net::Http calls.&lt;/p&gt;

&lt;p&gt;Below is a very basic example (which you can easily expand to fit your needs) of how to mock your calls. The example below shows a simple snippet that results in all 'posts' to be result in a Net::HttpSuccess object with a given XML body (which you can define)&lt;/p&gt;

&lt;script src="http://gist.github.com/8553.js"&gt;&lt;/script&gt;

&lt;p&gt;Now define the XML data as follows:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Net::HTTP::xml_data = nil
&lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 03 Sep 2008 08:57:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b945aa8e-35ec-49b1-beb0-e6717d461812</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/09/03/simple-net-http-mocking</link>
      <category>Rails</category>
      <category>Ruby</category>
      <category>Mock</category>
      <category>http</category>
    </item>
    <item>
      <title>Lighthouse Keeper 1.0</title>
      <description>&lt;p&gt;It's always great to see how a great concept can become even better. Lighthouse has been our issue tracker for quite some time now and we've been very happy with it so far. But I always felt something was missing. I don't mind going to a web page when I want to report an issue for some open-source project or to post a message to a dev, but during working hours I like to be as efficient as possible.&lt;/p&gt;

&lt;p&gt;One of my pet peeves has always been that it takes such a long time to find a specific ticket when you don't have a browser open. Sometimes we get helpdesk calls and then it's always good to see if an issue is already in the system. To figure this out we need to open safari, go to lighthouse, log in, go to the tickets page, click search, figure out a search term and wait for the page to load. All in this process can take quite a while.&lt;/p&gt;

&lt;p&gt;Using &lt;a href="http://www.mcubedsw.com/"&gt;Lighthouse Keeper&lt;/a&gt; this has been reduced to Command-Tab, click search field and go. Instant results, so no more waiting. But we still have all of the advantages of the web-based system we've come to love. Sure the program has some rough edges but nothing that cannot be resolved with a few minor updates.&lt;/p&gt;

&lt;p&gt;I recommend every Lighthouse user to take a look at this nifty little program, and at &amp;euro; 30 it's a real steal. Keep up the good work guys!&lt;/p&gt;</description>
      <pubDate>Fri, 29 Aug 2008 16:21:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:3c60e346-62a7-4345-b0bc-f243b69295ea</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/08/29/lighthouse-keeper-1-0</link>
      <category>handy</category>
      <category>tool</category>
      <category>lighthouse</category>
      <category>ticket</category>
      <category>project</category>
      <category>efficienct</category>
      <category>keeper</category>
    </item>
    <item>
      <title>Webrat Story Steps</title>
      <description>&lt;p&gt;We have just released a plugin for Rails making it much easier to use Rspec Stories for your integration tests!&lt;/p&gt;

&lt;p&gt;Clone it &lt;a href="http://github.com/foeken/webrat_story_steps/"&gt;here&lt;/a&gt; from github.&lt;/p&gt;

&lt;p&gt;No longer will you have to figure out your own grammar. We have done it for you. Now you are able to write stuff like this out of the box:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;pre&gt;
    Given a user with username 'Dummy' exists
    And it has password 'monkey'
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Even relationships (has many and belongs to are supported!)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;pre&gt;
    Given the administrator is logged in
    And a user with username 'A' exists
    And the user with username 'A' has a responsibility for / 
    the role with name 'Administrator'
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Naturally we also support a lot of clicking, selecting and checking!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;pre&gt;
    When he clicks the 'Admin' link
    And he clicks the 'Roles' link
    And he clicks the 'Add a new role' link
    When he selects 'Planner'
    And he clicks the button
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Even simple Javascript popups!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;pre&gt;
   Then he should see a popup with the message 'Are you sure?'
   When he confirms the popup
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And it's simple to extend. We extended it to allow us to check our importer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;pre&gt;
    Given the latest version of iO Connect is used
    And there are no addresses in the system
    When a client with objectId '1' is created in iO
    And an address with street '1st' is created in iO
    And the importer has been run&lt;br/&gt;
    Then an imported address with street '1st' should exist in Moves
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 19 Aug 2008 14:11:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1181d763-82ce-47a3-a495-a2388365478c</guid>
      <author>andre.foeken@movesonrails.com (Andre Foeken)</author>
      <link>http://movesonrails.com/articles/2008/08/19/webrat-story-steps</link>
    </item>
    <item>
      <title>Rails Request log analyzer</title>
      <description>&lt;p&gt;You've probably all been there: your application is running slow, but why? What views or actions are clogging up the mongrels? Or are the mongrels just waiting for the database?&lt;/p&gt;

&lt;p&gt;Request log analyzer is a simple but very powerful command-line analysis tool to quickly determine what is taking time, on all kinds of different levels. At the moment it can tell you the following statistics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Top 10 most requested actions&lt;/li&gt;
&lt;li&gt;Top 10 actions by time - cumulative&lt;/li&gt;
&lt;li&gt;Top 10 actions by time - per request mean&lt;/li&gt;
&lt;li&gt;Top 10 worst DB offenders - cumulative time&lt;/li&gt;
&lt;li&gt;Top 10 worst DB offenders - mean time&lt;/li&gt;
&lt;li&gt;Mongrel process blockers (&gt; 1.0 seconds) - frequency&lt;/li&gt;
&lt;li&gt;Requests graph - requests per hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an example run, or the analyzer take a look at the github.
&lt;a href="http://github.com/wvanbergen/request-log-analyzer/"&gt;http://github.com/wvanbergen/request-log-analyzer/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install, run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo gem install wvanbergen-request-log-analyzer --source http://gems.github.com
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Thu, 14 Aug 2008 22:58:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:af66f557-bf78-4b31-b5aa-60618aaf455e</guid>
      <author>bart.tenbrinke@movesonrails.com (Bart ten Brinke)</author>
      <link>http://movesonrails.com/articles/2008/08/14/rails-log-analyzer</link>
      <category>Rails</category>
      <category>Ruby</category>
      <category>log</category>
      <category>analyzer</category>
      <category>command</category>
      <category>line</category>
    </item>
  </channel>
</rss>
