<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.ph7spot.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title type="html">Philippe Hanrigou - News &amp; Discussions</title>
  <author>
    <name>Philippe Hanrigou</name>
    <email>http://ph7spot.com/about/contact_me</email>
    <uri>http://ph7spot.com</uri>
  </author>
  
  <link href="http://feeds.ph7spot.com/ph7" rel="alternate" />
  <subtitle type="html">Tips &amp; Resources on Ruby, Java, Unix, Object-Oriented Programming, Design Patterns and Agile Methodologies.</subtitle>
  <updated>2010-02-26T07:59:17+00:00</updated>
  <rights>Copyright Philippe Hanrigou, all rights reserved. This work is licensed under a Creative Commons Attribution 2.5 License.</rights>
  <generator>FeedTools/0.2.29 - http://www.sporkmonger.com/projects/feedtools/</generator>
  <id>http://feeds.ph7spot.com/ph7</id>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.ph7spot.com/ph7" /><feedburner:info uri="ph7" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><logo>http://ph7spot.com/stylesheets/PH7%20Logo.png?1202363067</logo><entry>
    <title type="html">SystemTimer 1.2 Release</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/7I4UiiWZJd4/system-timer-1-2-release" rel="alternate" />
    <content type="html">&lt;p&gt;I have just published &lt;a href='http://ph7spot.com/musings/system-timer'&gt;&lt;code&gt;SystemTimer&lt;/code&gt;&lt;/a&gt; 1.2 release on &lt;a href='http://gemcutter.org'&gt;Gemcutter&lt;/a&gt;. This new version provides support for custom timeout exceptions, will let you specify sub-second timeouts and plays nicer with Ruby interpreters compiled with &lt;code&gt;-disable-pthreads&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;SystemTimer&lt;/code&gt; latest version with:&lt;/p&gt;

&lt;pre&gt;&lt;code class='sh' lang='sh'&gt;sudo gem install SystemTimer&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class='header' id='support_for_custom_timeout_exceptions'&gt;Support for Custom Timeout Exceptions&lt;/h3&gt;

