<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Jarmo Pertman is an enthusiastic developer using the Ruby programming language. He is one of the core developers of the popular automated testing framework Watir. He is also responsible for some other libraries like WatirSplash, RAutomation, Win32::Screenshot and require_all. IT Really Matters is his personal blog where he tries to write about stuff that really matter in IT.</description><title>IT Really Matters</title><generator>Tumblr (3.0; @itreallymatters)</generator><link>http://itreallymatters.net/</link><item><title>That’s why i always test in IE.</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_m44s1z0Nam1qa9b99o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;That’s why i always test in IE.&lt;/p&gt;</description><link>http://itreallymatters.net/post/23177889897</link><guid>http://itreallymatters.net/post/23177889897</guid><pubDate>Wed, 16 May 2012 22:41:00 +0300</pubDate><category>testing</category></item><item><title>jQuery Deferred at HTML5 Meetup</title><description>&lt;a href="http://prezi.com/wj9-kn8ocnyo/deferred/"&gt;jQuery Deferred at HTML5 Meetup&lt;/a&gt;: &lt;p&gt;I gave recently a short presentation about &lt;a href="http://api.jquery.com/category/deferred-object/" target="_blank"&gt;jQuery Deferred&lt;/a&gt; at &lt;a href="http://www.meetup.com/html5estonia/events/62285602/" target="_blank"&gt;HTML5 meetup&lt;/a&gt;. Here is the link to the presentation itself made with &lt;a href="http://prezi.com" target="_blank"&gt;Prezi&lt;/a&gt;.&lt;/p&gt;</description><link>http://itreallymatters.net/post/22978723245</link><guid>http://itreallymatters.net/post/22978723245</guid><pubDate>Sun, 13 May 2012 20:06:19 +0300</pubDate></item><item><title>Hacker Says</title><description>&lt;p&gt;Today is a special day, because &lt;a href="http://hackersays.com" target="_blank"&gt;Hacker Says&lt;/a&gt; - the micro-site created with the help of my friend &lt;a href="https://twitter.com/theml" target="_blank"&gt;Andri Möll&lt;/a&gt; - got released! Wohoo!&lt;/p&gt;

&lt;p&gt;It has interesting, funny and important quotes which apply to software development, programming and life in general. And that all is available for viewing in three different themes!&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a preview of &lt;a href="http://hackersays.com" target="_blank"&gt;Hacker Says&lt;/a&gt; using Sepia theme:&lt;br/&gt;&lt;a href="http://hackersays.com" target="_blank"&gt;&lt;img src="http://dl.dropbox.com/u/2731643/blog/hackersays.png"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Backend has been written in Ruby using &lt;a href="http://www.sinatrarb.com/" target="_blank"&gt;Sinatra&lt;/a&gt;, &lt;a href="http://sass-lang.com/" target="_blank"&gt;Sass&lt;/a&gt; and &lt;a href="http://haml-lang.com/" target="_blank"&gt;Haml&lt;/a&gt;. Front-end uses JavaScript with HTML5 pushState. It is deployed to &lt;a href="http://www.heroku.com/" target="_blank"&gt;Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have fun and put it on some large screen at your office for that extra daily entertainment!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update #2 (2012.05.24) &lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Today we released an improved version of &lt;a href="http://hackersays.com" target="_blank"&gt;Hacker Says&lt;/a&gt;. We took all the feedback into account. Let us know what you think of it!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;These are statistics for the first two days:&lt;br/&gt;&lt;img src="http://dl.dropbox.com/u/2731643/blog/hackersays-ga.png"/&gt;&lt;/p&gt;

&lt;p&gt;Not bad at all. We got the feedback from the users to prepare for another launch with improvements. This is how &lt;a href="http://en.wikipedia.org/wiki/Minimum_viable_product" target="_blank"&gt;MVP&lt;/a&gt; should be done!&lt;/p&gt;</description><link>http://itreallymatters.net/post/22673515221</link><guid>http://itreallymatters.net/post/22673515221</guid><pubDate>Wed, 09 May 2012 00:55:00 +0300</pubDate><category>ruby</category><category>sinatra</category><category>hacker</category><category>programming</category></item><item><title>Stupidity Of Usability</title><description>&lt;p&gt;
Usability is one of the most required features of any website or product. If there&amp;#8217;s no usability then there&amp;#8217;s no product. In this short post i&amp;#8217;m showing lack of usability on one of the most popular websites. I&amp;#8217;m not gonna mention which website i&amp;#8217;m talking about - i&amp;#8217;m pretty sure that you won&amp;#8217;t figure it out yourself either ;)
&lt;/p&gt;

&lt;h3&gt;Let&amp;#8217;s Start!&lt;/h3&gt;

&lt;p&gt;
I have a conversation log and i wan&amp;#8217;t to delete it. For this i will use the appropriate menu item under &amp;#8220;Actions&amp;#8221; (1 + 1 = &lt;b&gt;2 clicks&lt;/b&gt;):
&lt;/p&gt;

&lt;img src="http://dl.dropbox.com/u/2731643/blog/stupidity_of_usability/1.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;
Then i have to specify that i want to delete all the history (2 + 1 = &lt;b&gt;3 clicks&lt;/b&gt;):
&lt;/p&gt;

&lt;img src="http://dl.dropbox.com/u/2731643/blog/stupidity_of_usability/2.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;
Do i really mean it? Yes i do! (3 + 1 = &lt;b&gt;4 clicks&lt;/b&gt;)
&lt;/p&gt;

&lt;img src="http://dl.dropbox.com/u/2731643/blog/stupidity_of_usability/3.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;
Oops, what is that?
&lt;/p&gt;

&lt;img src="http://dl.dropbox.com/u/2731643/blog/stupidity_of_usability/4.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;
Of course it can&amp;#8217;t be found because you just deleted it, doh! And i have to close that dialog too (4 + 1 = &lt;b&gt;5 clicks&lt;/b&gt;).
&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;
There you have it. There&amp;#8217;s no way to make that process easier with less clicks than &lt;b&gt;five&lt;/b&gt; and creating better user experience. Especially useful is that last error message. I don&amp;#8217;t know what would i have done if that message hadn&amp;#8217;t guided me through that painful process. Thank you very much! And of course good luck finding that &amp;#8220;Action&amp;#8221; menu item :)
&lt;/p&gt;

&lt;p&gt;
This is how you delete a conversation from the gmail. Just click the recycle bin icon (1 click):
&lt;/p&gt;

&lt;img src="http://dl.dropbox.com/u/2731643/blog/stupidity_of_usability/5.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;
And you&amp;#8217;re done:
&lt;/p&gt;

&lt;img src="http://dl.dropbox.com/u/2731643/blog/stupidity_of_usability/6.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;
Just &lt;b&gt;one&lt;/b&gt; click! And you have this helpful message with even more &lt;a href="http://support.google.com/mail/bin/answer.py?hl=en&amp;amp;ctx=mail&amp;amp;answer=7401" target="_blank"&gt;helpful url&lt;/a&gt; to the help page if you&amp;#8217;re still confused. And if you did delete that conversation by accident then just click on &amp;#8220;Undo&amp;#8221;.
&lt;/p&gt;

&lt;p&gt;
Next time if you need to implement some new functionality then think twice before starting coding. Or thrice.
&lt;/p&gt;</description><link>http://itreallymatters.net/post/21283541941</link><guid>http://itreallymatters.net/post/21283541941</guid><pubDate>Tue, 17 Apr 2012 23:56:58 +0300</pubDate><category>ux</category><category>usability</category></item><item><title>Would you accept that License Agreement?</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m22zg6jXiG1qa9b99o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Would you accept that License Agreement?&lt;/p&gt;</description><link>http://itreallymatters.net/post/20617134902</link><guid>http://itreallymatters.net/post/20617134902</guid><pubDate>Sat, 07 Apr 2012 02:19:18 +0300</pubDate></item><item><title>What if all these virtual constraints applied to real life too?</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_m19bfcdoZw1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;What if all these virtual constraints applied to real life too?&lt;/p&gt;</description><link>http://itreallymatters.net/post/19700097178</link><guid>http://itreallymatters.net/post/19700097178</guid><pubDate>Thu, 22 Mar 2012 00:50:00 +0200</pubDate></item><item><title>Real Life Photoshop</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lyv8lr0yNk1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Real Life Photoshop&lt;/p&gt;</description><link>http://itreallymatters.net/post/17025098628</link><guid>http://itreallymatters.net/post/17025098628</guid><pubDate>Sat, 04 Feb 2012 13:15:27 +0200</pubDate></item><item><title>Browser Wars</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lxp20nt45l1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Browser Wars&lt;/p&gt;</description><link>http://itreallymatters.net/post/15725987270</link><guid>http://itreallymatters.net/post/15725987270</guid><pubDate>Thu, 12 Jan 2012 18:33:59 +0200</pubDate><category>browser</category></item><item><title>Today’s Marriage</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_luyn61HZir1qa9b99o1_400.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Today’s Marriage&lt;/p&gt;</description><link>http://itreallymatters.net/post/13873791902</link><guid>http://itreallymatters.net/post/13873791902</guid><pubDate>Wed, 07 Dec 2011 17:00:06 +0200</pubDate></item><item><title>Harmless Checkin</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_luyn0ws8VS1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Harmless Checkin&lt;/p&gt;</description><link>http://itreallymatters.net/post/13546762581</link><guid>http://itreallymatters.net/post/13546762581</guid><pubDate>Wed, 30 Nov 2011 17:02:05 +0200</pubDate></item><item><title>Freaky Wireless Technology</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_luymwwHKwZ1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Freaky Wireless Technology&lt;/p&gt;</description><link>http://itreallymatters.net/post/13205113238</link><guid>http://itreallymatters.net/post/13205113238</guid><pubDate>Wed, 23 Nov 2011 17:01:05 +0200</pubDate></item><item><title>Speedup Ruby 1.9.3 On Windows</title><description>&lt;p&gt;
&lt;a href="http://ruby-lang.org" target="_blank"&gt;Ruby&lt;/a&gt; is a great programming language, but unfortunately it does have some problems when using on Windows. One of it&amp;#8217;s biggest drawbacks is it&amp;#8217;s slowness when loading files. This is also slower than it ought to be on Unix platforms, but not as slow as on Windows. Thankfully there is some work going on to make it faster in future versions. It&amp;#8217;s already possible to make it faster yourself!
&lt;/p&gt;

&lt;h3&gt;Benchmarks&lt;/h3&gt;

&lt;p&gt;
I will conduct two types of benchmarks. Firstly i&amp;#8217;m gonna create an empty Rails 3 project and see how much time would it boot up. Secondly there is a project called &lt;a href="https://github.com/jonforums/measurements" target="_blank"&gt;measurements&lt;/a&gt; which allows to perform some operations on your Ruby and one of these are benchmarks for loading files. Let&amp;#8217;s see how it goes for Ruby 1.9.2, 1.9.3 from RubyInstaller and patched 1.9.3.
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# ruby 1.9.2p136

C:\&amp;gt;rails new empty-192 -d sqlite3
# ...
Using rails (3.1.1)

C:\empty-192&amp;gt;timer ruby script\rails runner ""
      user     system      total        real
  0.000000   0.016000   0.016000 ( 28.808579)

C:\measurements&amp;gt;rci bench core_require_empty &amp;amp;&amp;amp; rci bench core_require_nested
ruby 1.9.2p136 (2010-12-25) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   2.917000   7.722000  10.639000 ( 10.755556)
-------------------------------------------- total: 10.639000sec

                         user     system      total        real
core_require_empty   3.167000   7.815000  10.982000 ( 11.133547)
ruby 1.9.2p136 (2010-12-25) [i386-mingw32]
Rehearsal -------------------------------------------------------
core_require_nested   3.556000   8.736000  12.292000 ( 12.453693)
--------------------------------------------- total: 12.292000sec

                          user     system      total        real
core_require_nested   3.526000   9.188000  12.714000 ( 13.157714)


# ruby 1.9.3p0 from RubyInstaller

C:\&amp;gt;rails new empty-193-p0 -d sqlite3
# ...
Using rails (3.1.1)

C:\empty-193-p0&amp;gt;timer ruby script\rails runner ""
       user     system      total        real
   0.000000   0.000000   0.000000 ( 17.425940)

C:\measurements&amp;gt;rci bench core_require_empty &amp;amp;&amp;amp; rci bench core_require_nested
ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   3.120000   9.937000  13.057000 ( 13.278704)
-------------------------------------------- total: 13.057000sec

                         user     system      total        real
core_require_empty   3.167000   9.578000  12.745000 ( 13.231747)
ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
Rehearsal -------------------------------------------------------
core_require_nested   3.822000  11.373000  15.195000 ( 15.853803)
--------------------------------------------- total: 15.195000sec

                          user     system      total        real
core_require_nested   3.822000  11.653000  15.475000 ( 16.779881)


# Ruby 1.9.3p0 patched

C:\&amp;gt;rails new empty-193-faster -d sqlite3
# ...
Using rails (3.1.1)

C:\empty-193-faster&amp;gt;timer ruby script\rails runner ""
       user     system      total        real
   0.000000   0.000000   0.000000 (  9.184323)

C:\measurements&amp;gt;rci bench core_require_empty &amp;amp;&amp;amp; rci bench core_require_nested
ruby 1.9.3p0 (2011-11-08 revision 33661) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   2.620000   5.616000   8.236000 (  9.144510)
--------------------------------------------- total: 8.236000sec

                         user     system      total        real
core_require_empty   2.247000   5.179000   7.426000 (  7.930452)
ruby 1.9.3p0 (2011-11-08 revision 33661) [i386-mingw32]
Rehearsal -------------------------------------------------------
core_require_nested   2.496000   5.522000   8.018000 (  8.123630)
---------------------------------------------- total: 8.018000sec

                          user     system      total        real
core_require_nested   2.652000   5.960000   8.612000 (  8.861500)
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=bench.txt"&gt;&lt;/script&gt;&lt;p&gt;
These benchmarks show that Ruby 1.9.2 is really slow and patched 1.9.3 got about 50% performance boost compared to regular 1.9.3. That&amp;#8217;s something to be happy about! I&amp;#8217;m using average laptop PC which means that if you have a more decent hardware then the results might be very different from me.
&lt;/p&gt;

&lt;h3&gt;Prerequisites&lt;/h3&gt;