&lt;p&gt;This version adds support for custom timeout exceptions. This is useful when you want to avoid interference with other libraries already using/catching &lt;code&gt;Timeout::Error&lt;/code&gt; (e.g. &lt;code&gt;Net::HTTP&lt;/code&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code class='ruby' lang='ruby'&gt;&lt;span class='ident'&gt;require&lt;/span&gt; &lt;span class='punct'&gt;&amp;#39;&lt;/span&gt;&lt;span class='string'&gt;system_timer&lt;/span&gt;&lt;span class='punct'&gt;&amp;#39;&lt;/span&gt;

&lt;span class='keyword'&gt;begin&lt;/span&gt;
  &lt;span class='constant'&gt;SystemTimer&lt;/span&gt;&lt;span class='punct'&gt;.&lt;/span&gt;&lt;span class='ident'&gt;timeout_after&lt;/span&gt;&lt;span class='punct'&gt;(&lt;/span&gt;&lt;span class='number'&gt;5&lt;/span&gt;&lt;span class='punct'&gt;,&lt;/span&gt; &lt;span class='constant'&gt;MyCustomTimeoutException&lt;/span&gt;&lt;span class='punct'&gt;)&lt;/span&gt; &lt;span class='keyword'&gt;do&lt;/span&gt;
    &lt;span class='comment'&gt;# Something that should be interrupted if it &lt;/span&gt;
    &lt;span class='comment'&gt;# takes too much time...  even if blocked on &lt;/span&gt;
    &lt;span class='comment'&gt;# a system call!&lt;/span&gt;
  &lt;span class='keyword'&gt;end&lt;/span&gt;
&lt;span class='keyword'&gt;rescue&lt;/span&gt; &lt;span class='constant'&gt;MyCustomTimeoutException&lt;/span&gt; &lt;span class='punct'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='ident'&gt;e&lt;/span&gt;
  &lt;span class='comment'&gt;# Recovering strategy&lt;/span&gt;
&lt;span class='keyword'&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This patch was kindly contributed by &lt;a href='http://github.com/runix'&gt;runix&lt;/a&gt;&lt;/p&gt;

&lt;h3 class='header' id='subsecond_timeouts'&gt;Sub-second Timeouts&lt;/h3&gt;

&lt;p&gt;SystemTimer is going through too many layers to be able to reliably guarantee a sub-second timeout on all platforms, so &amp;#8211; in the original SystemTimer implementation &amp;#8211; the timeout had to be expressed as a number of seconds.&lt;/p&gt;

&lt;p&gt;You can now specify timeouts as a fraction of a second and SystemTimer will do its best to reduce the timeout accordingly. e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code class='ruby' lang='ruby'&gt;&lt;span class='constant'&gt;SystemTimer&lt;/span&gt;&lt;span class='punct'&gt;.&lt;/span&gt;&lt;span class='ident'&gt;timeout_after&lt;/span&gt;&lt;span class='punct'&gt;(&lt;/span&gt;&lt;span class='number'&gt;0.5&lt;/span&gt;&lt;span class='punct'&gt;)&lt;/span&gt; &lt;span class='keyword'&gt;do&lt;/span&gt; 
  &lt;span class='comment'&gt;# timeout after 500ms&lt;/span&gt;
&lt;span class='keyword'&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that for stability reasons SystemTimer will not allow you to go below 200ms, e.g.&lt;/p&gt;

&lt;pre&gt;&lt;code class='ruby' lang='ruby'&gt;&lt;span class='constant'&gt;SystemTimer&lt;/span&gt;&lt;span class='punct'&gt;.&lt;/span&gt;&lt;span class='ident'&gt;timeout_after&lt;/span&gt;&lt;span class='punct'&gt;(&lt;/span&gt;&lt;span class='number'&gt;0.01&lt;/span&gt;&lt;span class='punct'&gt;)&lt;/span&gt; &lt;span class='keyword'&gt;do&lt;/span&gt; 
  &lt;span class='comment'&gt;# timeout at best after (uncompressable) 200ms &lt;/span&gt;
  &lt;span class='comment'&gt;# even if 10ms is requested&lt;/span&gt;
&lt;span class='keyword'&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This feature is based on an idea and original contribution by &lt;a href='http://kpumuk.info/'&gt;Dmytro Shteflyuk&lt;/a&gt; (of &lt;a href='http://scribd.com'&gt;Scribd&lt;/a&gt; fame).&lt;/p&gt;

&lt;h3 class='header' id='better_compatibility_with_'&gt;Better Compatibility with &lt;code&gt;-disable-pthreads&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Changed SystemTimer implementation from using &lt;code&gt;Mutex&lt;/code&gt; to &lt;code&gt;Monitor&lt;/code&gt;. &lt;code&gt;Mutex&lt;/code&gt; causes thread join errors when Ruby is compiled with &lt;code&gt;-disable-pthreads&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thanks again to &lt;a href='http://kpumuk.info/'&gt;Dmytro Shteflyuk&lt;/a&gt; who contributed this patch.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=7I4UiiWZJd4:zZvaJk4zuDM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/7I4UiiWZJd4" height="1" width="1"/&gt;</content>
    <updated>2010-02-26T07:59:17+00:00</updated>
    <published>2010-02-26T07:59:17+00:00</published>
    <id>http://ph7spot.com/blog/system-timer-1-2-release</id>
  <feedburner:origLink>http://ph7spot.com/blog/system-timer-1-2-release</feedburner:origLink></entry>
  <entry>
    <title type="html">Come Join Ventana, We Are Hiring Outstanding Software Craftsmen</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/D4tHitMIrIQ/ventana-is-hiring" rel="alternate" />
    <content type="html">&lt;p&gt;If you&amp;#8217;re looking to do serious software development, work with some of the brightest people you ever met, embrace enabling agile practices, crack computation and machine learning problems that most people consider impossible to solve — all this while revolutionizing our $2.4 trillion Healthcare industry — this is the place. We&amp;#8217;re looking for brilliant, dedicated, and passionate developers to join our star-studded team.&lt;/p&gt;

&lt;p&gt;We value aptitude over experience and essence over ceremony. The only real requirement for the job is an exceptional brain, as well as outstanding drive, curiosity and ethics. We don&amp;#8217;t require any specific languages or technologies in your background or x years of experience: The expectation, however, is that you must be able to pick up technical skills and domain knowledge quickly. Whatever your background, you will have to rapidly ramp up in parallel your analytical and programming skills and push them to the next level.&lt;/p&gt;

&lt;p&gt;While we would be surprised if you had all of the following in your quiver, some examples of what we would love to discover in your background or professional goals include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep mastery of at least one object-oriented or functional programming language&lt;/li&gt;

&lt;li&gt;Solid understanding of Bayesian statistics, networks, and classifiers&lt;/li&gt;

&lt;li&gt;A true passion for coding and the ability to inspire others to create great code&lt;/li&gt;

&lt;li&gt;Solid development practices including Test-Driven-Development, Refactoring, and Pair-Programming&lt;/li&gt;

&lt;li&gt;Fluency in Machine learning, statistical analysis, pattern recognition or Artificial Intelligence&lt;/li&gt;

&lt;li&gt;High proficiency with relational databases and/or tuning complex, extremely data-and processing-intensive mission critical applications to achieve the highest levels of performance&lt;/li&gt;

&lt;li&gt;A taste for exploring innovative technologies such as Ruby, Clojure, Git, Cloud Computing, Key-Value stores, RabbitMQ, Hadoop, Map/Reduce&amp;#8230;&lt;/li&gt;

&lt;li&gt;Exposure to Agile practices, Extreme Programming, and Lean Thinking&lt;/li&gt;

&lt;li&gt;Outstanding academic record in mathematics&lt;/li&gt;

&lt;li&gt;A passion for startups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href='http://ph7spot.com/about/contact_me'&gt;Let me know&lt;/a&gt;, if that&amp;#8217;s your kind of environment and you&amp;#8217;re interested in being part of our top-notch team. In addition to a resume and a note about yourself, please send us a solution to one of the puzzles described at &lt;a href='http://www.ventana.com/corp/careers#puzzles'&gt;http://www.ventana.com/corp/careers#puzzles&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id='why_join_ventana'&gt;Why Join Ventana?&lt;/h1&gt;

&lt;h2 id='its_all_about_the_people'&gt;It&amp;#8217;s All About the People&lt;/h2&gt;

&lt;p&gt;Putting people first is deeply ingrained in Ventana&amp;#8217;s top management and culture : we hire only the most talented individuals and empower them fully so that they make a difference and get things done quickly.&lt;/p&gt;

&lt;p&gt;And our people commitment is not just fluff &amp;#8211; you will be given all the freedom to practice your craft without endless buy-in meetings. We also make sure you get all the tools that make you the most effective: For instance on your first day at Ventana you tell us which computer, keyboard, mouse and office chair make you the most productive, and we will get them for you.&lt;/p&gt;

&lt;h2 id='change_the_world'&gt;Change the World&lt;/h2&gt;

&lt;p&gt;The impact of your opinions, ideas, strategies, and potential will not be limited by your role or job title. This is your opportunity to play an active role in Ventana from the beginning, to make a mark and call it your own. Being supported with a dedicated management team, a strong business model, and solid monetization plans should make you feel at home.&lt;/p&gt;

&lt;p&gt;It is also a unique chance for you to deliver ground-breaking, disruptive services and technology that will fundamentally change one of the most powerful industries in the United States.&lt;/p&gt;

&lt;p&gt;In a nutshell, Ventana is small enough that you can make a difference, yet big enough to positively impact the lives of millions at the most fundamental level: the health of their loved ones.&lt;/p&gt;

&lt;h2 id='excel'&gt;Excel&lt;/h2&gt;

&lt;p&gt;You will be amazed by your colleagues. Not only do we hire outstanding people and leverage the most exciting software and data analysis technologies, but we are always improving. We have daily stand-up meetings and regular retrospectives. We figure out what we&amp;#8217;re doing wrong, so we can fix it, and what we&amp;#8217;re doing right, so that we can make it better. Working here means that you continually hone and improve what you do, every single day.&lt;/p&gt;

&lt;h2 id='challenging_problems_to_crack'&gt;Challenging Problems to Crack&lt;/h2&gt;

&lt;p&gt;As a software developer at Ventana, you will have to solve some of the toughest business, data-analysis, machine-learning, integration, and scalability problems of the IT world. You will be pioneering innovative engineering tools and techniques at the heart of one of the most challenging business domains.&lt;/p&gt;

&lt;p&gt;So why not join? Get in touch!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=D4tHitMIrIQ:JwjGiOenJN4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/D4tHitMIrIQ" height="1" width="1"/&gt;</content>
    <updated>2009-10-01T10:48:18+00:00</updated>
    <published>2009-10-01T10:48:18+00:00</published>
    <id>http://ph7spot.com/blog/ventana-is-hiring</id>
  <feedburner:origLink>http://ph7spot.com/blog/ventana-is-hiring</feedburner:origLink></entry>
  <entry>
    <title type="html">Speaking at MountainWest RubyConf 2009, Salt-Lake City, March 14</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/-zQdGD3EcHY/speaking-at-moutainwest-rubyconf-2009" rel="alternate" />
    <content type="html">&lt;p&gt;I will be speaking at &lt;a href='http://mtnwestrubyconf.org/2009/speakers'&gt;Mountain West RubyConf 2009&lt;/a&gt; on March 14 in Salt Lake City, Utah.&lt;/p&gt;

&lt;p&gt;Last year I was completely &lt;strong&gt;blown away by MountainWest RubyConf&lt;/strong&gt;. I really enjoyed the high quality of its talks and corridor chats, the organizers&amp;#8217; kindness, the flawless program execution, and even more importantly, the conference&amp;#8217;s strong and engaging human dimension. So needless to say I am very excited to be back.&lt;/p&gt;

&lt;p&gt;My talk will be based on Kent Beck&amp;#8217;s great &lt;strong&gt;&lt;a href='http://www.informit.com/store/product.aspx?isbn=013476904X'&gt;&amp;#8220;SmallTalk Best Practice Patterns&amp;#8221;&lt;/a&gt;&lt;/strong&gt; book, and I will do my best to &lt;a href='http://mtnwestrubyconf.org/2009/speakers#ph7'&gt;relay some of his wisdom as it applies to Ruby&lt;/a&gt;. To whet your appetite, &lt;a href='http://www.oreillynet.com/pub/au/2591'&gt;Pat Eyler&lt;/a&gt;, of &lt;a href='http://on-ruby.blogspot.com'&gt;On Ruby&lt;/a&gt; fame, &lt;strong&gt;published a &lt;a href='http://on-ruby.blogspot.com/2009/03/mwrc-2009-mini-interview-philippe.html'&gt;mini-interview&lt;/a&gt; where we provide more context which practitioners the Ruby craftsman could learn from&lt;/strong&gt; and about the relationship between the Ruby and the Smalltalk communities.&lt;/p&gt;

&lt;p&gt;If you are attending the conference, please &lt;strong&gt;&lt;a href='http://ph7spot.com/about/contact_me'&gt;get in touch&lt;/a&gt;&lt;/strong&gt;. I would love to meet up with you.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=-zQdGD3EcHY:hVcYQiPOZVw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/-zQdGD3EcHY" height="1" width="1"/&gt;</content>
    <updated>2009-03-07T10:14:16+00:00</updated>
    <published>2009-03-07T10:14:16+00:00</published>
    <id>http://ph7spot.com/blog/speaking-at-moutainwest-rubyconf-2009</id>
  <feedburner:origLink>http://ph7spot.com/blog/speaking-at-moutainwest-rubyconf-2009</feedburner:origLink></entry>
  <entry>
    <title type="html">Selenium Remote Control and Selenium Grid Receive Top-Notch Safari Support</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/8R0Czaf3lJw/selenium-remote-control-and-grid-get-top-notch-safari-support" rel="alternate" />
    <content type="html">&lt;p&gt;&lt;a href='http://darkforge.blogspot.com/'&gt;Dan Fabulich&lt;/a&gt; integrated a new Safari launcher in &lt;a href='http://selenium-rc.seleniumhq.org'&gt;Selenium Remote Control&lt;/a&gt;. This is big news for Selenium and Selenium Grid users since &lt;strong&gt;this launcher provides a very simple way to bypass the same origin policy and run privileged JavaScript in Safari&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are already familiar with Selenium Remote Control, this essentially means that for Safari you get a mode that is &lt;strong&gt;very much like the &lt;code&gt;*chrome&lt;/code&gt; mode for Firefox&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So, why is this such great news?&lt;/p&gt;

&lt;p&gt;To automate your browsing session &amp;#8211; opening a new Window, clicking on a button, collecting the content of an HTML element &amp;#8211; Selenium is loading a &lt;em&gt;JavaScript&lt;/em&gt; test runner in your browser under the hood. &lt;strong&gt;This JavaScript test runner is the component that actually drives your web application within the browser itself&lt;/strong&gt;. This statement holds true whether you are authoring your tests in HTML, Java, Ruby, Python or Erlang, and whether you are running your tests using &lt;a href='http://selenium-ide.seleniumhq.org'&gt;Selenium IDE&lt;/a&gt;, Selenium Remote Control or &lt;a href='http://selenium-grid.seleniumhq.org'&gt;Selenium Grid&lt;/a&gt;.&lt;/p&gt;
&lt;img src='http://ph7spot.com/images/Selenium/Selenium JavaScript Test Runner.png' alt='' style='margin-left: 1em;' /&gt;
&lt;p&gt;This implies that the JavaScript test runner must load itself &amp;#8211; from your local machine where Selenium is installed &amp;#8211; and then load pages from the web application under test which are usually hosted on another machine (say &lt;code&gt;ph7spot.com&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Fortunately for our day-to-day web browsing experience but unfortunately for Selenium, there is a far-reaching security restriction in JavaScript that &lt;strong&gt;prevents a script loaded from one origin to read or modify the properties of windows and documents coming from a different origin&lt;/strong&gt;&lt;sup id='fnref:1'&gt;&lt;a href='#fn:1' rel='footnote'&gt;1&lt;/a&gt;&lt;/sup&gt;. This restriction is usually referred to as the &lt;em&gt;&lt;a href='http://taossa.com.nyud.net:8080/index.php/2007/02/08/same-origin-policy'&gt;same origin policy&lt;/a&gt;&lt;/em&gt;. Its intent is to prevent a malicious script from compromising the confidentiality or integrity of another web page. Without this protection, a rogue third-party script would have a straight shot at impersonating the current user (e.g. issuing HTTP request in the context of the current web session) or impersonating a trusted website (e.g. stealing user credentials and/or sensitive information).&lt;/p&gt;

&lt;p&gt;The same origin policy, therefore, also gets in the way of Selenium automation: Selenium must load the JavaScript test runner from &lt;code&gt;localhost&lt;/code&gt; as well as the web application under test from another domain (say &lt;code&gt;ph7spot.com&lt;/code&gt;). This is why, in a lot of ways, &lt;strong&gt;Selenium Remote Control is all about launching browsers and finding creative solutions to bypass the same origin policy&lt;/strong&gt;. Most of these creative solutions revolve around 2 strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pretending the web pages of the application under test come from &lt;code&gt;localhost&lt;/code&gt;&lt;/strong&gt;, by setting the Remote Control as a web proxy for the browser. This means that the Remote Control must change your browser or system proxy settings before launching the browser, and restore them once you are done with the session.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Finding a way to run JavaScript in privileged mode&lt;/strong&gt; which does not enforce the same origin policy. Obviously, there is no guarantee that such a mode exists and can be reached for every browser. Besides, even when such a mode does exists, the way to enter this privileged mode is always browser-specific and discovering it typically takes some time and entails a good understanding of the browser&amp;#8217;s underlying architecture. For instance, Selenium uses the Chrome and HTA technologies to enter privileged mode on Firefox and Internet Explorer (respectively).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The great advantage of going with the proxy strategy is that it is guaranteed to work from day one with &lt;em&gt;any&lt;/em&gt; browser, even if you do not discover any secret way to enter a super privileged mode. Its main drawback, however, is that the proxy settings have to be saved, changed and restored at the beginning and end of every Selenium Session. &lt;strong&gt;For Selenium Grid, which distributes tests among multiple Remote Controls, the proxy strategy quickly becomes a real problem for browsers (namely Internet Explorer and Safari) whose proxy settings can only be changed globally, at the operating system level. Multiple Remote Controls running on the same machine asynchronously compete to change the global system proxy settings&amp;#8230; a sure recipe for mysterious failures and an unstable infrastructure!!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is why as far as Selenium Grid is concerned, the privileged mode strategy &amp;#8211; which does not affect any web proxy settings &amp;#8211; is the way to go. It is conducive to a setup with no interference between system settings, Remote Controls, browsers and Selenium Sessions.&lt;/p&gt;

&lt;p&gt;This is why I am so excited about &lt;a href='http://darkforge.blogspot.com/'&gt;Dan Fabulich&lt;/a&gt;&amp;#8217;s privileged mode for Safari. &lt;strong&gt;It means that Selenium Grid gets extremely efficient Safari support, totally on par with its Firefox support&lt;/strong&gt;. As it turns out, in a Selenium Grid context, &lt;strong&gt;running your web acceptance test suite on Safari is even typically faster than running it on Firefox.&lt;/strong&gt; Let me tease you with a screenshot of Selenium Grid running 18 Safari browsers in parallel on my MacBook Pro:&lt;/p&gt;
&lt;img src='http://ph7spot.com/images/Selenium/18 Safari Browsers in Parallel.png' alt='' width='600px' style='margin-left: 3em;' /&gt;
&lt;p&gt;Another interesting thing about the new Safari privileged mode is that it actually works in a very simple way. Dan discovered that in Safari, file URLs are not restricted by the same-origin policy. So the solution is as simple as loading the Selenium Core JavaScript test runner directly from the file system!&lt;/p&gt;

&lt;p&gt;The new Safari privileged mode is the default mode in &lt;a href='http://seleniumhq.org/download/'&gt;Selenium RC 1.0 beta 2&lt;/a&gt; and &lt;a href='http://selenium-grid.seleniumhq.org/download.html'&gt;Selenium Grid 1.0.3&lt;/a&gt;. To access the new privileged mode, just &lt;strong&gt;use the good old &lt;code&gt;*safari&lt;/code&gt; browser string&lt;/strong&gt; when you start the Selenium session. There is one gotcha though: If, just after Safari launches, your browser seems to be hanging in limbo in a state similar to the screen shot below, make sure that Safari is not configured to block popup windows.&lt;/p&gt;
&lt;img src='http://ph7spot.com/images/Selenium/Safari Launcher Hanging.png' alt='' style='margin-left: 1em;' /&gt;
&lt;p&gt;Moving forward, we need to automate this setting change, but for now &lt;strong&gt;please manually check that the &amp;#8220;Block Pop-Up Windows&amp;#8221; option in the Safari main menu is &lt;em&gt;not&lt;/em&gt; enabled before launching your tests&lt;/strong&gt;.&lt;/p&gt;
&lt;img src='http://ph7spot.com/images/Selenium/Safari Popup Settings Shadow.png' alt='' style='margin-left: 5em;' /&gt;
&lt;p&gt;Hopefully you are now as excited about Safari and Selenium Grid as I am. So happy hacking, and have fun with the Grid!&lt;/p&gt;
&lt;div class='footnotes'&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id='fn:1'&gt;
&lt;p&gt;To be precise, the term &lt;em&gt;origin&lt;/em&gt; is defined in context as the combination of protocol, domain name and port number in the URL serving the document. So, for instance, &lt;code&gt;http://ph7spot.com&lt;/code&gt; and &lt;code&gt;http://seleniumhq.org&lt;/code&gt; are considered to have different origins because they have different domain names. In the same way &lt;code&gt;http://ph7spot.com&lt;/code&gt; and &lt;code&gt;https://ph7spot.com&lt;/code&gt; are also considered to have different origins as they use different protocols (http and https). &lt;br /&gt;&lt;br /&gt; It is also worth clarifying that the same origin restrictions do &lt;em&gt;not&lt;/em&gt; apply to &lt;em&gt;all&lt;/em&gt; interactions. For instance, it&amp;#8217;s fairly common for a web page to include images, stylesheets, and scripts from other domains.&lt;/p&gt;
&lt;a href='#fnref:1' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=8R0Czaf3lJw:yQoVeS0cQrk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/8R0Czaf3lJw" height="1" width="1"/&gt;</content>
    <updated>2009-03-04T17:41:20+00:00</updated>
    <published>2009-03-04T17:41:20+00:00</published>
    <id>http://ph7spot.com/blog/selenium-remote-control-and-grid-get-top-notch-safari-support</id>
  <feedburner:origLink>http://ph7spot.com/blog/selenium-remote-control-and-grid-get-top-notch-safari-support</feedburner:origLink></entry>
  <entry>
    <title type="html">caller_for_all_threads now in Ruby Enterprise Edition</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/oD5USoVLdmQ/caller-for-all-threads-now-in-ruby-enterprise-edition" rel="alternate" />
    <content type="html">&lt;p&gt;The awesome guys behind &lt;a href='http://www.modrails.com/'&gt;Phusion Passenger&lt;/a&gt; &lt;strong&gt;&lt;a href='http://blog.phusion.nl/2008/12/05/ruby-enterprise-edition-186-20081205-released-thank-you-sponsors'&gt;just released&lt;/a&gt; a new version of Ruby Enterprise Edition, which includes my work on &lt;a href='http://ph7spot.com/musings/caller-for-all-threads'&gt;&lt;code&gt;caller_for_all_threads&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;. For people who are not keen on &lt;a href='http://ph7spot.com/musings/caller-for-all-threads#appendix_compiling_your_own_ruby_interpreter'&gt;patching and compiling their own Ruby interpreter&lt;/a&gt;, this is great news. Now, to be able to dump the stack trace of &lt;em&gt;all&lt;/em&gt; the threads in your Ruby application&amp;#8230; all you need to do is to install &lt;a href='http://www.rubyenterpriseedition.com'&gt;Ruby Enterprise Edition&lt;/a&gt;!.&lt;/p&gt;

&lt;p&gt;If you are unfamiliar with &lt;a href='http://ph7spot.com/musings/caller-for-all-threads'&gt;&lt;code&gt;caller_for_all_threads&lt;/code&gt;&lt;/a&gt;, it provides a &lt;strong&gt;handy way to gain a comprehensive understanding of the state of your Ruby application when it starts to misbehave&lt;/strong&gt;. I have found it to be a quick and invaluable troubleshooter of tough Ruby on Rails production problems.&lt;/p&gt;

&lt;p&gt;As for Ruby Enterprise Edition, if you haven&amp;#8217;t evaluated it yet, you should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When you use Ruby Enterprise Edition with Phusion Passenger you can &lt;strong&gt;save your Rails application memory usage by 33%&lt;sup id='fnref:1'&gt;&lt;a href='#fn:1' rel='footnote'&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/strong&gt;, which translates into tangible financial savings. This amazing result stems from tactical tweaks in the Ruby interpreter code &lt;sup id='fnref:2'&gt;&lt;a href='#fn:2' rel='footnote'&gt;2&lt;/a&gt;&lt;/sup&gt;, which makes it so that a significant portion of the interpreter representation in memory remains unchanged over the course of the application life-cycle. By leveraging the copy-on-write mechanism available on modern operating systems, this invariant memory representation of the Ruby interpreter can then be shared transparently between multiple Ruby processes&lt;sup id='fnref:3'&gt;&lt;a href='#fn:3' rel='footnote'&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;For 32-bits platforms, this Ruby Enterprise Edition release also includes &lt;strong&gt;significant improvement for Ruby memory allocation and garbage collection&lt;/strong&gt;, which constitute the most overlooked performance problems in Ruby applications today. So progress in these areas is crucial! With Ruby Enteprise Edition memory handling enhancements you can expect something like a &lt;strong&gt;20% speedup&lt;/strong&gt; out-of-the-box for typical Ruby applications. Even better, since this release also integrates &lt;a href='http://railsbench.rubyforge.org/svn/trunk/railsbench/GCPATCH'&gt;RailsBench GC patches&lt;/a&gt;, you can also tweak various garbage collector settings to your liking and go even further!&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Finally, &lt;strong&gt;you can use Ruby Enterprise Edition in production today&lt;/strong&gt; without changing a line of code: This is simply good old M.R.I. 1.8.6 bundled with a couple of clever and well-chosen patches that make a world of difference. Even better, it is production-grade: &lt;strong&gt;many high-profile and high-traffic websites including the New York Times, MTV, Shopify and 37signals already use Ruby Enteprise Edition today&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In conclusion, I am flattered to have my work incorporated into the core of what constitutes today&amp;#8217;s state-of-the-art deployment infrastructure for Ruby web applications (Phusion Passenger + Ruby Enterprise Edition). Hopefully, you will also find my work useful. Please send me your feedback &amp;#8211; I&amp;#8217;d love to learn about how you use it and your ideas on ways to improve it!&lt;/p&gt;
&lt;div class='footnotes'&gt;&lt;hr /&gt;&lt;ol&gt;&lt;li id='fn:1'&gt;
&lt;p&gt;As demonstrated &lt;a href='http://www.rubyenterpriseedition.com/comparisons.html#overall_conclusion'&gt;in this test&lt;/a&gt;&lt;/p&gt;
&lt;a href='#fnref:1' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;li id='fn:2'&gt;
&lt;p&gt;Especially its mark-and-sweep garbage collection implementation, which is the worst offender. It holds the mark/sweep flag inside the nodes themselves, not in a separate list maintained in parallel. This inlined flag triggers quick memory changes in anything but the very core of the Ruby interpreter. As a consequence almost all the pages that a Ruby child process inherits from its parent change quickly, unnecessarily defeating copy-on-write optimizations.&lt;/p&gt;
&lt;a href='#fnref:2' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;li id='fn:3'&gt;
&lt;p&gt;Copy-On-Write is a transparent optimization technique where a memory copy operation defers the actual copy until a change occurs (either in the original or the copy). Until then, a read-only pointer to the original memory page is provided. Eventually, if/when a process attempts to change the original or the copy, a page protection fault occurs, the O.S. intercepts the page fault and end up allocating physical memory for the copy. So, as long as the copied data is only read and not written too, memory is shared, effectively saving time and physical memory. You typically benefit from copy-on-write optimizations in a transparent manner every time you fork a (Ruby) process.&lt;/p&gt;
&lt;a href='#fnref:3' rev='footnote'&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=oD5USoVLdmQ:HSSv8s2h_Qs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/oD5USoVLdmQ" height="1" width="1"/&gt;</content>
    <updated>2008-12-11T11:13:25+00:00</updated>
    <published>2008-12-11T11:13:25+00:00</published>
    <id>http://ph7spot.com/blog/caller-for-all-threads-now-in-ruby-enterprise-edition</id>
  <feedburner:origLink>http://ph7spot.com/blog/caller-for-all-threads-now-in-ruby-enterprise-edition</feedburner:origLink></entry>
  <entry>
    <title type="html">Just published "Leveraging lsof"</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/ZMqNgxUqrAo/leveraging-lsof" rel="alternate" />
    <content type="html">&lt;p&gt;I have just published an &lt;a href='http://ph7spot.com/musings/leveraging-lsof'&gt;excerpt&lt;/a&gt; from my &amp;#8221;&lt;a href='http://ph7spot.com/publications/troubleshooting_ruby_processes'&gt;Troubleshooting Ruby Processes&lt;/a&gt;&amp;#8221; shortcut with kind permission from Addison-Wesley.&lt;/p&gt;

&lt;p&gt;The &lt;a href='http://ph7spot.com/musings/leveraging-lsof'&gt;excerpt&lt;/a&gt; is covering &lt;code&gt;lsof&lt;/code&gt;, one of the most powerful UNIX command (available on Mac OS X). &lt;code&gt;lsof&lt;/code&gt; is invaluable when it comes to to investigating or troubleshooting problems related to network, filesystem, devices or even native libraries. Now you have no excuse for not knowing it!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=ZMqNgxUqrAo:BEMALj8u-GQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/ZMqNgxUqrAo" height="1" width="1"/&gt;</content>
    <updated>2008-11-17T21:00:21+00:00</updated>
    <published>2008-11-17T21:00:21+00:00</published>
    <id>http://ph7spot.com/blog/new-lsof-article</id>
  <feedburner:origLink>http://ph7spot.com/articles/leveraging-lsof</feedburner:origLink></entry>
  <entry>
    <title type="html">Speaking at Professional Ruby Conference, Boston, Nov 19</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/0N7pK6AHruM/speaking-at-voices-that-matters-professional-ruby-conference-2008" rel="alternate" />
    <content type="html">&lt;p&gt;I am attending the &lt;a href='http://www.voicesthatmatter.com/ruby2008'&gt;Voices that Matters - Professional Ruby&lt;/a&gt; conference in Boston this week. This event is organized by Addison-Wesley and &lt;a href='http://obiefernandez.com'&gt;Obie Fernandez&lt;/a&gt; and has &lt;a href='http://www.voicesthatmatter.com/ruby2008/speakers.aspx'&gt;quite amazing speaker lineup&lt;/a&gt; covering pretty much all aspects of professional Ruby development.&lt;/p&gt;

&lt;p&gt;My &lt;a href='http://www.voicesthatmatter.com/ruby2008/sessions.aspx#rocksolid'&gt;Rock Solid Ruby Deployment&lt;/a&gt; presentation on Wednesday will introduce and demonstrate some key system diagnostic tools and techniques in the context of Ruby development. The emphasis will be on &lt;a href='http://ph7spot.com/musings/caller-for-all-threads'&gt;&lt;code&gt;caller_for_all_threads&lt;/code&gt;&lt;/a&gt;, &lt;a href='http://ph7spot.com/musings/system-timer'&gt;System Timer&lt;/a&gt; and DTrace.&lt;/p&gt;

&lt;p&gt;If you are attending the conference and have questions, feedback, scary deployment stories or just want to chat, please &lt;a href='http://ph7spot.com/about/contact_me'&gt;get in touch&lt;/a&gt;, I would love to meet up with you. We’ll figure out the best way to meet while we’re all in the same place!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=0N7pK6AHruM:IibaYO0RnRA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/0N7pK6AHruM" height="1" width="1"/&gt;</content>
    <updated>2008-11-17T19:37:42+00:00</updated>
    <published>2008-11-17T19:37:42+00:00</published>
    <id>http://ph7spot.com/blog/speaking-at-voices-that-matters-professional-ruby-conference-2008</id>
  <feedburner:origLink>http://ph7spot.com/blog/speaking-at-voices-that-matters-professional-ruby-conference-2008</feedburner:origLink></entry>
  <entry>
    <title type="html">Speaking at Rails Summit Latin America Conference, S&amp;atilde;o Paulo, Oct 16</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/AIrEG7zU6-E/speaking-at-rails-summit-latin-america-2008" rel="alternate" />
    <content type="html">&lt;a href='http://www.locaweb.com.br/railssummit/default.asp?prog=dia16&amp;language=7'&gt;&lt;img src='http://ph7spot.com/images/Conferences/Rails Summit Latin America 2008 Banner.png' style='float: left; margin: 0em 1.5em 0em 3em;' /&gt;&lt;/a&gt;
&lt;p&gt;On Thursday I will be speaking at &amp;#8221;&lt;a href='http://akitaonrails.com/2008/7/13/rails-summit-latin-america-2008'&gt;Rails Summit Latin America&lt;/a&gt;&amp;#8221; in São Paulo, Brasil. I will be presenting a session on best practices in the field of automated web acceptance testing for Rails applications. The talk will be quite hands-on and will focus on code and concrete examples. Quite likely to spark some lively debates with my friend, &lt;a href='http://jayfields.com'&gt;Jay Fields&lt;/a&gt;, who will be attending too ;-)&lt;/p&gt;

&lt;p&gt;It is a great honor to have been invited speak at the first ever large scale Ruby on Rails event in Latin America. Kudos to &lt;a href='http://www.akitaonrails.com/english'&gt;Fabio Akita&lt;/a&gt; and &lt;a href='http://www.locaweb.com.br'&gt;Locaweb&lt;/a&gt; for making the conference happen!&lt;/p&gt;

&lt;p&gt;If you are attending the conference and want to chat, do not hesitate to &lt;a href='http://ph7spot.com/about/contact_me'&gt;ping me&lt;/a&gt;, that&amp;#8217;s what conferences are for!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=AIrEG7zU6-E:5HZ3GSHNZJw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/AIrEG7zU6-E" height="1" width="1"/&gt;</content>
    <updated>2008-10-13T22:19:12+00:00</updated>
    <published>2008-10-13T22:19:12+00:00</published>
    <id>http://ph7spot.com/blog/speaking-at-rails-summit-latin-america-2008</id>
  <feedburner:origLink>http://ph7spot.com/blog/speaking-at-rails-summit-latin-america-2008</feedburner:origLink></entry>
  <entry>
    <title type="html">Speaking at Agile 2008 Conference, August 6 2:45 PM</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/humcJDLnagU/announcing-talk-at-agile-2008" rel="alternate" />
    <content type="html">&lt;p&gt;This week I am attending the &lt;a href='http://agile2008.org'&gt;Agile 2008&lt;/a&gt; conference in Toronto. It promises to be a lot of fun and a great opportunity to discover the newest techniques, technologies, ideas, experiences and perspectives in the Agile community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Thursday, at 2:45 PM I will be &lt;a href='http://submissions.agile2008.org/node/4414'&gt;presenting a session&lt;/a&gt; on best practices in the field of automated web acceptance testing&lt;/strong&gt;. I will share the experience of my ThoughtWorks team which &lt;strong&gt;turned a 3 hours web acceptance build that was mostly red, into a build that stays green an run under 10 minutes!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I hope this talk will be a great opportunity to learn about your experiences in this field too. Automated acceptance testing is a &lt;a href='http://c2.com/cgi/wiki?AcceptanceTest'&gt;cornerstone&lt;/a&gt; of Extreme Programming and Agile practices. Yet automated web acceptance testing still routinely &lt;a href='http://blog.jayfields.com/2008/07/immaturity-of-in-browser-testing.html'&gt;&amp;#8220;sucks&amp;#8221;&lt;/a&gt; for most projects, so sharing our successes and setbacks will help our community move automated web acceptance testing forward.&lt;/p&gt;

&lt;p&gt;Improving the state of automated web acceptance testing is a worthy cause, so much so that Ward Cunningham was kind enough to send me quote reminding us why:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Whenever we apply more than the most superficial effort programming anything, we will be wasting time unless some of that effort is turned back on the work itself so as to convince ourselves that the whole is sound.&amp;#8221; &amp;#8211; Ward Cunningham&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If quick feedback and high R.O.I web acceptance testing matters to you too, I would love to meet up with you, hear your stories and feedback. &lt;a href='/about/contact_me'&gt;Ping me&lt;/a&gt; and we’ll figure out the best way to meet while we’re all in the same place!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=humcJDLnagU:SD-Q1_tk0zg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/humcJDLnagU" height="1" width="1"/&gt;</content>
    <updated>2008-08-05T06:46:29+00:00</updated>
    <published>2008-08-05T06:46:29+00:00</published>
    <id>http://ph7spot.com/blog/announcing-talk-at-agile-2008</id>
  <feedburner:origLink>http://ph7spot.com/blog/announcing-talk-at-agile-2008</feedburner:origLink></entry>
  <entry>
    <title type="html">Speaking at MountainWest RubyConf 2008, March 28 and 29</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/yZygZLwE9ng/announcing-talk-at-mountain-west-rubyconf-2008" rel="alternate" />
    <content type="html">&lt;p&gt;I will be speaking at &lt;a href='http://mtnwestrubyconf.org'&gt;Mountain West RubyConf 2008&lt;/a&gt; on March 28 and 29, in Salt Lake City, Utah.&lt;/p&gt;

&lt;p&gt;Mountain West RubyConf is a great Ruby conference, one that manages to have an intimate environment, not to mention a great panel of &lt;a href='http://mtnwestrubyconf.org/2008/speakers'&gt;speakers&lt;/a&gt;, so I feel very honored to have been selected to present a session there. Big thanks to the MountainWest RubyConf organizers and especially to Pat Eyler of &lt;a href='http://on-ruby.blogspot.com'&gt;On Ruby&lt;/a&gt; and &lt;a href='http://on-erlang.blogspot.com'&gt;On Erlang&lt;/a&gt; fame.&lt;/p&gt;

&lt;p&gt;My talk will introduce and demonstrate some key system diagnostic tools and techniques in the context of Ruby and Ruby on Rails development. I learnt the hard way on the field, a collection of troubleshooting techniques which are not widely documented nor well-known within the Rails community. During the session, I will demonstrate some techniques already covered in my Addison-Wesley shortcut, &lt;a href='/publications/troubleshooting_ruby_processes'&gt;Troubleshooting Ruby Processes&lt;/a&gt;, as well as others strategies and tools which are new, or lack sufficient documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.acteva.com/booking.cfm?bevaID=150733&amp;amp;CFID=8693013&amp;amp;CFTOKEN=40688547'&gt;Hope to see you in Salt Lake City&lt;/a&gt;!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=yZygZLwE9ng:SB_v0TxmHrw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/yZygZLwE9ng" height="1" width="1"/&gt;</content>
    <updated>2008-03-25T23:33:28+00:00</updated>
    <published>2008-03-25T23:33:28+00:00</published>
    <id>http://ph7spot.com/blog/announcing-talk-at-mountain-west-rubyconf-2008</id>
  <feedburner:origLink>http://ph7spot.com/blog/announcing-talk-at-mountain-west-rubyconf-2008</feedburner:origLink></entry>
  <entry>
    <title type="html">Time to Upgrade your Web Acceptance Testing: New Selenium Grid Release Available!</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/yfBiNBx1fHM/announcing-selenium-grid-1-0" rel="alternate" />
    <content type="html">&lt;p&gt;&lt;a href='http://selenium-grid.seleniumhq.org'&gt;Selenium Grid&lt;/a&gt; adoption is accelerating and I am excited to announce a &lt;a href='http://selenium-grid.seleniumhq.org/download.html'&gt;new release&lt;/a&gt;! Based on your helpful user feedback, I fixed a few bugs, improved documentation, provided better examples and ensured seamless integration with the upcoming release of &lt;a href='http://selenium-rc.seleniumhq.org'&gt;Selenium Remote Control&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Main highlights for this 1.0 release include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Amazon EC2 Integration and Automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selenium Grid now comes with out-of-the-box support for &lt;a href='http://aws.amazon.com/ec2'&gt;EC2&lt;/a&gt;. There is an &lt;a href='http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1276&amp;amp;categoryID=116'&gt;official EC2 image&lt;/a&gt; which bundles all the tools you need to establish a Selenium Grid cluster on Amazon Elastic Compute Cloud (including a VNC server). Selenium Grid 1.0 also comes with &lt;a href='http://capify.org'&gt;Capistrano&lt;/a&gt; tasks to automate deployment and management of the Selenium Grid on EC2 (in the &lt;code&gt;examples/ec2&lt;/code&gt; directory). Check out the &lt;a href='http://selenium-grid.seleniumhq.org'&gt;Selenium Grid Website&lt;/a&gt; for more details on the EC2 instrumentation and how to &lt;a href='http://selenium-grid.seleniumhq.org/run_the_demo_on_ec2.html'&gt;run Selenium Grid Demo on EC2&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A new example demonstrating how to run in parallel Selenium tests written in Ruby (RSpec)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See the &lt;code&gt;examples/rspec&lt;/code&gt; directory. The current solution (spawning multiple processes) is basic but works great and is used daily on professional projects. The plan is to evolve the current solution to an actual &lt;a href='http://rspec.info'&gt;RSpec&lt;/a&gt; test runner based on Rinda/DRb, Memcache or a flavor a &lt;a href='http://labs.google.com/papers/mapreduce.html'&gt;MapReduce&lt;/a&gt;. Of course contributions are welcome. Make sure that you also have a look in the &lt;code&gt;reports&lt;/code&gt; directory after running the tests: You will see some &lt;a href='/examples/selenium_rspec_report.html'&gt;nice test reports including screenshots of the application under test&lt;/a&gt;. The screenshot formatter used in Selenium Grid Ruby example is based on Spec::UI code by &lt;a href='http://aslakhellesoy.com/'&gt;Aslak&lt;/a&gt;, just tweaked a little bit to make it work with RSpec 1.1.3.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Selenium Grid demo is now powered by &lt;a href='http://testng.org'&gt;TestNG&lt;/a&gt;&lt;/strong&gt; (in lieu of &lt;a href='https://parallel-junit.dev.java.net'&gt;Parallel JUnit&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;TestNG provides the best and the more scalable solution to run tests in parallel for Selenium tests written in Java. &lt;a href='http://selenium-grid.seleniumhq.org/run_the_demo.html'&gt;The demo&lt;/a&gt; now demonstrates best practices in the field. Feel free to use it as a starting point when instrumenting your Selenium test suite for Selenium Grid.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Additional parameters can be passed to Selenium remote controls at startup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just set the &lt;code&gt;seleniumArgs&lt;/code&gt; Java property when launching the remote control. For instance, to start a remote control in multi window and debug mode you would use:&lt;/p&gt;
&lt;pre&gt;ant -DseleniumArgs="-multiWindow -debug" launch-remote-control&lt;/pre&gt;
&lt;p&gt;Ruby dudes can use:&lt;/p&gt;
&lt;pre&gt;rake hub:start SELENIUM_ARGS="-multiWindow -debug"&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Selenium Grid now works with 0.9.3 Remote Controls&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just replace the &lt;code&gt;lib/selenium-server-0.9.2.jar &lt;/code&gt; library packaged in Selenium Grid distribution with a 0.9.3 snapshot of Selenium Remote Control if you want to try it out. Selenium Remote Control 0.9.3 branch changed the way the session IDs are set and is now using GUIDs.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better handling of massive text field values&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selenium Grid was choking when testing fields with big chunks of text. Selenium Grid now uses HTTP POST to relay Selenese commands to the remote controls and everything works like a charm.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Support for web pages including international characters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selenium Grid was also misbehaving for web pages with international characters. Not anymore! Selenium Grid now speaks whatever language you speak. Since Selenium Remote Control does not explicitly set the charset in HTTP request headers, we changed our &lt;code&gt;HttpClient&lt;/code&gt; wrapper to assume UTF-8.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to Vinay Tota, Maria Elisa Sanchez, Sam Chen, Miles, Shiang Luong, Daniel Stironek, Adrian Gan, Mattias, Sem Adou, Joel and David Burns for reporting bugs, suggesting interesting new features or helping me improve the documentation in the &lt;a href='http://clearspace.openqa.org/community/selenium/advanced'&gt;Selenium Grid Forums&lt;/a&gt;. Thank you also to Clint Bishop who helped convert some test to JRuby, and to Patrick Lightbody who is always here to help me with &lt;a href='http://seleniumhq.org'&gt;OpenQA&lt;/a&gt; infrastructure.&lt;/p&gt;

&lt;p&gt;Enjoy, and don&amp;#8217;t forget to &lt;a href='http://selenium-grid.seleniumhq.org/give_feedback.html'&gt;provide feedback&lt;/a&gt;!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=yfBiNBx1fHM:6drLK2nilGM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/yfBiNBx1fHM" height="1" width="1"/&gt;</content>
    <updated>2008-02-26T14:33:28+00:00</updated>
    <published>2008-02-26T14:33:28+00:00</published>
    <id>http://ph7spot.com/blog/announcing-selenium-grid-1-0</id>
  <feedburner:origLink>http://ph7spot.com/blog/announcing-selenium-grid-1-0</feedburner:origLink></entry>
  <entry>
    <title type="html">Monday, Feb 25: Get The Latest Scoop on Selenium and Meet the Core Team!</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/PM79LQ04ZPQ/announcing-selenium-user-open-evening-2008" rel="alternate" />
    <content type="html">&lt;p&gt;Google will be hosting &lt;strong&gt;the world&amp;#8217;s first &lt;a href='http://google-opensource.blogspot.com/2008/02/selenium-users-event-coming-up.html'&gt;Selenium Users Open Evening&lt;/a&gt;&lt;/strong&gt; in Mountain View, CA on &lt;strong&gt;Monday, February 25 from 6:30PM to 9:00PM&lt;/strong&gt;. The event will feature a panel session and a series of lightning talks by representatives from all the major Selenium projects.&lt;/p&gt;

&lt;p&gt;Come join us for this unique opportunity to meet the &lt;a href='http://selenium.seleniumhq.org'&gt;Selenium&lt;/a&gt; core team, get the latest scoop on web testing, discuss Selenium vision and future, share your ideas or finally ask the questions that you&amp;#8217;ve been dying to ask!&lt;/p&gt;

&lt;p&gt;So what is Selenium? For the uninitiated, Selenium is a collection of Open Source tools for &lt;strong&gt;functional testing of web application&lt;/strong&gt;. Selenium technology is cross-browser (IE, Firefox and Safari), cross-platform (Windows, Linux, and Mac) and language-agnostic &amp;#8211; You can write your tests in Ruby, Java, C#, Python, Perl, PHP or even plain HTML! In fact, if you&amp;#8217;re &lt;em&gt;really&lt;/em&gt; not in the mood to write any tests at all, the &lt;a href='http://selenium-ide.seleniumhq.org'&gt;Selenium IDE&lt;/a&gt; can record, save and play back any browsing session in Firefox. Quite handy, especially if your business analyst use this feature to communicate the hard-to-reproduce bug that he just discovered! Last but not least, Selenium is free and enjoy wide community support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I will be participating in the &lt;a href='http://google-opensource.blogspot.com/2008/02/selenium-users-event-coming-up.html'&gt;Selenium Users Open Evening&lt;/a&gt; as the author and principal developer of &lt;a href='http://selenium-grid.seleniumhq.org'&gt;Selenium Grid&lt;/a&gt;&lt;/strong&gt;, a tool that transparently distribute Selenium infrastructure on multiple machines so that you can run your web tests in parallel &amp;#8211; without changing a single line of your existing Selenium tests. Selenium Grid can dramatically speed up web testing by leveraging your existing computing infrastructure, and it has been used to bring builds that used to take hours down to a couple of minutes. &lt;strong&gt;Be ready for some announcements and exciting demos on Selenium Grid during &amp;#8221;&lt;a href='http://google-opensource.blogspot.com/2008/02/selenium-users-event-coming-up.html'&gt;Selenium Users Open Evening&lt;/a&gt;&amp;#8221;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hope to see you there. Don&amp;#8217;t forget to sign up.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=PM79LQ04ZPQ:trgxYOsyyLE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/PM79LQ04ZPQ" height="1" width="1"/&gt;</content>
    <updated>2008-02-21T20:05:45+00:00</updated>
    <published>2008-02-21T20:05:45+00:00</published>
    <id>http://ph7spot.com/blog/announcing-selenium-user-open-evening-2008</id>
  <feedburner:origLink>http://ph7spot.com/blog/announcing-selenium-user-open-evening-2008</feedburner:origLink></entry>
  <entry>
    <title type="html">Just Published a New Book: "Troubleshooting Ruby Processes: Leveraging the Unix Platform When the
Usual Ruby Tricks Stop Working"</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/cduEHEEhenU/troubleshooting_ruby_processes" rel="alternate" />
    <content type="html">&lt;p&gt;I am excited to announce the publication of &lt;a href='http://ph7spot.com/publications/troubleshooting_ruby_processes'&gt;a PDF short cut&lt;/a&gt; with &lt;a href='http://www.informit.com/imprint/index.aspx?st=61085'&gt;Addison-Wesley&lt;/a&gt;, part of &lt;a href='http://obiefernandez.com'&gt;Obie Fernandez&lt;/a&gt;&amp;#8217;s awsome &lt;em&gt;Professional Ruby&lt;/em&gt; Series: &lt;strong&gt;&amp;#8220;Troubleshooting Ruby Processes: Leveraging the Unix Platform When the Usual Ruby Tricks Stop Working&amp;#8221;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this electronic book, I &lt;strong&gt;share some of my experiences troubleshooting production problems while deploying Ruby on Rails applications in the field&lt;/strong&gt;. In the course of delivering large Ruby on Rails projects, my teammates and I at &lt;a href='http://thoughtworks.com'&gt;ThoughtWorks&lt;/a&gt; encountered complex issues that could not be resolved employing the standard Ruby tricks (i.e. raising exceptions, &lt;code&gt;irb&lt;/code&gt;, &lt;code&gt;script/console&lt;/code&gt;, log file, breakpointer, debugger, etc.). Often some of our Mongrel servers would hang, offering no real clue as to the exact source of the problem or how to solve it. Resolving these problems required leveraging not only my Ruby skills but also a good understanding of the underlying operating system. System tools such as &lt;code&gt;lsof&lt;/code&gt;, &lt;code&gt;strace&lt;/code&gt;, &lt;code&gt;DTrace&lt;/code&gt; or &lt;code&gt;gdb&lt;/code&gt; proved to be key to the success of our projects.&lt;/p&gt;

&lt;p&gt;This book also provides concrete examples that illustrate how to use these tools to solve real-life problems in Ruby development. The content is not specific to Ruby on Rails and will be useful for troubleshooting problems with any Ruby process. Developing expertise in this area is key if you are developing professional Ruby applications. In this way, should your production Mongrel cluster freeze and stop serving HTTP requests, it will not take you 2 days to figure out why! ;-)&lt;/p&gt;

&lt;p&gt;&lt;a href='http://ph7spot.com/publications/troubleshooting_ruby_processes'&gt;Learn more about the book&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=cduEHEEhenU:uJgQJ0DIojs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/cduEHEEhenU" height="1" width="1"/&gt;</content>
    <updated>2007-11-08T20:05:45+00:00</updated>
    <published>2007-11-08T20:05:45+00:00</published>
    <id>http://ph7spot.com/blog/announcing-troubleshooting-ruby-book</id>
  <feedburner:origLink>http://ph7spot.com/publications/troubleshooting_ruby_processes</feedburner:origLink></entry>
  <entry>
    <title type="html">Getting started with Autotest</title>
    <author>
      <name>Philippe Hanrigou</name>
      <email>http://ph7spot.com/about/contact_me</email>
      <uri>http://ph7spot.com</uri>
    </author>
    <link href="http://feeds.ph7spot.com/~r/ph7/~3/_1LJMJv0tF8/getting-started-with-autotest" rel="alternate" />
    <content type="html">&lt;p class="first"&gt;
    Why manually run your tests, when the computer can do it for you!
    &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;Autotest&lt;/a&gt; is a great tool to speed up
    test-driven development with Ruby or Ruby on Rails. 
&lt;/p&gt;&lt;p&gt;
    &lt;strong&gt;Autotest makes your coding session even more
    productive as it automatically runs a subset of your test suite each time you change a file.
    Autotest is smart &amp;mdash; it figures out which subset to run based on the files you've changed.
    Think of it as &lt;q&gt;Continuous Testing&lt;/q&gt;&lt;/strong&gt;.
&lt;/p&gt;&lt;p&gt;
  Autotest source code is well-documented (&lt;a href="http://zentest.rubyforge.org/ZenTest/" title="ZenTest documentation"&gt;rdoc&lt;/a&gt;) but finding a
  high level overview online is a little more challenging. This article will get you up and running
  in no time, so that you may concentrate on writing code. 
  &lt;a href="/musings/getting-started-with-autotest"&gt;Let's get started!&lt;/a&gt;      
&lt;/p&gt;
           


&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.ph7spot.com/~ff/ph7?a=_1LJMJv0tF8:iEpATNfcKMk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ph7?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ph7/~4/_1LJMJv0tF8" height="1" width="1"/&gt;</content>
    <updated>2007-03-08T20:05:45+00:00</updated>
    <published>2007-03-08T20:05:45+00:00</published>
    <id>http://ph7spot.com/blog/new-article-to-get-started-with-autotest</id>
  <feedburner:origLink>http://ph7spot.com/articles/getting-started-with-autotest</feedburner:origLink></entry>
</feed>