&lt;p&gt;
The following components are needed to speedup your Ruby:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ruby 1.9.3 from &lt;a href="http://rubyinstaller.org/downloads/" target="_blank"&gt;RubyInstaller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyinstaller.org/downloads/" target="_blank"&gt;Devkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/msysgit/" target="_blank"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
If you&amp;#8217;d like to skip all that hassle of building all the things yourself then you can download already prebuilt patched Ruby versions too! Read the &amp;#8220;Faster Way&amp;#8221; part about that below.
&lt;/p&gt;

&lt;h3&gt;Get Fenix&lt;/h3&gt;

&lt;p&gt;
&lt;a href="https://github.com/luislavena/fenix" target="_blank"&gt;Fenix&lt;/a&gt; is a Ruby extension written by &lt;a href="http://twitter.com/luislavena" target="_blank"&gt;Luis Lavena&lt;/a&gt;. Luis is a really helpful and great guy, at least when it comes to Ruby on Windows. He is part of the Ruby core team, is the main man behind RubyInstaller and has created many nice libraries like &lt;a href="https://github.com/luislavena/rake-compiler" target="_blank"&gt;sqlite3-ruby&lt;/a&gt;, &lt;a href="https://github.com/luislavena/rake-compiler" target="_blank"&gt;rake-compiler&lt;/a&gt; and &lt;a href="https://github.com/luislavena" target="_blank"&gt;many others&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Back to Fenix. It changes &lt;i&gt;File.expand_path&lt;/i&gt; method to be faster. All the 50% speedup seen from the benchmarks were coming from this change since this method is called more than once when loading files. Pretty impressive or rather sad bottleneck in Ruby. Get the Fenix extension, compile and benchmark it:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\&amp;gt;git clone git://github.com/luislavena/fenix.git
Initialized empty Git repository in C:/fenix/.git/
# ...

C:\&amp;gt;devkit\devkitvars.bat
Adding the DevKit to PATH...

C:\fenix&amp;gt;rake compile
# ...
install -c tmp/i386-mingw32/fenix/1.9.3/fenix.so lib/fenix.so

C:\fenix&amp;gt;rake bench
File.expand_path: 10000 times.
                                user     system      total        real
Ruby ''                     0.297000   0.593000   0.890000 (  0.884027)
Fenix ''                    0.062000   0.000000   0.062000 (  0.066004)
Ruby '.'                    0.312000   0.546000   0.858000 (  0.876040)
Fenix '.'                   0.062000   0.000000   0.062000 (  0.060000)
Ruby 'foo', 'bar'           0.312000   0.983000   1.295000 (  1.328060)
Fenix 'foo', 'bar'          0.078000   0.000000   0.078000 (  0.106003)
Ruby '', 'C:/'              0.031000   0.000000   0.031000 (  0.031000)
Fenix '', 'C:/'             0.047000   0.000000   0.047000 (  0.050000)
Ruby 'foo', 'C:/'           0.171000   1.965000   2.136000 (  2.248100)
Fenix 'foo', 'C:/'          0.047000   0.000000   0.047000 (  0.054003)
Ruby '~'                    0.530000   0.562000   1.092000 (  1.111063)
Fenix '~'                   0.094000   0.000000   0.094000 (  0.100006)
Ruby '~/foo'                0.468000   0.827000   1.295000 (  1.321076)
Fenix '~/foo'               0.078000   0.000000   0.078000 (  0.076005)
Ruby 'foo/'                 0.280000   0.624000   0.904000 (  0.917052)
Fenix 'foo/'                0.078000   0.000000   0.078000 (  0.071004)
Ruby '~', 'C:/Foo'          0.375000   0.717000   1.092000 (  1.110063)
Fenix '~', 'C:/Foo'         0.093000   0.000000   0.093000 (  0.090005)
Ruby long_path              0.203000   0.016000   0.219000 (  0.214006)
Fenix long_path             0.203000   0.000000   0.203000 (  0.207005)
Ruby long_path, 'rel'       0.421000   0.734000   1.155000 (  1.237058)
Fenix long_path, 'rel'      0.234000   0.000000   0.234000 (  0.227013)
Ruby long_path, 'C:/Foo'    0.375000   1.981000   2.356000 (  2.470126)
Fenix long_path, 'C:/Foo'   0.187000   0.000000   0.187000 (  0.184010)
Ruby full_long_path         0.156000   0.015000   0.171000 (  0.170010)
Fenix full_long_path        0.156000   0.000000   0.156000 (  0.183011)
Ruby to_path                0.234000   0.359000   0.593000 (  0.619036)
Fenix to_path               0.062000   0.000000   0.062000 (  0.071004)
Ruby to_path, 'rel'         0.468000   0.999000   1.467000 (  1.455083)
Fenix to_path, 'rel'        0.094000   0.000000   0.094000 (  0.091006)
Ruby to_path, 'C:/Foo'      0.390000   2.262000   2.652000 (  2.844161)
Fenix to_path, 'C:/Foo'     0.078000   0.000000   0.078000 (  0.090005)
Ruby full_to_path           0.390000   1.950000   2.340000 (  2.526143)
Fenix full_to_path          0.031000   0.000000   0.031000 (  0.044003)
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=fenix.txt"&gt;&lt;/script&gt;&lt;p&gt;
Not bad benchmark results.
&lt;/p&gt;

&lt;h3&gt;Patching &amp;amp; Compiling Ruby&lt;/h3&gt;

&lt;p&gt;
Unfortunately only &lt;i&gt;File.expand_path&lt;/i&gt; method is faster when using this extension, but there&amp;#8217;s Ruby&amp;#8217;s &lt;i&gt;require&lt;/i&gt; and &lt;i&gt;load&lt;/i&gt; methods, which also execute &lt;i&gt;expand_path&lt;/i&gt;, but they will do so by using internal C &lt;i&gt;expand_path&lt;/i&gt; function instead. Solution for that problem is to patch Ruby code to use &lt;i&gt;Fenix.expand_path&lt;/i&gt; internally also! First step would be to clone Ruby itself (make sure that line endings are not converted by Git):
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\&amp;gt;git config --global core.autocrlf false &amp;amp;&amp;amp; git clone -b ruby_1_9_3 git@github.com:ruby/ruby.git
Initialized empty Git repository in C:/ruby/.git/
# ...
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=ruby.txt"&gt;&lt;/script&gt;&lt;p&gt;
Apply the &lt;a href="https://gist.github.com/1360449#file_0001_make_load_and_require_use_file_expand_path_and_file_realpath.diff" target="_blank"&gt;patch created by Luis&lt;/a&gt;:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\ruby&amp;gt;git clone git://gist.github.com/1360449.git expand_path-patch
C:\ruby&amp;gt;git apply -v expand_path-patch\0001-make-load-and-require-use-file-expand_path-and-file-realpath.diff
Checking patch file.c...
Checking patch load.c...
Applied patch file.c cleanly.
Applied patch load.c cleanly.

C:\ruby&amp;gt;git status
# On branch ruby_1_9_3
# Changed but not updated:
#   (use "git add &lt;file&gt;..." to update what will be committed)
#   (use "git checkout -- &lt;file&gt;..." to discard changes in working directory)
#
#       modified:   file.c
#       modified:   load.c
&lt;/file&gt;&lt;/file&gt;&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=patch.txt"&gt;&lt;/script&gt;&lt;p&gt;
`git status` shows us that &lt;i&gt;file.c&lt;/i&gt; and &lt;i&gt;load.c&lt;/i&gt; files are modified. It&amp;#8217;s time to start compiling Ruby itself. Best way to do that would be to use RubyInstaller itself (how ironic, we&amp;#8217;re using Ruby to build Ruby). Make sure to disable ANSICON too since it is known to cause problems during the compilation process:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\rubyinstaller&amp;gt;..\ansicon\x64\ansicon.exe -u
C:\rubyinstaller&amp;gt;rake ruby19 NOGEMS=1 NOTK=1 LOCAL=..\ruby
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=ruby_compile.txt"&gt;&lt;/script&gt;&lt;p&gt;
This takes some time and if the process raises any errors, just try again. If there&amp;#8217;s still errors don&amp;#8217;t hesitate to write to &lt;a href="http://groups.google.com/group/rubyinstaller" target="_blank"&gt;RubyInstaller mailing list&lt;/a&gt; or contact Luis directly. He&amp;#8217;s very helpful, as i already stated above.
&lt;/p&gt;

&lt;p&gt;
After the process is done &amp;#8220;install&amp;#8221; new Ruby with Fenix and make sure that it&amp;#8217;s used by setting environment variables too:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\rubyinstaller&amp;gt;xcopy /E /I sandbox\ruby19_mingw \ruby193-faster
# ...
C:\rubyinstaller&amp;gt;cd ..\fenix
C:\fenix&amp;gt;xcopy /E /I lib \ruby193-faster\lib\ruby\1.9.1\i386-mingw32
lib\fenix.so
lib\fenix\replace.rb
2 File(s) copied
C:\fenix&amp;gt;set PATH=c:\ruby193-faster\bin;%PATH%
C:\fenix&amp;gt;set RUBYOPT=-rfenix/replace
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=install.txt"&gt;&lt;/script&gt;&lt;p&gt;
Make sure that the PATH and RUBYOPT environment variables are set permanently. And try it out if it&amp;#8217;s faster for you too!
&lt;/p&gt;

&lt;h3&gt;Faster Way&lt;/h3&gt;

&lt;p&gt;
In case you don&amp;#8217;t want to spend your time cloning, compiling and testing then there is a faster way to boost your Ruby. There exists a project called &lt;a href="http://thecodeshop.github.com/" target="_blank"&gt;The Code Shop&lt;/a&gt;, which tries to solve the Ruby performance problem on Windows. It makes different &lt;a href="https://github.com/thecodeshop/ruby/wiki/Downloads" target="_blank"&gt;builds available to download&lt;/a&gt;, each experimenting with different set of patches. I can recommend tcs-ruby193_require_winio_fenix-20111113 because it seems to be the fastest. Here are some benchmark results: 
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# tcs-ruby193_winio_fenix-20111113
C:\empty-193&amp;gt;timer ruby script\rails runner ""
       user     system      total        real
   0.000000   0.000000   0.000000 (  6.802955)


C:\measurements&amp;gt;rci bench core_require_empty &amp;amp;&amp;amp; rci bench core_require_nested
tcs-ruby 1.9.3p0 (2011-11-08) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   2.044000   2.589000   4.633000 (  4.726269)
--------------------------------------------- total: 4.633000sec

                         user     system      total        real
core_require_empty   1.778000   2.746000   4.524000 (  4.652266)
tcs-ruby 1.9.3p0 (2011-11-08) [i386-mingw32]
Rehearsal -------------------------------------------------------
core_require_nested   2.075000   3.603000   5.678000 (  5.779272)
---------------------------------------------- total: 5.678000sec

                          user     system      total        real
core_require_nested   2.028000   3.526000   5.554000 (  5.791128)



# tcs-ruby193_require_winio_fenix-20111113
C:\empty-193&amp;gt;timer ruby script\rails runner ""
       user     system      total        real
   0.000000   0.000000   0.000000 (  5.635120)


C:\measurements&amp;gt;rci bench core_require_empty &amp;amp;&amp;amp; rci bench core_require_nested
tcs-ruby 1.9.3p0 (2011-11-08) [i386-mingw32]
Rehearsal ------------------------------------------------------
core_require_empty   1.497000   2.948000   4.445000 (  4.571255)
--------------------------------------------- total: 4.445000sec

                         user     system      total        real
core_require_empty   1.326000   3.151000   4.477000 (  4.577208)
tcs-ruby 1.9.3p0 (2011-11-08) [i386-mingw32]
Rehearsal -------------------------------------------------------
core_require_nested   1.732000   3.650000   5.382000 (  5.529468)
---------------------------------------------- total: 5.382000sec

                          user     system      total        real
core_require_nested   1.716000   3.604000   5.320000 (  5.437311)
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1360438.js?file=tcs_bench.txt"&gt;&lt;/script&gt;&lt;p&gt;
Fenix is already precompiled into these builds. You still need to &lt;del&gt;compile and install Fenix and&lt;/del&gt; set PATH and RUBYOPT environments as described above.
&lt;/p&gt;

&lt;h3&gt;In Conclusion&lt;/h3&gt;

&lt;p&gt;
The main point of this post is that things aren&amp;#8217;t always as rosy as they could be, but it&amp;#8217;s possible to make them better. It is really valuable that you give feedback to projects like The Code Shop (e.g. what are your benchmark results) so the final result could get better in the future without any additional hassle for everyone. I hope that you can now start your engines much faster!
&lt;/p&gt;</description><link>http://itreallymatters.net/post/12897174267</link><guid>http://itreallymatters.net/post/12897174267</guid><pubDate>Thu, 17 Nov 2011 00:37:00 +0200</pubDate><category>ruby</category></item><item><title>An Update is Available for Your Computer</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lueug366tt1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;An Update is Available for Your Computer&lt;/p&gt;</description><link>http://itreallymatters.net/post/12566068902</link><guid>http://itreallymatters.net/post/12566068902</guid><pubDate>Wed, 09 Nov 2011 22:33:39 +0200</pubDate></item><item><title>Awesome Page Objects In Testing</title><description>&lt;p&gt;
I mentioned &lt;i&gt;page objects&lt;/i&gt; in the &lt;a href="http://itreallymatters.net/post/9085718628/watirsplash-2" target="_blank"&gt;post about WatirSplash 2&lt;/a&gt;. In this post i&amp;#8217;m gonna explain what these things exactly are and how to use them.
&lt;/p&gt;

&lt;h3&gt;What Is A Page?&lt;/h3&gt;

&lt;p&gt;
When it comes to automated testing then the page is really nothing else than the page user sees when visiting the website. Any meaningful page consists of different components some of which just show information (e.g. text) others allow interaction (e.g. text fields and buttons). Different pages might also have some shared content like header, search field and footer. One important thing about components is that the result of some interactions is another page.
&lt;/p&gt;

&lt;p&gt;
Let me bring you a concrete example. Let&amp;#8217;s look at the &lt;a href="http://bing.com" target="_blank"&gt;Bing&amp;#8217;s main page&lt;/a&gt; (enough of Google in all examples, alright). You can think of the possible sections (Web, Images, Videos, News and More) as a header. There is also the &lt;i&gt;search field&lt;/i&gt; and &lt;i&gt;button&lt;/i&gt;. &lt;i&gt;Search button&lt;/i&gt; is special since clicking on it changes the current page to &lt;i&gt;results page&lt;/i&gt;. Makes sense? Let&amp;#8217;s see how to convert that information into &lt;i&gt;WatirSplash Page Objects&lt;/i&gt;.
&lt;/p&gt;

&lt;h3&gt;Point Of Having Page Objects&lt;/h3&gt;

&lt;p&gt;
The point of having Page Objects is to have better structured code and keep it &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself" target="_blank"&gt;DRY&lt;/a&gt; in your tests too. This all makes your tests easier to maintain. If you&amp;#8217;re a software developer then you care about these things when it comes to production code. Why not to use these good practices in tests also? Page Objects make it all possible. Having Page Objects means that it should be easier to change your tests if the application under test (AUT) changes since you need only one place (ideally) to change. Page Objects also make it very clear where to find existing and put the new code.
&lt;/p&gt;

&lt;h3&gt;Let&amp;#8217;s Get Rockin&amp;#8217; With Pages And Objects&lt;/h3&gt;

&lt;p&gt;
Let&amp;#8217;s get more concrete. I assume that you have created a WatirSplash 2 project already. If not then follow the instructions in the &lt;a href="http://itreallymatters.net/post/9085718628/watirsplash-2" target="_blank"&gt;post about WatirSplash 2&lt;/a&gt; or read everything you need to know straight from the &lt;a href="https://github.com/jarmo/WatirSplash/blob/master/README.rdoc" target="_blank"&gt;README&lt;/a&gt;. Let&amp;#8217;s create the Main page first:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\my_project\ui-test&amp;gt;watirsplash page main --url &lt;a href="http://bing.com" target="_blank"&gt;http://bing.com&lt;/a&gt;
      create  lib
      create  lib/app/page/main.rb
       exist  spec
      create  spec/app/page/main_spec.rb
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=main.cmd"&gt;&lt;/script&gt;&lt;p&gt;
This command created us the Main page object and a test for it. The generated file looks like this:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/main.rb
module App
  module Page
    class Main 
&lt;/pre&gt;&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=main.rb"&gt;&lt;/script&gt;&lt;p&gt;
And the test itself is nothing fancy yet:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# spec/app/page/main_spec.rb
describe App::Page::Main do
  it "has something on the main page" do
    main_page = App::Page::Main.new
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=main_spec.rb"&gt;&lt;/script&gt;&lt;p&gt;
Let&amp;#8217;s add something meaningful to our Main page object like search field and button:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/main.rb
module App
  module Page
    class Main  "q")
      end

      def search_button
        button(:name =&amp;gt; "go")
      end
    end
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=main_2.rb"&gt;&lt;/script&gt;&lt;p&gt;
You can use all the familiar &lt;a href="http://watir.com" target="_blank"&gt;Watir&lt;/a&gt; methods directly in your Page objects! For the sake of clarity let&amp;#8217;s also add Header functionality. To do that we&amp;#8217;d just use Ruby&amp;#8217;s mixin functionality - the &lt;i&gt;Header&lt;/i&gt; module:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/_header.rb
module App
  module Page
    module Header
      def sections
        ul(:id =&amp;gt; "sch_scopes").lis
      end
    end
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=_header.rb"&gt;&lt;/script&gt;&lt;p&gt;
And make sure to include it into your page object:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/main.rb
module App
  module Page
    class Main 
&lt;/pre&gt;&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=main_3.rb"&gt;&lt;/script&gt;&lt;p&gt;
We can now update our main_spec to actually test something:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# spec/app/page/main_spec.rb
describe App::Page::Main do
  let(:main_page) {App::Page::Main.new}

  it "has header with sections" do
    main_page.sections.should have(5).items
  end

  it "allows to search" do
    main_page.search_field.set "watirsplash jarmo"
    results_page = main_page.search_button.click
    results_page.results.count.should == 10
    results_page.results[0].text.should =~ /watirsplash/i
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=main_spec_3.rb"&gt;&lt;/script&gt;&lt;p&gt;
I made two tests - one for the header and another for the search functionality. Since header should be on every page, i could have taken advantage of the &lt;a href="https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/example-groups/shared-example-group" target="_blank"&gt;RSpec&amp;#8217;s Shared Examples&lt;/a&gt; feature, but for the sake of this post&amp;#8217;s clarity i didn&amp;#8217;t.
&lt;/p&gt;

&lt;p&gt;
The second test is a failing test since there&amp;#8217;s no way that Watir&amp;#8217;s &lt;i&gt;Button#click&lt;/i&gt; will return us a results page object. But hey, i&amp;#8217;ve just done a little &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank"&gt;TDD&lt;/a&gt; here! Let&amp;#8217;s make it work like we want it to work:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/main.rb
module App
  module Page
    class Main  "go"),
          :click =&amp;gt; lambda {redirect_to Results}
      end
    end
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1328007.js?file=main4.rb"&gt;&lt;/script&gt;&lt;p&gt;
I&amp;#8217;ve used the &lt;i&gt;WatirSplash::Page::Base#modify&lt;/i&gt; method which takes some object as it&amp;#8217;s first argument (here button) and a Hash as a second argument. Hash consists of method name as a key and value as Proc object. In this particular case the code above overrides this particular button&amp;#8217;s &lt;i&gt;#click&lt;/i&gt; method with my &lt;i&gt;#click&lt;/i&gt;, which returns Results page object due to the usage of &lt;i&gt;#redirect_to&lt;/i&gt; method. Since &lt;i&gt;#click&lt;/i&gt; is already existing method on that button, then it will call the original method (e.g. performs the actual clicking) before calling the defined block. The &lt;i&gt;#modify&lt;/i&gt; method does all that by using Ruby&amp;#8217;s meta-programming. You can always &lt;a href="https://github.com/jarmo/WatirSplash/blob/master/lib/watirsplash/page/base.rb#L32-45" target="_blank"&gt;look at the source&lt;/a&gt; itself if you&amp;#8217;re more interested in the nitty-gritty details.
&lt;/p&gt;

&lt;p&gt;
Let&amp;#8217;s create ourselves a Results page object with the &lt;i&gt;results&lt;/i&gt; method. This time, let&amp;#8217;s be even cooler and generate more code than we did with the Main page object:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
C:\my_project\ui-test&amp;gt;watirsplash page results results:ul:id:wg0 --no-spec
       exist  lib
      create  lib/app/page/results.rb
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=results.cmd"&gt;&lt;/script&gt;&lt;p&gt;
This generated us the Results class with the &lt;i&gt;results&lt;/i&gt; method:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/results.rb
module App
  module Page
    class Results  "wg0")
      end

    end
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1325268.js?file=results.rb"&gt;&lt;/script&gt;&lt;p&gt;
Let&amp;#8217;s add the &lt;i&gt;#count&lt;/i&gt; and &lt;i&gt;#[]&lt;/i&gt; methods to our &lt;i&gt;#results&lt;/i&gt; object by using &lt;i&gt;#modify&lt;/i&gt; again so we could chain method invocations naturally as i&amp;#8217;ve written in the search functionality test:
&lt;/p&gt;

&lt;noscript&gt;
&lt;pre&gt;
# lib/app/page/results.rb
module App
  module Page
    class Results  "wg0"),
          :count =&amp;gt; lambda {results.lis(:class =&amp;gt; "sa_wr").size},
          :[] =&amp;gt; lambda {|i| results.li(:class =&amp;gt; "sa_wr", :index =&amp;gt; i)}
      end
    end
  end
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;script src="https://gist.github.com/1328007.js?file=results_2.rb"&gt;&lt;/script&gt;&lt;p&gt;
I&amp;#8217;m invoking the &lt;i&gt;#results&lt;/i&gt; method again to get the &lt;i&gt;Watir::Ul&lt;/i&gt; element to execute regular Watir methods on it - in these cases &lt;i&gt;#li&lt;/i&gt; and &lt;i&gt;#lis&lt;/i&gt;. This neat trick hides the implementation details from the tests and makes the tests even more natural to read.
&lt;/p&gt;

&lt;h3&gt;In Conclusion&lt;/h3&gt;

&lt;p&gt;
That&amp;#8217;s it - we have created a few tests using Page Objects functionality in &lt;a href="http://github.com/jarmo/watirsplash" target="_blank"&gt;WatirSplash 2&lt;/a&gt;! Using Page Objects makes your tests (hopefully) more readable and easier to maintain. I like my implementation when compared to others because it makes your page objects to look really succinct and doesn&amp;#8217;t add any additional complex API to learn - you can use already learnt Watir methods as you did before. And &lt;a href="https://github.com/jarmo/WatirSplash/blob/master/lib/watirsplash/page/base.rb" target="_blank"&gt;the code written&lt;/a&gt; to support creating and using these Page Objects is also quite clever and short. I love it! I hope you will too.
&lt;/p&gt;</description><link>http://itreallymatters.net/post/12242886944</link><guid>http://itreallymatters.net/post/12242886944</guid><pubDate>Wed, 02 Nov 2011 17:41:00 +0200</pubDate><category>watir</category><category>ruby</category><category>testing</category><category>watirsplash</category></item><item><title>Solutions To The Hardest Problems</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lt99f86YiD1qa9b99o1_400.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Solutions To The Hardest Problems&lt;/p&gt;</description><link>http://itreallymatters.net/post/11607937103</link><guid>http://itreallymatters.net/post/11607937103</guid><pubDate>Tue, 18 Oct 2011 12:37:56 +0300</pubDate></item><item><title>Angry Birds Anger Management</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lsqlajCcYB1qa9b99o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Angry Birds Anger Management&lt;/p&gt;</description><link>http://itreallymatters.net/post/11174028163</link><guid>http://itreallymatters.net/post/11174028163</guid><pubDate>Sat, 08 Oct 2011 10:39:55 +0300</pubDate></item><item><title>Facebook, Watir And Testing</title><description>&lt;p&gt;
I&amp;#8217;ve known some time now that &lt;a href="http://www.facebook.com" target="_blank"&gt;Facebook&lt;/a&gt; has been using &lt;a href="http://www.watir.com" target="_blank"&gt;Watir&lt;/a&gt; as their integration testing tool. Hell, there&amp;#8217;s even a Facebook logo on the main page of &lt;a href="http://watir.com" target="_blank"&gt;watir.com&lt;/a&gt;. But today was a special day because i had to read one article about &lt;a href="http://www.facebook.com/notes/facebook-engineering/watir-to-webdriver-unit-test-frameworks/10150314152278920" target="_blank"&gt;Facebook moving away from Watir&lt;/a&gt;. 
&lt;/p&gt;

&lt;h3&gt;Confusions&lt;/h3&gt;

&lt;p&gt;
Since i&amp;#8217;m one of the few core developers of Watir then this article made me notice statements which are not true or are just misleading. It seems to me that the author of that post doesn&amp;#8217;t know the insights of Watir and other tools he&amp;#8217;s mentioning or just uses wrong terminology by accident.
&lt;/p&gt;

&lt;h3&gt;Watir &amp;amp; JavaScript&lt;/h3&gt;

&lt;p&gt;
First statement which forced me to questioning myself was the following: &lt;i&gt;“Watir automates the browser with JavaScript…”&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
It took me some time before i understood that the author had &lt;i&gt;FireWatir&lt;/i&gt; in his mind and not the &lt;i&gt;Watir&lt;/i&gt; itself. FireWatir was used to automate Firefox browser and it truly used JavaScript as it&amp;#8217;s engine to perform all the automations. Watir on the other hand controls &lt;i&gt;Internet Explorer&lt;/i&gt; and uses it&amp;#8217;s &lt;a href="http://en.wikipedia.org/wiki/OLE_Automation" target="_blank"&gt;OLE interface&lt;/a&gt; instead to control the browser. This means in effect that there&amp;#8217;s almost no JavaScript used in Watir.
&lt;/p&gt;

&lt;h3&gt;Watir&amp;#160;!= Watir-WebDriver&amp;#160;!= WebDriver&lt;/h3&gt;

&lt;p&gt;
The next statement causing confusion is: &lt;i&gt;“The Watir we adopted in 2009 has since been improved, integrating a new protocol called WebDriver which allows you to automate the browser more accurately and with more power than could previously be done with straight JavaScript.”&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
First - Watir has been improved indeed when compared to year 2009 :) This is a good thing and a true statement. Second - Watir doesn&amp;#8217;t integrate with the new protocol called WebDriver - it does still use OLE. I&amp;#8217;m not exactly sure what the author means by the end of his statement about more accuracy and power. And of course - third - as mentioned already, Watir itself doesn&amp;#8217;t use JavaScript and didn&amp;#8217;t even do that in the year of 2009.
&lt;/p&gt;

&lt;p&gt;
I think that you can call the WebDriver as a protocol, but the most famous implementation of that protocol is for sure &lt;a href="http://code.google.com/p/selenium/" target="_blank"&gt;Selenium-WebDriver aka Selenium 2&lt;/a&gt;. &lt;a href="https://github.com/jarib/watir-webdriver" target="_blank"&gt;Watir-WebDriver&lt;/a&gt; is a library written on top of Selenium-WebDriver&amp;#8217;s &lt;a href="http://www.ruby-lang.org" target="_blank"&gt;Ruby&lt;/a&gt; bindings. In other words it is an improved API over Selenium&amp;#8217;s API. At least this is the way, we, Watir-loving people like to think. It does even have some API improvements which &lt;i&gt;vanilla&lt;/i&gt; Watir doesn&amp;#8217;t have yet. There is a project called &lt;a href="https://github.com/jarib/watirspec" target="_blank"&gt;WatirSpec&lt;/a&gt;, which is &lt;i&gt;the&lt;/i&gt; specification for Watir&amp;#8217;s API. Even Watir itself doesn&amp;#8217;t conform to that yet. But the ultimate goal is to make Watir-WebDriver and Watir 100% compatible with each other.&lt;a href="http://watir.com/2011/08/11/watir-2-0/" target="_blank"&gt; Latest releases of Watir&lt;/a&gt; have been moving towards that goal.
&lt;/p&gt;

&lt;h3&gt;Abandoning Watir&lt;/h3&gt;

&lt;p&gt;
And then i have to read the saddest statement of that article: &lt;i&gt;“Once I understood all these factors, my course of action seemed clear: Abandon Watir, create a WebDriver client in PHP, and reuse our mature PHP unit test system for our browser tests. The WebDriver protocol was straightforward enough that I had a fully featured client in PHP by the end of a weekend&amp;#8217;s work.”&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
On the one hand i&amp;#8217;m happy that the engineers in the Facebook try to make things better - having the same technologies used between different projects is always a good thing. On the other hand i&amp;#8217;m not sure i understand as to why they had to create a new PHP WebDriver bindings. Looking from the main page of Selenium 2 i can see that there&amp;#8217;s already two seemingly active projects doing just that - &lt;a href="http://code.google.com/p/php-webdriver-bindings/" target="_blank"&gt;php-webdriver-bindings&lt;/a&gt; and &lt;a href="https://github.com/chibimagic/WebDriver-PHP" target="_blank"&gt;WebDriver-PHP&lt;/a&gt;. Maybe engineers at Facebook had good reasons why not to use something already existing. Maybe they just like to feel more challenged and want to invent few bicycles in a while. I don&amp;#8217;t know.
&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;
After all it was an interesting read. Since i&amp;#8217;ve used Watir about 4 years now then it&amp;#8217;s nice to read that someone else had similar or completely different solutions to the same problems. I like the thing about Facebook that it tries to be more open to the world when it comes to the topics of the tools and processes used to make, maintain and release such a widely used product.
&lt;/p&gt;

&lt;p&gt;
On the other hand, posts having false information in them tend to have a strong effect on people using the tools under fire. Especially if this kind of information is originating from a trustworthy source. From that post it seems that it is time to abandon Watir since it is too old and not developed anymore. That&amp;#8217;s just plain wrong. Watir is still actively developed and one of the biggest reasons why not to abandon Watir at this moment is that it is still the best automation tool for Internet Explorer. Watir-WebDriver&amp;#8217;s IE driver is just not mature enough. Sorry, WebDriver guys. I would be happy to run all my tests with Watir-WebDriver since that would give me an opportunity to test with different browsers, but as long as IE is not working properly, then i just can&amp;#8217;t do that. Since IE is the brittlest and still most used browser, then testing with that browser just seems to be mandatory.
&lt;/p&gt;

&lt;p&gt;
I have to agree that if the person is not tied with all or some of these projects on a daily basis then it is hard to understand the difference between Watir, Watir-WebDriver and WebDriver. Maybe the biggest problem is just that the topics aren&amp;#8217;t documented enough?
&lt;/p&gt;</description><link>http://itreallymatters.net/post/10991877834</link><guid>http://itreallymatters.net/post/10991877834</guid><pubDate>Tue, 04 Oct 2011 00:19:19 +0300</pubDate><category>watir</category><category>facebook</category><category>testing</category></item><item><title>Fighting Against Gem Hell</title><description>&lt;p&gt;There is a term called &lt;a href="http://en.wikipedia.org/wiki/DLL_Hell" target="_blank"&gt;DLL Hell&lt;/a&gt; which in my opinion exists also in the &lt;a href="http://www.ruby-lang.org" target="_blank"&gt;Ruby&lt;/a&gt; community with the different name - Gem Hell. This potential problem exists when dependencies for your project and/or libraries are not managed properly.
&lt;/p&gt;

&lt;p&gt;
I&amp;#8217;ve written in the post &lt;a href="http://www.itreallymatters.net/post/9085718628/watirsplash-2" target="_blank"&gt;WatirSplash 2&lt;/a&gt; about loading all the dependencies with the help of the &lt;a href="http://gembundler.com/" target="_blank"&gt;Bundler&lt;/a&gt;, which helps to organize the dependencies in a sanely way and tries to eliminate the Gem Hell problem. In this post i&amp;#8217;m gonna give a more detailed overview of how the things were before and how they are now in the &lt;a href="https://github.com/jarmo/watirsplash" target="_blank"&gt;WatirSplash&lt;/a&gt; framework. 
&lt;/p&gt;

&lt;h3&gt;Story Behind WatirSplash&amp;#8217; Dependencies&lt;/h3&gt;

&lt;p&gt;
Since WatirSplash is a framework which supports using different frameworks for browser automation (&lt;i&gt;Watir&lt;/i&gt;, &lt;i&gt;Watir-WebDriver&lt;/i&gt; and &lt;i&gt;FireWatir&lt;/i&gt;) then there needs to be some kind of a mechanism for defining the install and runtime dependencies. Install dependencies are easy to specify since they can be put right into the &lt;i&gt;.gemspec&lt;/i&gt; file of the WatirSplash gem and &lt;a href="http://rubygems.org/" target="_blank"&gt;RubyGems&lt;/a&gt; does all the heavylifting:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1192631.js?file=gemspec.rb"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
Gem::Specification.new do |s|
  # ...  
  s.add_dependency("rake", "0.8.7")
  s.add_dependency("require_all")
  s.add_dependency("syntax")
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
It gets trickier when it comes to specifying the runtime dependencies. &amp;#8220;Why runtime dependencies at all?&amp;#8221; - you might ask. The answer to this question is fairly simple - because the framework used for automating the browser is chosen during runtime and it&amp;#8217;s not possible to put all these gems into installation dependencies due to the problem of &lt;a href="http://watir.com/" target="_blank"&gt;Watir&lt;/a&gt; (for controlling the IE browser) not installing successfully on Linux or OS X operating systems for obvious reasons. There are also other OS-specific gems. Also, it&amp;#8217;s not possible (at least not in my knowledge of) to specify platform specific dependencies right into the &lt;i&gt;.gemspec&lt;/i&gt; file itself.
&lt;/p&gt;

&lt;h3&gt;The Old Way&lt;/h3&gt;

&lt;p&gt;
The runtime dependencies in WatirSplash 1 were loaded with the help of the RubyGems itself. When the desired framework was specified then WatirSplash loaded the appropriate file, which executed the code similar to this for Watir:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1192631.js?file=load_watir.rb"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
begin
  gem "watir", "=2.0.1"
  require "watir"
rescue Gem::LoadError
  puts "\nWatir dependency is missing. Install it with:"
  puts "  gem install watir -v 2.0.1"
  exit 1
end
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
It meant that the user of WatirSplash needed to have the Watir version 2.0.1 installed and if he didn&amp;#8217;t then the installation instructions were provided.
&lt;/p&gt;

&lt;p&gt;
This solution seems to solve the problem of specifying runtime dependencies at first. There are still some problems with this approach. First of all, if Watir has a dependency for some other gem without any specific or with too loose version then it is possible that some newer version of that gem breaks the usage of WatirSplash and i, as a maintainer of the WatirSplash gem, have to release a new version of the WatirSplash gem by specifying the exact version of that gem as a runtime dependency. Second problem is that if a newer version of Watir (or any other among the runtime dependency gems) were released then it was not possible for the user of WatirSplash to try if it was working with the current version of WatirSplash (which was pretty often the case) without modifying the code of WatirSplash itself or waiting for the new release made by me with updated runtime dependencies. These are the two main and quite big problems with this approach.
&lt;/p&gt;

&lt;h3&gt;The New Way&lt;/h3&gt;

&lt;p&gt;
These problems were solved by introducing the usage of Bundler. Bundler allows to specify runtime dependencies exactly like with RubyGems, but it has a difference of locking down the dependencies versions. This means that user A and user B are always using the same versions of all the runtime dependencies no matter what other versions they have installed on their system.
&lt;/p&gt;

&lt;p&gt;
By using WatirSplash 2, you will get the following &lt;i&gt;Gemfile&lt;/i&gt; into your specs directory, when running new project generator, for specifying all the needed dependencies:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1192631.js?file=Gemfile.rb"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
source :rubygems

# load WatirSplash and it's dependencies
gem "watirsplash", "2.1.1"

platforms :mingw, :mswin do
    gem "watir", "2.0.1"
    gem "win32screenshot", "~&amp;gt;1.0.5", :require =&amp;gt; "win32/screenshot"
end

gem "watir-webdriver", "~&amp;gt;0.3.1"
gem "firewatir", "&amp;gt;= 1.9.3"
gem "rspec", "~&amp;gt;2.6.0"
gem "spork", "~&amp;gt;0.9.0.rc9"

# add your project specific dependencies here:
# gem "ruby-debug", "0.10.3"
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
After executing `&lt;i&gt;bundle install&lt;/i&gt;` do not forget to add &lt;i&gt;Gemfile.lock&lt;/i&gt; also into your &lt;a href="http://en.wikipedia.org/wiki/Revision_control" target="_blank"&gt;VCS&lt;/a&gt; - this is the only way to guarantee that everyone who is running the tests are using the exact same versions of the dependencies.
&lt;/p&gt;

&lt;p&gt;
This solution allows each user of the WatirSplash to specify their own dependency versions without any need to wait for the new release of the WatirSplash itself. In other words - this solution solves both of the problems existent in the previous RubyGems solution.
&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;
Bundler tries to make the Gem Hell problem disappear and is doing a pretty good job there, but if there are gems which depend on some external native library, which needs compilation then there is still the danger of having a wrong version of that dependency causing compilation errors. Probability of seeing that problem is quite low compared to the problems which Bundler solves. All in all Bundler is a really great tool and thanks to that WatirSplash has gotten even better.
&lt;/p&gt;</description><link>http://itreallymatters.net/post/9886880315</link><guid>http://itreallymatters.net/post/9886880315</guid><pubDate>Tue, 06 Sep 2011 23:12:25 +0300</pubDate><category>ruby</category><category>watir</category><category>watirsplash</category><category>bundler</category><category>testing</category></item><item><title>I have been using the screenshot to obtain IE screen captures. This works well when have a remote desktop session to the IE virtual machine. However, I notice that the capture is a black screen when there is no remote desktop session even though the user session still exists.</title><description>&lt;p&gt;Yes, that is a known limitation Windows blocking these system calls when the PC is locked. You can use VNC or some similar remote desktop alternative which emulates the remote PC in a different way and not locking the PC when you disconnect from the remote session.&lt;/p&gt;</description><link>http://itreallymatters.net/post/9785604177</link><guid>http://itreallymatters.net/post/9785604177</guid><pubDate>Sun, 04 Sep 2011 14:31:49 +0300</pubDate></item><item><title>WatirSplash 2</title><description>&lt;p&gt;
&lt;a href="https://github.com/jarmo/watirsplash" target="_blank"&gt;WatirSplash 2&lt;/a&gt; has been released already some time ago, but i haven&amp;#8217;t covered the nice things which came with it. This situation will be improved with the following posts.
&lt;/p&gt;

&lt;h3&gt;New Features&lt;/h3&gt;

&lt;p&gt;
The biggest changes in WatirSplash 2 compared to version 1.x are:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.itreallymatters.net/post/9886880315/fighting-against-gem-hell" target="_blank"&gt;Loading all dependencies with the help of Bundler.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixed support for Ruby 1.9.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://itreallymatters.net/post/12242886944/awesome-page-objects-in-testing" target="_blank"&gt;Introduced so called &lt;i&gt;Page Objects&lt;/i&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Removed cumbersome and usually not needed &amp;#8220;&lt;i&gt;ui-test-common&lt;/i&gt;&amp;#8221; functionality.&lt;/li&gt;
&lt;li&gt;Made WatirSplash more transparent making it easier to follow what, when and how it does the things it does and giving better control over it.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Removed Features&lt;/h3&gt;

&lt;p&gt;
It is quite easy to understand from the &amp;#8220;New Features&amp;#8221; list that projects generated with WatirSplash 1.x won&amp;#8217;t work out of the box with WatirSplash 2. I had to break backwards compatibility due to the decisions made in the past which were in my way improving the framework to make it just &lt;b&gt;&lt;i&gt;a lot&lt;/i&gt;&lt;/b&gt; better.
&lt;/p&gt;

&lt;p&gt;
I&amp;#8217;ve paid attention to the users of WatirSplash and noticed what they didn&amp;#8217;t like or what they have been wanting to do differently. This has caused me to use &lt;i&gt;.rspec&lt;/i&gt; file to configure &lt;a href="http://relishapp.com/rspec" target="_blank"&gt;RSpec&lt;/a&gt; all the way instead of doing it programmatically from the WatirSplash itself. This gives a better control for tuning the usage of RSpec when needed.
&lt;/p&gt;

&lt;p&gt;
Even browser window won&amp;#8217;t be opened and maximized automatically anymore - you can still do it with the help of &lt;i&gt;RSpec.configure&lt;/i&gt; block.
&lt;/p&gt;

&lt;p&gt;
All these little details should make the experience of using WatirSplash even better!
&lt;/p&gt;

&lt;h3&gt;Getting Started&lt;/h3&gt;

&lt;p&gt;
Starting to use WatirSplash is as easy as &lt;i&gt;splashin&amp;#8217; in the water&lt;/i&gt;. First you have to install the gem itself ofcourse:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1154564.js?file=installing.txt"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
C:\my_project&amp;gt;gem install watirsplash
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
After doing that you&amp;#8217;d need to generate a default project structure. It can be done by using the &amp;#8220;&lt;i&gt;new&lt;/i&gt;&amp;#8221; generator:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1154564.js?file=new_project.txt"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
C:\my_project&amp;gt;watirsplash new
      create  ui-test
      ...

C:\my_project&amp;gt;cd ui-test
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
Being inside of the newly created project directory, install all the required dependencies aswell:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1154564.js?file=dependencies.txt"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
C:\my_project\ui-test&amp;gt;bundle install
Fetching source index for &lt;a href="http://rubygems.org/" target="_blank"&gt;http://rubygems.org/&lt;/a&gt;
...
Using watirsplash
...
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
After having that done, generate the very first Page Object with the &amp;#8220;&lt;i&gt;page&lt;/i&gt;&amp;#8221; generator. For example:
&lt;/p&gt;

&lt;script src="https://gist.github.com/1154564.js?file=new_page.txt"&gt;&lt;/script&gt;&lt;noscript&gt;
&lt;pre&gt;
C:\my_project\ui-test&amp;gt;bundle exec watirsplash page search --url &lt;a href="http://bing.com" target="_blank"&gt;http://bing.com&lt;/a&gt;
      create  lib
      create  lib/app/page/search.rb
      create  spec
      create  spec/app/page/search_spec.rb
&lt;/pre&gt;
&lt;/noscript&gt;

&lt;p&gt;
There you have it. Modify the newly generated files and start specc&amp;#8217;ing. There will be a more thorough posts about the main new features including how to use Page Objects in the future - stay tuned. Feel free to read more information about WatirSplash from it&amp;#8217;s repository at &lt;a href="https://github.com/jarmo/watirsplash" target="_blank"&gt;GitHub&lt;/a&gt;.
&lt;/p&gt;</description><link>http://itreallymatters.net/post/9085718628</link><guid>http://itreallymatters.net/post/9085718628</guid><pubDate>Thu, 18 Aug 2011 20:45:00 +0300</pubDate><category>ruby</category><category>watir</category><category>watirsplash</category></item></channel></rss>

