<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OpenSource Connections &#187; Eric Pugh</title>
	<atom:link href="http://www.opensourceconnections.com/author/epugh/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.opensourceconnections.com</link>
	<description>Automating the Science to Enable the Art</description>
	<lastBuildDate>Fri, 03 Sep 2010 21:15:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Be Effective When Working In a Really Cool/Fun/Distracting Place</title>
		<link>http://www.opensourceconnections.com/2010/07/07/be-effective-when-working-in-a-really-coolfundistracting-place/</link>
		<comments>http://www.opensourceconnections.com/2010/07/07/be-effective-when-working-in-a-really-coolfundistracting-place/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 20:38:46 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=1050</guid>
		<description><![CDATA[<div class="wp-caption aligncenter" style="width: 550px"><a href="http://maps.google.com/maps/api/staticmap?center=31.477222,-20&#38;size=600x300&#38;maptype=roadmap&#38;markers=color:green&#124;label:Y&#124;Beirut,Lebanon&#38;markers=color:red&#124;label:E&#124;Max+Patch,NC&#38;sensor=false"><img class=" " title="Where are Eric and Youssef" src="http://maps.google.com/maps/api/staticmap?center=31.477222,-20&#38;size=600x300&#38;maptype=roadmap&#38;markers=color:green&#124;label:Y&#124;Beirut,Lebanon&#38;markers=color:red&#124;label:E&#124;Max+Patch,NC&#38;sensor=false" alt="" width="540" height="270" /></a><p class="wp-caption-text">Where are Eric and Youssef?</p></div>
<p>This year two OSC folks are working remotely for extended periods of time.  Youssef spent 6 weeks in Lebanon earlier this year, and I am spending the month of July in the mountains of Western North Carolina.  We had talked about some of the rewards as well as challenges of working effectively when you are in a new/fun/exciting/[insert superlative here] place.  Youssef and I came up with a few tips to make balancing work/play easier!</p>
<p><a href="http://www.opensourceconnections.com/2010/07/07/be-effective-when-working-in-a-really-coolfundistracting-place/" class="more-link">Read more on Be Effective When Working In a Really Cool/Fun/Distracting Place&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 550px"><a href="http://maps.google.com/maps/api/staticmap?center=31.477222,-20&amp;size=600x300&amp;maptype=roadmap&amp;markers=color:green|label:Y|Beirut,Lebanon&amp;markers=color:red|label:E|Max+Patch,NC&amp;sensor=false"><img class=" " title="Where are Eric and Youssef" src="http://maps.google.com/maps/api/staticmap?center=31.477222,-20&amp;size=600x300&amp;maptype=roadmap&amp;markers=color:green|label:Y|Beirut,Lebanon&amp;markers=color:red|label:E|Max+Patch,NC&amp;sensor=false" alt="" width="540" height="270" /></a><p class="wp-caption-text">Where are Eric and Youssef?</p></div>
<p>This year two OSC folks are working remotely for extended periods of time.  Youssef spent 6 weeks in Lebanon earlier this year, and I am spending the month of July in the mountains of Western North Carolina.  We had talked about some of the rewards as well as challenges of working effectively when you are in a new/fun/exciting/[insert superlative here] place.  Youssef and I came up with a few tips to make balancing work/play easier!</p>
<h2>Tip 1: Establish a Routine</h2>
<p><strong>Youssef says:</strong> There will be no shortage of distractions, specially during the World Cup season. A trip to the mountains, a music festival or a friend&#8217;s unannounced (or announced) visit are all good reasons to drop what you&#8217;re doing and enjoy the place you are in. The only way to both get your work done and have fun is to know when is the appropriate time for each. I found that establishing a routine worked best for me. I woke up early every morning and took advantage of the early quiet hours of the day. Started work at 8am and got plenty done early on. Then I gave myself a couple of hours of break time for unscheduled events (a friend&#8217;s visit, a trip to the store to get souvenirs, or even a couple of hours at the beach). Then I resumed work till the evening when I had a conference call scheduled every day at 5:45pm. After the call I was free to do whatever I wanted and that gave me plenty of time, specially in a city like Beirut that does not sleep.<br />
<strong> Eric says:</strong> I know that I sometimes struggle to get started working in the morning.  And being in the office makes it simpler because everyone else is working.  So having a specific schedule of when I am working helps me shift my brain out of family/vacation mode and into work mode!<br />
<span id="more-1050"></span></p>
<h2>Tip 2: Fast Internet Connection</h2>
<p><strong>Eric says:</strong> When we looked for cottages to rent, one of our requirements was that they have something better then dial up!  We got lucky that one of our top choices was just installing a HughesNet satellite link at the cottage.<br />
<strong> Youssef says:</strong> It is embarrassing to be a on a call with a client and have that call be constantly dropped because of a bad connection. Skype requires a decent bandwidth and fast connection to work properly. You do not want a 15 minute stand up call to turn into a half an hour of you asking the people on the other end &#8220;Can you hear me now?&#8221; (Verizon does not operate in foreign countries!). So make sure you get yourself a decent internet connection even if you have to spend a little extra on it. And always take any install CDs or DVDs you think you might use with you. Some countries do not have the proper infrastructure and thus impose a cap on the download/upload limit you may use, which makes you think twice about how you use that limit (downloading the new Xcode from apple&#8217;s website is not an option).<br />
<strong> Eric chimes in: </strong>I ran into the same Skype issue, turns out Skype doesn&#8217;t work well with satellite internet due to the latency issue!  Fortunately, if I am upstairs on the west side of the cottage, standing on one foot, with my finger in my ear, my iPhone gets 1 bar of signal!   Phew.  I did notice that I needed to talk a little slower and not move about too much and folks can hear me.</p>
<h2>Tip 3: Regular Checkins</h2>
<p><strong>Youssef says:</strong> Stand up calls in Scrum keep the developers honest. When you are working remotely, you do not want to lose touch with the work environment, specifically in a field that evolves constantly such as software development. Having a point of contact in the &#8220;real world&#8221; or the &#8220;work world&#8221; helps you stay in touch and not lose focus.<br />
<strong> Eric says:</strong> When you are in the office everyday, you pick up all the water cooler gossip.  But working remotely means you lose that contact.  I find that having a regular series of checkins helps stay connected.  I put them on my calendar so they don&#8217;t get skipped!</p>
<h2>Tip 4: Track your time!</h2>
<p><strong>Eric says:</strong> Don&#8217;t forget that you are working remotely is because you are doing something special.  In my case, it&#8217;s taking my family for a month to the mountains.  So I want to make sure that I don&#8217;t miss out on the experience.  Over the four weeks I am here, I am taking a week of vacation, spread out a bit.  So I am tracking my hours both to make sure I don&#8217;t shortchange work, but also don&#8217;t shortchange the experience of being 200 feet from the Appalachian Trail!<br />
<strong> Youssef says:</strong> I definitely did not travel for 24 hours, crossed an ocean, a continent and a sea to do the exact the same things I was doing in Charlottesville. It also does not mean I should use that as an excuse to ignore my responsibilities. Tracking your time helps you balance out the experience and establishing a routine like we mentioned above goes well with this concept.</p>
<h2>Tip 5: Stay Agile</h2>
<p><strong>Youssef says:</strong> Working remotely does not mean you should change the way you work, but flexibility is key. Working on the east coast while your client is on the west coast requires some coordination. Working in Lebanon (GMT + 2) while your coworker is on the east coast and your client is on the west coast, well that requires some bending and flexibility. The key part about dealing with this situation is an agreement with all parties involved about which approach to follow. The method I followed included three chunks of time. A chunk where I was working ahead of everyone else (during which I could be dealing with issues that came up the day before), a chunk of time where everyone was available at the same time and third chunk when I was off the clock while everyone else was still working. That allowed for ample communication and work time without sacrificing my fun time. Others might prefer to synchronize the working time, or might prefer to just deal with the delays. Balance worked best for me.<br />
<strong> Eric says:</strong> I agree with Youssef, being flexible on your approach to work can make being remote a very enjoyable and productive experience!</p>
<div id="attachment_1051" class="wp-caption alignleft" style="width: 235px"><a href="http://www.opensourceconnections.com/wp-content/uploads/2010/07/photo.png"><img class="size-medium wp-image-1051" title="View from my window" src="http://www.opensourceconnections.com/wp-content/uploads/2010/07/photo-225x300.png" alt="A shot over the mountains looking away from Tennessee" width="225" height="300" /></a><p class="wp-caption-text">Looking out of my window at NC Mountains</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/07/07/be-effective-when-working-in-a-really-coolfundistracting-place/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When talking time zones: Bogota != Eastern Time (US &amp; Canada)!</title>
		<link>http://www.opensourceconnections.com/2010/04/21/when-talking-time-zones-bogota-eastern-time-us-canada/</link>
		<comments>http://www.opensourceconnections.com/2010/04/21/when-talking-time-zones-bogota-eastern-time-us-canada/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 14:46:03 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[daylight savings time]]></category>
		<category><![CDATA[dst]]></category>
		<category><![CDATA[utcoffset]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=970</guid>
		<description><![CDATA[<p>I&#8217;ve been using the timezone localization technique of asking the browser when the page loads what the browsers timezone offset from UTC is, and posting that back to the server and storing it in the session. Â However recently I noticed that with the event of Daylight Savings Time, this was no longer working, because my time would come up an hour off here in Virginia.</p>
<p><a href="http://www.opensourceconnections.com/2010/04/21/when-talking-time-zones-bogota-eastern-time-us-canada/" class="more-link">Read more on When talking time zones: Bogota != Eastern Time (US &#038; Canada)!&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using the timezone localization technique of asking the browser when the page loads what the browsers timezone offset from UTC is, and posting that back to the server and storing it in the session. Â However recently I noticed that with the event of Daylight Savings Time, this was no longer working, because my time would come up an hour off here in Virginia.</p>
<p>After much faffing about, I finally figured it out. Â On the server I would ask for the set of timezones that matched the offset, and grab the first one and put that in the session:</p>
<p>[sourcecode]<br />
result = ActiveSupport::TimeZone.all.select{|t|t.utc_offset == gmtoffset}.first<br />
session[:time_zone] = result.name<br />
[/sourcecode]</p>
<p>The list of named time zones returned when the browser is in <a href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=Charlottesville,+VA&#038;sll=38.012335,-78.514101&#038;sspn=0.0094,0.019205&#038;ie=UTF8&#038;hq=&#038;hnear=Charlottesville,+Virginia&#038;z=13">Charlottesville, Virginia</a> are: <em>Bogota, Eastern Time (US &#038; Canada), Indiana (East), Lima, Quito</em>.</p>
<p>So when I use Bogota as the timezone, and ask Rails to show the time localized:</p>
<p>[ruby]<br />
Time.now.in_time_zone(session[:time_zone])<br />
[/ruby]</p>
<p>I get back the time without taking into account daylight savings wrong.  I started trying to figure out if the browser was in a DST zone using this JavaScript code: <a href="http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/">http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/</a> and while it seems very promising, it still wasn&#8217;t quite giving me what I want.  </p>
<p>Finally, I realized it&#8230;.   By arbitrarily grabbing the first time zone in the list, I was showing time in <a href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=bogota+columbia&#038;sll=38.029306,-78.476678&#038;sspn=0.075181,0.153637&#038;ie=UTF8&#038;hq=&#038;hnear=Bogot%C3%A1,+Bogota,+Colombia&#038;z=12">Bogota, Columbia</a>.  But if I chose <em>Eastern Time (US &#038; Canada)</em> then I do get a localized time that takes into account day light savings!</p>
<p>So right now I have this method: </p>
<p>[ruby]<br />
    result = ActiveSupport::TimeZone.all.select{|t| t.utc_offset == gmtoffset &amp;&amp; t.name.include?(&quot;US&quot;)}.first<br />
    session[:time_zone] = result.name<br />
[/ruby]</p>
<p>Obviously this is pretty hardcoded to just work in the US, and isn&#8217;t a real solution.  I&#8217;d love to hear other ideas!  Part of me wonders if I should just display all times in UTC in HTML, and have some sort of client side JavaScript that localizes the time display?  </p>
<p>My full set of code:<br />
Javascript in my index.html.erb view:<br />
[javascript]<br />
  // Calls the server and sets the user&#8217;s time.<br />
  Event.observe(window, &#8216;load&#8217;, function(e) {<br />
    var now = new Date();<br />
    var gmtoffset = TimezoneDetect();<br />
    //use ajax to set the time zone here.<br />
    var set_time = new Ajax.Request(&#8216;&lt;%=url_for :controller =&gt; &quot;home&quot;, :action =&gt; &quot;gmtoffset&quot;%&gt;?gmtoffset=&#8217;+gmtoffset, {<br />
      onSuccess: function(transport) {<br />
        //alert(&quot;Response&quot; + transport.responseText);<br />
      }<br />
    });<br />
  });</p>
<p>  // http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/</p>
<p>  function TimezoneDetect(){<br />
      var dtDate = new Date(&#8217;1/1/&#8217; + (new Date()).getUTCFullYear());<br />
      var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt<br />
      var intMonth;<br />
      var intHoursUtc;<br />
      var intHours;<br />
      var intDaysMultiplyBy;</p>
<p>      //go through each month to find the lowest offset to account for DST<br />
      for (intMonth=0;intMonth &lt; 12;intMonth++){<br />
          //go to the next month<br />
          dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);</p>
<p>          //To ignore daylight saving time look for the lowest offset.<br />
          //Since, during DST, the clock moves forward, it&#8217;ll be a bigger number.<br />
          if (intOffset &gt; (dtDate.getTimezoneOffset() * (-1))){<br />
              intOffset = (dtDate.getTimezoneOffset() * (-1));<br />
          }<br />
      }</p>
<p>      return intOffset;<br />
  }</p>
<p>[/javascript]</p>
<p>home_controller.rb action:<br />
[ruby]<br />
  def gmtoffset<br />
    gmtoffset = params[:gmtoffset].to_i*60 if !params[:gmtoffset].nil? # notice that the javascript version of gmtoffset is in minutes <img src='http://www.opensourceconnections.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>    result = ActiveSupport::TimeZone.all.select{|t| t.utc_offset == gmtoffset &amp;&amp; t.name.include?(&quot;US&quot;)}.first<br />
    session[:time_zone] = result.name</p>
<p>    render :update do |page|<br />
      page.replace_html &#8216;time_of_chat_starting&#8217;, :partial=&gt; &#8216;super_short_time&#8217;<br />
      page.visual_effect :highlight, &#8216;time_of_chat_starting&#8217;<br />
    end<br />
  end<br />
[/ruby]</p>
<p>Rendered partial helper view _super_short_time.erb:<br />
[ruby]<br />
&lt;%= super_short_time(Time.now.in_time_zone(session[:time_zone])) %&gt;<br />
[/ruby]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/04/21/when-talking-time-zones-bogota-eastern-time-us-canada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>beCamp 2010 is April 30 &amp; May 1st</title>
		<link>http://www.opensourceconnections.com/2010/03/31/becamp-2010-is-april-30-may-1st/</link>
		<comments>http://www.opensourceconnections.com/2010/03/31/becamp-2010-is-april-30-may-1st/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 11:51:08 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[becamp]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=963</guid>
		<description><![CDATA[<p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;"><img class="alignleft size-full wp-image-964" title="becamp-badge-300w-white-2010" src="http://www.opensourceconnections.com/wp-content/uploads/2010/03/becamp-badge-300w-white-2010.png" alt="becamp-badge-300w-white-2010" width="168" height="56" />beCamp 2010 is almost here! April 30th and May 1st are just four weeks away!</p>
<p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">If youâ€™re a geek in or around the Charlottesville metroplex or even if youâ€™re merely tech-curious, this is the event you donâ€™t want to miss.Â <a style="font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: #006600; text-decoration: none; padding: 0px; margin: 0px; border: 0px initial initial;" href="http://barcamp.org/beCamp2008">beCamp</a> is Charlottesvilleâ€™s version of the BarCamp unconference phenomenonâ€”organized on the fly by attendees, for attendees. Realizing that the most energizing parts of any tech conference are the ad hoc conversations that take place in the hallways between the sessions, beCamp facilitates these types of interactions for an entire event.</p>
<p><a href="http://www.opensourceconnections.com/2010/03/31/becamp-2010-is-april-30-may-1st/" class="more-link">Read more on beCamp 2010 is April 30 &#038; May 1st&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;"><img class="alignleft size-full wp-image-964" title="becamp-badge-300w-white-2010" src="http://www.opensourceconnections.com/wp-content/uploads/2010/03/becamp-badge-300w-white-2010.png" alt="becamp-badge-300w-white-2010" width="168" height="56" />beCamp 2010 is almost here! April 30th and May 1st are just four weeks away!</p>
<p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">If youâ€™re a geek in or around the Charlottesville metroplex or even if youâ€™re merely tech-curious, this is the event you donâ€™t want to miss.Â <a style="font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: #006600; text-decoration: none; padding: 0px; margin: 0px; border: 0px initial initial;" href="http://barcamp.org/beCamp2008">beCamp</a> is Charlottesvilleâ€™s version of the BarCamp unconference phenomenonâ€”organized on the fly by attendees, for attendees. Realizing that the most energizing parts of any tech conference are the ad hoc conversations that take place in the hallways between the sessions, beCamp facilitates these types of interactions for an entire event.</p>
<p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">As of this writing, we are at <a title="beCamp 2010" href="http://barcamp.org/beCamp2010" target="_blank">87 campers</a>! To participate, just add your name to the wiki page!</p>
<p style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; padding: 0px; border: 0px initial initial;">A big thank you toÂ all <a href="http://barcamp.org/sponsor-beCamp-2010">our sponsors</a>, including at this point, Â Hotelicopter, Google, Perrin Quarles and Associates, NRAO, and University of Virginia ITC. Â Interested in supporting the Cville tech community? Â Check out our needs at http://barcamp.org/sponsor-beCamp-2010.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/03/31/becamp-2010-is-april-30-may-1st/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Things I learned Last Week Part 2</title>
		<link>http://www.opensourceconnections.com/2010/03/18/things-i-learned-last-week-part-2/</link>
		<comments>http://www.opensourceconnections.com/2010/03/18/things-i-learned-last-week-part-2/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 03:08:09 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=927</guid>
		<description><![CDATA[<h3>Favicon and Rails?</h3>
<p>Want to use a favicon.ico but don&#8217;t want to put it at the root as favicon.ico? Â Then add &#60;LINK REL=&#8221;SHORTCUT ICON&#8221; href=&#8221;&#60;%=image_path(&#8216;limelight.ico&#8217;)%&#62;&#8221;&#62;. Â  The use of image_path means that you get all the goodness of Rails routing to generate a complete image path that will work. Â Even if you deploy under some sub URL, like a war file in JBoss!</p>
<p><a href="http://www.opensourceconnections.com/2010/03/18/things-i-learned-last-week-part-2/" class="more-link">Read more on Things I learned Last Week Part 2&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<h3>Favicon and Rails?</h3>
<p>Want to use a favicon.ico but don&#8217;t want to put it at the root as favicon.ico? Â Then add &lt;LINK REL=&#8221;SHORTCUT ICON&#8221; href=&#8221;&lt;%=image_path(&#8216;limelight.ico&#8217;)%&gt;&#8221;&gt;. Â  The use of image_path means that you get all the goodness of Rails routing to generate a complete image path that will work. Â Even if you deploy under some sub URL, like a war file in JBoss!</p>
<p>Are you working with ISO-8859-1 encoded text, (more info at Â at http://www.w3schools.com/tags/ref_entities.asp).</p>
<h3>ISO 8859-1 Characters</h3>
<p>And look at the character Ã€ Â (should be a capital A with a caret on top called a grave accent). Â That will kill Solr, regardless of container deployed in, like Jetty versus Tomcat. Â But the other ways of representing this entity work great:</p>
<table style="font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; border-collapse: collapse; border: 1px solid #c3c3c3;" border="1" cellspacing="0" width="100%">
<tbody>
<tr>
<td style="font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; vertical-align: top; padding: 3px; border: 1px solid #c3c3c3;">&amp;#192;</td>
<td style="font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; vertical-align: top; padding: 3px; border: 1px solid #c3c3c3;">&amp;Agrave;</td>
</tr>
</tbody>
</table>
<p>Of course, there is a bit of confusion on this, as supposedly if the XML document posted to Solr is UTF-8 encoded, then Solr shouldn&#8217;t have any issues. Â So, still some digging to do!</p>
<h3>Solritas and JBoss and Velocity Oh My</h3>
<p>I recently ran into a Java Classloader issue between JBoss and Solr when loading Velocity. If you are getting in the browser:</p>
<h3>TTP Status 500 &#8211; loader constraint violation: when resolving method  &#8220;org.apache.velocity.Template.merge</h3>
<p>or messages like &#8220;SEVERE: java.lang.LinkageError: loader constraint violation: when resolving method &#8220;org.apache.velocity.Template.merge&#8221; in the logs, then that means a conflict in the velocity jars. Â Oddly enough, I could not actually find a velocity.jar anywhere in my JBoss app. Â However, the fix was to copy the velocity jar from Solr into my JBoss ./lib/ directory.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/03/18/things-i-learned-last-week-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Things I Learned About Last Week</title>
		<link>http://www.opensourceconnections.com/2010/03/09/vthings-i-learned-about-last-week/</link>
		<comments>http://www.opensourceconnections.com/2010/03/09/vthings-i-learned-about-last-week/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 02:47:41 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=922</guid>
		<description><![CDATA[<p>Last week was the crucial week on my current Lucene -&#62; Solr project for making our goals. Â A lot of work the previous couple of weeks came together. Â I wanted to take a couple of minutes and just record some of the little things that I&#8217;ve been learning about:</p>
<p><a href="http://www.opensourceconnections.com/2010/03/09/vthings-i-learned-about-last-week/" class="more-link">Read more on Things I Learned About Last Week&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Last week was the crucial week on my current Lucene -&gt; Solr project for making our goals. Â A lot of work the previous couple of weeks came together. Â I wanted to take a couple of minutes and just record some of the little things that I&#8217;ve been learning about:</p>
<h3>Solr</h3>
<p><a href="http://github.com/outoftime/sunspot">Sunspot</a> is the up and coming solution for integrating Solr into Ruby on Rails, and fortunately enough, the 1.0 release (followed quickly by 1.0.1!) has just come out last week. Â Between acts_as_solr and Sunspot, Sunspot wins hands down for it&#8217;s support of a master/slave Solr configurations, embedded Solr for testing, richer indexing semantics, and not being tied to ActiveRecord. Â The companion <a href="http://github.com/outoftime/sunspot_rails">sunspot_rails</a> gem does give wonderful ActiveRecord integration however.</p>
<p>Solr cores are the <a href="http://www.phrases.org.uk/meanings/the-bees-knees.html">bees knees</a>! Â We&#8217;ve built a simple RoR webapp using HTTParty and the Solr API that allows you to perform all the <a href="http://wiki.apache.org/solr/CoreAdmin">admin functions for cores</a>, and allows you to quickly clone a core for your own nefarious purposes! Â Simplifies hacking around with a new schema or configuration without having a local copy of Solr running. Â Allows multiple QA environments to potentially share a single Solr infrastructure.</p>
<p>Solr master and slave setup in a single VM. Â While pointless from a scaling perspective, it&#8217;s a really great way to work out the kinks! Â It&#8217;s funny to see a slave core polling the same Solr VM its in for updated segments!</p>
<h3>JRuby</h3>
<p>Doesn&#8217;t suck after all. Â Actually, maybe I should say that JBoss, when combined with JRuby, means that JBoss doesn&#8217;t suck so much. Â I had the aforementioned Solr core admin tool bundled up as a WAR file with JRuby, and was able to deploy it to an existing environment that had JBoss installed! Â I didn&#8217;t have to install ruby on the box, (or JRuby for that matter!) Â I just deployed the WAR file and bamn, off to the races. Â Ops folks get the JBoss they love, I get the Ruby on Rails that I love.</p>
<p>And on a related note, <a href="http://kenai.com/projects/warbler/pages/Home">Warbler</a> was the key to thinking JRuby is cool. Â I&#8217;d never actually had to package up a RoR app, so Warbler came to the rescue. Â And you know what? Â It was nice to build a single file that I knew had everything that I needed in it that could be scp&#8217;ed around! Â And thanks to some cool code in the environment.rb, my app was able to load up the right configuration file for the environment based on an environmental variable set in JBoss.</p>
<h3>Virtual Machines</h3>
<p>I recently migrated a Linux VPS based RoR + Solr app (see a trend in tech choices <img src='http://www.opensourceconnections.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) Â to a Windows environment. Â And to deliever the new Windows environment, I used <a href="http://www.virtualbox.org/">VirtualBox</a> to host the Windows Vista environment on my Mac laptop.</p>
<p>A couple of notes:</p>
<ul>
<li>VirtualBox may not have all the snazzy integration points of Parallels with the host computer like seamless application sharing, but it seems to be much lighter weight. Â Starts up quicker, and I don&#8217;t get the spinning beach ball of death as much.</li>
<li>If you are shipping a 11 GB file, you can&#8217;t use a 16 GB USB Memory Stick&#8230; Â Turns out the biggest file is 4 GB. Â (Although I never tried formatting the stick as NTFS, maybe that would have allowed a single 11 GB file???)</li>
<li>Uploading 11 GB to a remote out on the internet server will take a long long long time. Â Even on a really fast network. connection.</li>
<li>If you need to format an external USB hard drive as NTFS on a Mac, it is possible! Â Just fire up your trusty Windows Vista image in Parallels, plug the USB drive in, download and install the correct USB drivers so the drive doesn&#8217;t show up as a network share mapped to the Mac, and then use the built in reformatting tools! Â Warning: This will take a loooong time!</li>
<li>Lastly, if you are using VirtualBox, and you attempt to create a Windows XP machine, and attach a Windows Vista hard disk image to it, VirtualBox will let you! Â And then Windows won&#8217;t start. Â sigh.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/03/09/vthings-i-learned-about-last-week/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Notes from using LucidWorks for Solr Distro</title>
		<link>http://www.opensourceconnections.com/2010/01/28/notes-from-using-lucidworks-for-solr-distro/</link>
		<comments>http://www.opensourceconnections.com/2010/01/28/notes-from-using-lucidworks-for-solr-distro/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 21:36:52 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=708</guid>
		<description><![CDATA[<p>I&#8217;ve been playing with the <a href="http://www.lucidimagination.com/Downloads">LucidWorks for Solr</a> distribution of Solr 1.4, and wanted to share some of things I had noticed about it.  The LucidWorks distro is Solr 1.4 with patches and enhancements from Lucid added in.</p>
<p><a href="http://www.opensourceconnections.com/2010/01/28/notes-from-using-lucidworks-for-solr-distro/" class="more-link">Read more on Notes from using LucidWorks for Solr Distro&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing with the <a href="http://www.lucidimagination.com/Downloads">LucidWorks for Solr</a> distribution of Solr 1.4, and wanted to share some of things I had noticed about it.  The LucidWorks distro is Solr 1.4 with patches and enhancements from Lucid added in.</p>
<p><strong>Installer</strong></p>
<p>The first thing you&#8217;ll notice is that an installer (and uninstaller) is provided that walks you through the basic steps of installing Solr.  Now Solr itself is pretty darn simple to work with already, but you do need to compile the code, which means you need Ant to be installed.  The Lucid installer avoids that need, and Â adds support for running Solr in Tomcat as well as Jetty.  And, assuming you have a support agreement with Lucid, it supports downloading plugins from Lucid to extend your Solr platform.  Right now the only free plugin is the Reference Guide PDF.  Having an installer available definitely checks a box for the systems type folks who may be installing Solr, but it doesn&#8217;t really do anything crazy special.   Also, one nit is that if you install into <code>/opt/dirA</code>, and then want to install into <code>/opt/dirB</code>, you have to delete <code>~/.LucidWorks/</code> directory as the install dir is cached! Â But it does demonstrate what might be coming from Lucid in future updates!</p>
<div class="wp-caption aligncenter" style="width: 730px"><img title="Installer Targets Screen" src="http://img.skitch.com/20100127-ntcnw1p829acxashk65bu5sk4i.png" alt="Installer Targets Screen" width="720" height="560" /><p class="wp-caption-text">Installer Targets Screen</p></div>
<p>Another enhancment from Lucid is a Tray Application for managing your Solr instances.  However, this turns out to just be a basic (on OSX at least!) menubar application that allows you to start/stop a local Solr server.  There doesn&#8217;t seem to be any options to stop and start remote servers, or monitor the health of running Solrs, so I think this is something you use once and never again!  Hey Lucid, it would be great though if the Tray App integrated stoplight monitoring of Solr instances and popped open web pages to admin pages to perform various tasks on your collection of Solr servers!<br />
<img class="aligncenter" title="Tray Applicaiton" src="http://img.skitch.com/20100127-td6wdb1p4ucytr644cdhktwtwt.png" alt="" width="694" height="112" /></p>
<p><strong>Directory Layout</strong></p>
<p>The directory that you&#8217;ve installed Solr into should look very familiar.  In fact, too familiar to me!  I&#8217;ve gone back and forth on the way that Solr is distributed with source code as well as compiled jars.  While Solr used to be a tool that only Java centric shops would look at, it&#8217;s now gone mainstream, to where many, if not most, organizations that use Solr are not traditional Java shops!  I really wish I could download a version of Solr that didn&#8217;t have the <code>src</code> directory, was just a stripped down ready to go application.  Admittedly, the <em>example</em> application that is part of the source functions as a template, but it has been bemoaned by myself and others that folks just use and abuse the configuration of what was meant as an example app, to their detriment!</p>
<p>So I was hoping that the LucidWorks distros&#8217; Installer would function as that smart template by walking me through including/excluding various extensions like DIH, Clustering, and Extraction.  But at least in this first version, no such luck.  The support though for for picking either Tomcat or Jetty as a container shows what could be in the offing though!</p>
<p>While the LucidWorks distro still ships with the hoary old <em>example</em> directory is still there, there is now a <em>lucidworks</em> directory.   When you run the new toplevel <code>start.sh</code> shell script it starts Solr with <code>solr.solr.home=lucidworks/solr</code> directory.  Something to note is that the <code>start.sh</code> has complete paths defined in it from the installer:</p>
<p>[sourcecode language="text"]<br />
cd /Users/epugh/solr/solr2/LucidWorks/lucidworks/jetty/../<br />
[/sourcecode]</p>
<p>It really should at least have a single variable at the top that you can changing depending on what environment you are in.</p>
<p>The <em>lucidworks</em> project is also setup as a single index project. Â Since the future is multicore configurations, I&#8217;d like to see that as the default in more examples. Â (The example app needs a bit of work as well to better show off multicore as a first class feature!)</p>
<p><strong>solrconfig.xml</strong></p>
<p><a href="http://www.pastie.org/797640">Doing a diff</a> on the <em>example</em> and <em>lucidworks</em> versions of <code>solrconfig.xml</code> shows its pretty much the same as the one from the example app, but with the correct configurations for <a href="http://wiki.apache.org/solr/DataImportHandler">DataImportHandler</a> and the Velocity based search UI calledÂ <a href="http://wiki.apache.org/solr/Solritas">Solritas</a>.  Solritas is a nice tool for helping you &#8220;wedge&#8221; Solr into places by providing a simple <a href="http://velocity.apache.org/">Velocity template</a> based translation layer, and even build a GUI, within your Solr environment.  Solritas hasn&#8217;t received a lot of buzz, so it&#8217;s nice seeing it turned on by default!  The clustering functionality is also specified, but not sure if the <code>solr.cluster.enabled=true</code> startup parameter is actually required or not.</p>
<p>The other oddity is that the Lucid monitoring product for Solr, <a href="http://www.lucidimagination.com/Downloads/LucidGaze-for-Solr">SolrGaze</a>, isn&#8217;t enabled by default!  Doesn&#8217;t seem like the most ringing endorsement for the software.  I&#8217;m excited by the prospect of better visiblity into the internals of Solr, so I enabled it.</p>
<p><strong>schema.xml</strong></p>
<p><a href="http://www.pastie.org/797684">Diffing the two schema.xml</a> files reveals the addition of the Lucid KStemmer <code>com.lucidimagination.solrworks.analysis.LucidKStemFilterFactory</code> for fast non-aggresive text stemming.  According to Lucid it provides:</p>
<blockquote><p>Large field performance shows a 220% performance increase, while small fields show a 1140% increase compared to the original UMASS code.</p></blockquote>
<p><strong>SolrGaze</strong></p>
<p>SolrGaze promises to make it easier to see what is going on inside of Solr.  Anything that makes it simpler for operations folks instead of developers to manage Solr is good in my book.  I ran into one nit which was I opened up SolrGaze using the url <code>http://localhost:8983/gaze/index.html</code>.  It barfed connecting to Solr to display gathered metrics, but if I used <code>http://127.0.0.1:8983/gaze/index.html</code> then everything was fine.</p>
<p>I haven&#8217;t had to chance to really play with Gaze yet, so I&#8217;ll post a more in-depth review soon.</p>
<p><strong>Summary</strong></p>
<p>All in all, the Lucid distro would be what I would recommend for a first timer to download, or someone doing a spike of development and needing a quick install of Solr. Â Not requiring Ant to be installed is a wonderful thing, and being pre-configured for Clustering, DIH, and Solritas means you get to see a working Solr install, complete with a full featured GUI, right out of the box. Â In terms of using for a production deploy, there is less to recommend it since you&#8217;re going to want to strip down to just the bits and bobs that your require for your specific needs. Â I haven&#8217;t delved down into what SolrGaze provides, so that feature may be the tipping point for deciding to use the Lucid distribution.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/01/28/notes-from-using-lucidworks-for-solr-distro/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Erik Hatcher, Solr Committer, reviews Solr 1.4 Enterprise Search Server</title>
		<link>http://www.opensourceconnections.com/2010/01/11/erik-hatcher-solr-committer-reviews-solr-1.4-enterprise-search-server/</link>
		<comments>http://www.opensourceconnections.com/2010/01/11/erik-hatcher-solr-committer-reviews-solr-1.4-enterprise-search-server/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 19:47:12 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[solr]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=686</guid>
		<description><![CDATA[<p>When I first got involved in writing <a href="http://www.packtpub.com/solr-1-4-enterprise-search-server" target="_blank">Solr 1.4 Enterprise Search Server</a> I knew that one of the folks I wanted to have review the book was Erik Hatcher, a Solr committer, and who introduced me to the project.</p>
<p><a href="http://www.opensourceconnections.com/2010/01/11/erik-hatcher-solr-committer-reviews-solr-1.4-enterprise-search-server/" class="more-link">Read more on Erik Hatcher, Solr Committer, reviews Solr 1.4 Enterprise Search Server&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>When I first got involved in writing <a href="http://www.packtpub.com/solr-1-4-enterprise-search-server" target="_blank">Solr 1.4 Enterprise Search Server</a> I knew that one of the folks I wanted to have review the book was Erik Hatcher, a Solr committer, and who introduced me to the project.</p>
<p>He has written a <a href="http://www.lucidimagination.com/blog/2010/01/11/book-review-solr-packt-boo">very indepth review,</a> that I&#8217;ll admit I was nervous to read!   But he summed it up as:</p>
<blockquote><p>Grand Finale<br />
I spelled out a lot of fiddly feedback above, and I expect the great addendum wiki page will factor in any keepers from this review.  Of course most of the review points out mistakes or differences of opinion, thatâ€™s what a review is for, though this is a solid, useful book.  So, if youâ€™re considering using Solr, this book is for you.  If youâ€™re already using Solr, youâ€™ll likely pick up a useful trick or three.  Go get it!</p></blockquote>
<p>As you can see from the level of detail in his post, when we come out with a second version of the Solr book, updating it for changes between when we published it and the final release of Solr 1.4 will be very easy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2010/01/11/erik-hatcher-solr-committer-reviews-solr-1.4-enterprise-search-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Streaming Index Progress Results to Browser</title>
		<link>http://www.opensourceconnections.com/2009/12/11/streaming-index-progress-results-to-browser/</link>
		<comments>http://www.opensourceconnections.com/2009/12/11/streaming-index-progress-results-to-browser/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 17:25:01 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rsolr]]></category>
		<category><![CDATA[streaming]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=589</guid>
		<description><![CDATA[<p>I recently needed to index from a local filesystem several thousand static webpages into Solr.  I was already using Ruby on Rails for the admin interface, so I quickly threw together an action to index the documents using HPricot and <a href="http://github.com/mwmitchell/rsolr">RSolr</a>.   To monitor the progress I just output to standard out using <code>puts</code><br />
[code lang="ruby"]<br />
def index_bulk_html<br />
  solr = RSolr.connect :url=&#62;SOLR_URL<br />
  count = 0<br />
  files = Dir.glob(&#34;/Users/epugh/Documents/code/www.somesite.com/**/*.{html,htm}&#34;)<br />
  files.each do &#124;file&#124;<br />
    path_ends_at = file.index(&#34;www.somesite.com&#34;)<br />
    unless path_ends_at.nil?<br />
      puts(&#34;&#60;strong&#62;Processed #{count} of #{files.size}&#60;/strong&#62;&#34;) if count % 100 == 0 </p>
<p><a href="http://www.opensourceconnections.com/2009/12/11/streaming-index-progress-results-to-browser/" class="more-link">Read more on Streaming Index Progress Results to Browser...</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I recently needed to index from a local filesystem several thousand static webpages into Solr.  I was already using Ruby on Rails for the admin interface, so I quickly threw together an action to index the documents using HPricot and <a href="http://github.com/mwmitchell/rsolr">RSolr</a>.   To monitor the progress I just output to standard out using <code>puts</code><br />
[code lang="ruby"]<br />
def index_bulk_html<br />
  solr = RSolr.connect :url=&gt;SOLR_URL<br />
  count = 0<br />
  files = Dir.glob(&quot;/Users/epugh/Documents/code/www.somesite.com/**/*.{html,htm}&quot;)<br />
  files.each do |file|<br />
    path_ends_at = file.index(&quot;www.somesite.com&quot;)<br />
    unless path_ends_at.nil?<br />
      puts(&quot;&lt;strong&gt;Processed #{count} of #{files.size}&lt;/strong&gt;&quot;) if count % 100 == 0 </p>
<p>      url = &quot;http://#{file[path_ends_at,file.size]}&quot;<br />
      title, content = parse_html(file, title, content)</p>
<p>      puts &quot;Bad Content:#{!page_content.blank?} #{url} #{title}&quot;</p>
<p>      begin<br />
        solr.add :id=&gt; url, :url=&gt;url, :mimeType=&gt;&quot;text/html&quot;, :title =&gt; title, :docText =&gt; page_content<br />
        solr.commit<br />
        count = count + 1<br />
      rescue RSolr::RequestError<br />
        puts &quot;&lt;strong&gt;Could not index #{file}&lt;/strong&gt;&quot;<br />
      end<br />
    end<br />
  end<br />
  puts &quot;Imported #{count} webpages successfully.&quot;<br />
  solr.optimize<br />
  redirect_to root_path</p>
<p>end[/code]<br />
This worked great, but I realized that indexing over 10,000 documents takes a long time, and meanwhile the user is staring at the browser slowly loading, wondering if things had frozen or not!   So I wondered if I could somehow stream some info back to the user.  Fortunately Rails has already solved that problem!  <a href="http://api.rubyonrails.org/classes/ActionController/Base.html">ActionController</a> has the ability to render as text a proc object, and stream the output:<br />
[code lang="ruby"]  # Renders &quot;Hello from code!&quot;<br />
  render :text =&gt; proc { |response, output| output.write(&quot;Hello from code!&quot;) }[/code]</p>
<p>So I quickly wrapped my existing code in a large proc, changed the puts to output.write, and now stream out to the browser constant progress reports:<br />
[code lang="ruby"]<br />
def index_bulk_html<br />
    solr = RSolr.connect :url=&gt;SOLR_URL<br />
    count = 0<br />
    files = Dir.glob(&quot;/Users/epugh/Documents/code/www.somesite.com/**/*.{html,htm}&quot;)<br />
    render :text =&gt; proc { |response, output|<br />
      files.each do |file|<br />
        path_ends_at = file.index(&quot;www.somesite.com&quot;)<br />
        unless path_ends_at.nil?<br />
          output.write(&quot;&lt;strong&gt;Processed #{count} of #{files.size}&lt;/strong&gt;&quot;) if count % 100 == 0 </p>
<p>          url = &quot;http://#{file[path_ends_at,file.size]}&quot;<br />
          title, content = parse_html(file, title, content)</p>
<p>          output.write &quot;Bad Content:#{!page_content.blank?} #{url} #{title}&quot;<br />
          output.flush</p>
<p>          begin<br />
            solr.add :id=&gt; url, :url=&gt;url, :mimeType=&gt;&quot;text/html&quot;, :title =&gt; title, :docText =&gt; page_content<br />
            solr.commit<br />
            count = count + 1<br />
          rescue RSolr::RequestError<br />
            output.write &quot;&lt;strong&gt;Could not index #{file}&lt;/strong&gt;&quot;<br />
            output.flush<br />
          end<br />
        end<br />
      end<br />
      output.write &quot;Imported #{count} webpages successfully.&quot;<br />
     }<br />
    solr.optimize</p>
<p>  end<br />
[/code]<br />
Thank you Rails, Hpricot, and RSolr for making life so simple!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/12/11/streaming-index-progress-results-to-browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>James Bach, the bad boy of Testing?</title>
		<link>http://www.opensourceconnections.com/2009/10/26/james-bach-the-bad-boy-of-testing/</link>
		<comments>http://www.opensourceconnections.com/2009/10/26/james-bach-the-bad-boy-of-testing/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 20:23:51 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[STPcon]]></category>
		<category><![CDATA[Speaking]]></category>
		<category><![CDATA[Exploratory Testing]]></category>
		<category><![CDATA[james bach]]></category>
		<category><![CDATA[stpcon2009]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=466</guid>
		<description><![CDATA[<p>So, is <a href="http://www.satisfice.com/blog/">James Bach</a> (<a href="http://www.twitter.com/jamesmarcusbach">@jamesmarcusbach</a>) the bad boy of testing?  </p>
<p>I flew up to Boston on Monday to lead some workshops on Continuous Integration.  I checked into my room at the Hyatt and then went downstairs to see who was around.  I ran into a couple of speakers milling about, and eventually joined one of them, and we headed over to the MIT Press bookstore, me to look for my Solr book.  I wasn&#8217;t too sure of the name of the other speaker I was with (I asked once, but couldn&#8217;t quite remember what it was&#8230;).  So we got to the book shop, I ask my fellow speaker again: James Bach.  The name I was familiar with, but couldn&#8217;t quite place it&#8230;  I ended up buying <a href="http://www.amazon.com/Parentonomics-Economist-Dad-Looks-Parenting/dp/0262012782/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1256239604&#038;sr=8-1">Parentonomics</a>, and then we go for coffee.</p>
<p><a href="http://www.opensourceconnections.com/2009/10/26/james-bach-the-bad-boy-of-testing/" class="more-link">Read more on James Bach, the bad boy of Testing?&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>So, is <a href="http://www.satisfice.com/blog/">James Bach</a> (<a href="http://www.twitter.com/jamesmarcusbach">@jamesmarcusbach</a>) the bad boy of testing?  </p>
<p>I flew up to Boston on Monday to lead some workshops on Continuous Integration.  I checked into my room at the Hyatt and then went downstairs to see who was around.  I ran into a couple of speakers milling about, and eventually joined one of them, and we headed over to the MIT Press bookstore, me to look for my Solr book.  I wasn&#8217;t too sure of the name of the other speaker I was with (I asked once, but couldn&#8217;t quite remember what it was&#8230;).  So we got to the book shop, I ask my fellow speaker again: James Bach.  The name I was familiar with, but couldn&#8217;t quite place it&#8230;  I ended up buying <a href="http://www.amazon.com/Parentonomics-Economist-Dad-Looks-Parenting/dp/0262012782/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1256239604&#038;sr=8-1">Parentonomics</a>, and then we go for coffee.</p>
<p>So, over coffee, he asks me about what my topic is, and I gave him the brief summary of my two CI related workshops.  Wow..  Little did I realize that I was sitting with the guy who rails against the &#8220;fetish&#8221; that Agile folks have for automated testing!  That his entire approach to &#8220;testing&#8221; is to use skilled, motivated folks who do &#8220;sapient testing&#8221;.  And I&#8217;m the guy who&#8217;s selling an approach that REQUIRES automated tests!  That encourages expanding the use of automated testing!</p>
<p>He actually walked me through a process of talking about how to &#8220;think like a tester&#8221;, and it was really great mini-workshop..  He definitely subscribes to the socratic approach, and believes in his message, I was sweating at the end of it!  That chat probably sparked more ideas in less time over that coffee then anything else this week.  I also heard a lot of ideas and phrases that were echoed in Michael Bolton&#8217;s keynote later on in the week.  Clearly a lot of collaboration between the two!</p>
<p>Probably the biggest idea that James and chatted about was the idea that automated tests really aren&#8217;t automated tests, they are automated checks.  They verify that the expected behavior of the code was met.  His argument that if you want to do testing, real testing, then computers, automated processes can&#8217;t meet that need, only people can.  </p>
<p>Now, I don&#8217;t know if I believe that is completely true, but I am very aware that the &#8220;manual testing&#8221; where long test scripts written as Word documents are executed by human beings by hand are really a waste of human potential.  And that those test scripts are really, to use James terms, &#8220;check scripts&#8221; because the people are not using any creativity!  In fact, a lot of my interest in CI comes from the idea that people should not do <a href="http://www.newtechusa.com/PPI/services.asp#Testing">monkey testing</a>, that machines can do it much better, and my frustation with the perception that testing is a low value activity and can be easily shipped off to low skilled folks.</p>
<p>I think that this shift away from the term &#8220;test&#8221; for automated tests is actually happening in many places.  In the Ruby world, we have libraries like Shoulda that are moving from using words like <em>assert</em> to other words like <em>should</em>.  A <a href="http://www.rubyinside.com/cucumber-the-latest-in-ruby-testing-1342.html">Cucumber</a> test really shows how controlled the space that a test needs to be to work well in an automated fashion:</p>
<blockquote><p>
Scenario: See all vendors<br />
    Given I am logged in as a user in the administrator role<br />
    And There are 3 vendors<br />
    When I go to the manage vendors page<br />
    Then I should see the first 3 vendor names
</p></blockquote>
<p>So while I don&#8217;t know if I am bought in on the idea that only people can do &#8220;testing&#8221;, and machines can only do &#8220;checking&#8221;.  Tools like <a href="http://ruby.sadi.st/Heckle.html">Heckle</a> try to simulate aspects of what a human can do.  While not suggesting that we can automate the &#8220;does my website look okay after someone changed the CSS&#8221; type of work today, in the future our automated testing will be more capable then just &#8220;checking&#8221; because we will move beyond the very constrained tests we have today to ones that mimicing the richness of the simulators that Airline Pilots use.  Instead of testing the training given to pilots, we&#8217;ll be testing the robustness of software via simulations!</p>
<p>At any rate, James Bach, while taking a rather provocative approach to sharing his ideas, does subscribe to my favorite bullet in the Agile Manifesto: <strong>Individuals and interactions over processes and tools</strong>.</p>
<p>Here is him giving a great presentation with the subversive title of &#8220;<a href="http://www.stpcon.com/session-how-to-fake-test-project.html">How to Fake a Project</a>&#8221; that was incredible entertaining, and also quite thought provoking:</p>
<p><a href="http://www.flickr.com/photos/27517504@N05/4047081589/" title="James Bach talking about &quot;Faking a Test Plan&quot; by opensourceconnections, on Flickr"><img src="http://farm3.static.flickr.com/2450/4047081589_3c8e0fbb07.jpg" width="500" height="375" alt="James Bach talking about &quot;Faking a Test Plan&quot;" /></a></p>
<p><br clear='all'/><br />
What do you think?  Automated testing is a fetish of the Agile community?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/10/26/james-bach-the-bad-boy-of-testing/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eric Pugh to speak on Solr at Shenandoah Ruby Users Group October 27th</title>
		<link>http://www.opensourceconnections.com/2009/10/20/eric-pugh-to-speak-on-solr-at-shenandoah-ruby-users-group-october-27th/</link>
		<comments>http://www.opensourceconnections.com/2009/10/20/eric-pugh-to-speak-on-solr-at-shenandoah-ruby-users-group-october-27th/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 17:38:50 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Speaking]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[ShRUG]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=463</guid>
		<description><![CDATA[<p>From the <a href="http://ruby.meetup.com/128/calendar/11501964/">Meetup site</a>:</p>
<blockquote><p>
We&#8217;ll look at the thriving Ruby ecosystem that has grown up around integrating with Solr. From Ruby gems that integrate with Solr like solrb and rsolr, to general search solutions like acts_as_solr and sunspot. We&#8217;ll also look at a complete &#8220;shrink wrapped&#8221; catalog solution for Solr using BlacklightOPAC.</p></blockquote>
<p><a href="http://www.opensourceconnections.com/2009/10/20/eric-pugh-to-speak-on-solr-at-shenandoah-ruby-users-group-october-27th/" class="more-link">Read more on Eric Pugh to speak on Solr at Shenandoah Ruby Users Group October 27th&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>From the <a href="http://ruby.meetup.com/128/calendar/11501964/">Meetup site</a>:</p>
<blockquote><p>
We&#8217;ll look at the thriving Ruby ecosystem that has grown up around integrating with Solr. From Ruby gems that integrate with Solr like solrb and rsolr, to general search solutions like acts_as_solr and sunspot. We&#8217;ll also look at a complete &#8220;shrink wrapped&#8221; catalog solution for Solr using BlacklightOPAC.</p>
<p>You&#8217;ll lean the basics of getting started with Solr, and an understanding of what Ruby solutions are available to simplifying adding great search to your site!</p>
<p>As usual, food and beverages will be provided.</p></blockquote>
<div style="text-align: center; width: 214px; font-family: tahoma, verdana, sans serif; font-size: 12px;"><embed src="http://www.meetup.com/swf/membership_badge.swf?chapterid=1006180" width="214" height="142" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br /><a href="http://ruby.meetup.com/128/?track=i3/mu_zf6g67ak53">Click here to check out<br />The Shenandoah Ruby Users Group!</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/10/20/eric-pugh-to-speak-on-solr-at-shenandoah-ruby-users-group-october-27th/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSC will attend and sponsor EdUI Conference 2009 in the University of Vir</title>
		<link>http://www.opensourceconnections.com/2009/08/23/osc-will-attend-and-sponsor-edui-conference-2009-in-the-university-of-vir/</link>
		<comments>http://www.opensourceconnections.com/2009/08/23/osc-will-attend-and-sponsor-edui-conference-2009-in-the-university-of-vir/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 19:14:28 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[eduiconf]]></category>
		<category><![CDATA[eduiconf2009]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=454</guid>
		<description><![CDATA[<p><img src="http://www.eduiconf.org/wp-content/themes/edui/library/media/images/header_logo.png" alt="edUI Conf" width="378" height="92"/><br />
<br clear="all"/></p>
<p>OSC is proud to announce that we will attend and sponsor this year&#8217;s EdUI Conference 2009 which is bein held at the University of Virginia on 21st-22nd September 2009.  A number of folks from the OSC team will be attending, and stop by our booth in the Vendor Hall on the second day and introduce yourself!</p>
<p><a href="http://www.opensourceconnections.com/2009/08/23/osc-will-attend-and-sponsor-edui-conference-2009-in-the-university-of-vir/" class="more-link">Read more on OSC will attend and sponsor EdUI Conference 2009 in the University of Vir&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.eduiconf.org/wp-content/themes/edui/library/media/images/header_logo.png" alt="edUI Conf" width="378" height="92"/><br />
<br clear="all"/></p>
<p>OSC is proud to announce that we will attend and sponsor this year&#8217;s EdUI Conference 2009 which is bein held at the University of Virginia on 21st-22nd September 2009.  A number of folks from the OSC team will be attending, and stop by our booth in the Vendor Hall on the second day and introduce yourself!</p>
<p>EdUI 2009 boasts a powerhouse lineup of renowned and popular headliner speakers, most often found at the Web industryâ€™s premier events. In addition to these, it features a series of presentations, selected through a proposal process, to allow peers, colleagues, and geek kindreds to enlighten one another with their expertise and ideas.  Our very own <a href="http://www.eduiconf.org/speakers/#arin-sime">Arin Sime</a> will be speaking on <a href="http://www.eduiconf.org/session/the-facebook-api-thinking-about-ui-in-a-social-way/">The Facebook API: Thinking About UI in a Social Way</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/08/23/osc-will-attend-and-sponsor-edui-conference-2009-in-the-university-of-vir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solr 1.4 Enterprise Search Server Book is Released!</title>
		<link>http://www.opensourceconnections.com/2009/08/19/solr-1.4-enterprise-search-server-book-is-released/</link>
		<comments>http://www.opensourceconnections.com/2009/08/19/solr-1.4-enterprise-search-server-book-is-released/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 15:20:51 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=453</guid>
		<description><![CDATA[<p><a href="http://www.packtpub.com/solr-1-4-enterprise-search-server/mid/210809p3ygr4?utm_source=opensourceconnections.com&#038;utm_medium=affiliate&#038;utm_content=authorsite&#038;utm_campaign=mdb_000342"><img src='http://images.packtpub.com/images/full/1847195881.jpg' alt='Solr 1.4 Enterprise Search Server Book Cover' class='alignnone' width="60%" height="60%"/ border=0/></a><br />
<br clear="all"/></p>
<p>I am very proud to annouce the first book on Solr has been published by Packt.  This has been a labor of love for myself and my co-author David Smiley, and we are excited to see the book now &#8220;in the wild!&#8221;.  Below is a copy of the email sent to the Solr community:</p>
<p><a href="http://www.opensourceconnections.com/2009/08/19/solr-1.4-enterprise-search-server-book-is-released/" class="more-link">Read more on Solr 1.4 Enterprise Search Server Book is Released!&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.packtpub.com/solr-1-4-enterprise-search-server/mid/210809p3ygr4?utm_source=opensourceconnections.com&#038;utm_medium=affiliate&#038;utm_content=authorsite&#038;utm_campaign=mdb_000342"><img src='http://images.packtpub.com/images/full/1847195881.jpg' alt='Solr 1.4 Enterprise Search Server Book Cover' class='alignnone' width="60%" height="60%"/ border=0/></a><br />
<br clear="all"/></p>
<p>I am very proud to annouce the first book on Solr has been published by Packt.  This has been a labor of love for myself and my co-author David Smiley, and we are excited to see the book now &#8220;in the wild!&#8221;.  Below is a copy of the email sent to the Solr community:</p>
<blockquote><p>
Fellow Solr users,</p>
<p>I&#8217;ve finally finished the book &#8220;Solr 1.4 Enterprise Search Server&#8221; with my co-author Eric.  We are proud to present the first book on Solr and hope you find it a valuable resource.   You can find full details about the book and purchase it here:<br />
<a href="http://www.packtpub.com/solr-1-4-enterprise-search-server/mid/210809p3ygr4?utm_source=opensourceconnections.com&#038;utm_medium=affiliate&#038;utm_content=authorsite&#038;utm_campaign=mdb_000342">http://www.packtpub.com/solr-1-4-enterprise-search-server/book</a><br />
It can be pre-ordered at a discount now and should be shipping within a week or two.  The book is also available through Amazon.  You can feel good about the purchase knowing that 5% of each sale goes to support the Apache Software Foundation.  For a free sample, there is a portion of chapter 5 covering faceting available as an article online here:<br />
<a href="http://www.packtpub.com/article/faceting-in-solr-1.4-enterprise-search-server">http://www.packtpub.com/article/faceting-in-solr-1.4-enterprise-search-server</a></p>
<p>By the way, we realize Solr 1.4 isn&#8217;t out [quite] yet.  It is feature-frozen however, and there&#8217;s little in the forthcoming release that isn&#8217;t covered in our book.  About the only notable thing that comes to mind is the contrib module on search result clustering.  However Eric plans to write a free online article available from Packt Publishing on that very subject.</p>
<p>&#8220;Solr 1.4 Enterprise Search Server&#8221; In Detail:</p>
<p>If you are a developer building a high-traffic web site, you need to have a terrific search engine. Sites like Netflix.com and Zappos.com employ Solr, an open source enterprise search server, which uses and extends the Lucene search library. This is the first book in the market on Solr and it will show you how to optimize your web site for high volume web traffic with full-text search capabilities along with loads of customization options. So, let your users gain a terrific search experience</p>
<p>This book is a comprehensive reference guide for every feature Solr has to offer. It serves the reader right from initiation to development to deployment. It also comes with complete running examples to demonstrate its use and show how to integrate it with other languages and frameworks</p>
<p>This book first gives you a quick overview of Solr, and then gradually takes you from basic to advanced features that enhance your search. It starts off by discussing Solr and helping you understand how it fits into your architectureâ€”where all databases and document/web crawlers fall short, and Solr shines. The main part of the book is a thorough exploration of nearly every feature that Solr offers. To keep this interesting and realistic, we use a large open source set of metadata about artists, releases, and tracks courtesy of the MusicBrainz.org project. Using this data as a testing ground for Solr, you will learn how to import this data in various ways from CSV to XML to database access. You will then learn how to search this data in a myriad of ways, including Solr&#8217;s rich query syntax, &#8220;boosting&#8221; match scores based on record data and other means, about searching across multiple fields with different boosts, getting facets on the results, auto-complete user queries, spell-correcting searches, highlighting queried text in search results, and so on.</p>
<p>After this thorough tour, we&#8217;ll demonstrate working examples of integrating a variety of technologies with Solr such as Java, JavaScript, Drupal, Ruby, XSLT, PHP, and Python.</p>
<p>Finally, we&#8217;ll cover various deployment considerations to include indexing strategies and performance-oriented configuration that will enable you to scale Solr to meet the needs of a high-volume site</p>
<p>Sincerely,</p>
<p>David Smiley (primary-author)<br />
           dsmiley@mitre.org<br />
Eric Pugh (co-author)<br />
           epugh@opensourceconnections.com
</p></blockquote>
<p>A huge round of thanks goes to David for bringing me into this project and being such a great partner on it!  With 5% of the proceeds going to the Apache Software Foundation, here&#8217;s hoping it&#8217;s a great success!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/08/19/solr-1.4-enterprise-search-server-book-is-released/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>MonkeyCI: Super light-weight Continuous Integration for small teams</title>
		<link>http://www.opensourceconnections.com/2009/05/20/monkeyci-super-light-weight-continuous-integration-for-small-teams/</link>
		<comments>http://www.opensourceconnections.com/2009/05/20/monkeyci-super-light-weight-continuous-integration-for-small-teams/#comments</comments>
		<pubDate>Wed, 20 May 2009 14:05:03 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[MonkeyCI]]></category>
		<category><![CDATA[PPI]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=433</guid>
		<description><![CDATA[<p>At OSC, we have a <a href="http://www.opensourceconnections.com/methodology/">well developed methodology</a> that we apply to our client work, and one of the core tenets is using Continuous Integration to ensure our code behaves the way we intend it to.</p>
<p><a href="http://www.opensourceconnections.com/2009/05/20/monkeyci-super-light-weight-continuous-integration-for-small-teams/" class="more-link">Read more on MonkeyCI: Super light-weight Continuous Integration for small teams&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>At OSC, we have a <a href="http://www.opensourceconnections.com/methodology/">well developed methodology</a> that we apply to our client work, and one of the core tenets is using Continuous Integration to ensure our code behaves the way we intend it to.</p>
<p>However, recently we&#8217;ve had two projects were the usual CI solutions such as CruiseControl etc haven&#8217;t worked out well, and we had to develop our own internal CI tool that we are ready to publish to the world called <strong>MonkeyCI</strong>.</p>
<p>On the first project, which was a PHP based application with 5 full time developers, we used CruiseControl with the <a href="http://www.phpundercontrol.org/about.html">phpUnderControl</a> addon.  However, we were running CruiseControl on what turned out to be an underpowered hosted Windows server, and we kept getting build failure errors related to environmental difficulties.   Now, if you&#8217;ve seen my talk about CI, you know how big I am on speccing a beefy server for CI, and this experience reinforced that lesson.  We decided that migrating the CI environment to a bigger server was something that we felt was in the &#8220;nice to have&#8221; category, and that it could wait till the next iteration.  But we needed something immediate.  Enter <strong>MonkeyCI</strong>.   </p>
<p>The heart of CI is all about building the code, running the tests, and publishing the results frequently.   Everything else, the reports, the red/green lava lamps, the pretty JavaDocs etc are all gravy.  To meet the needs of your developers, you need to know if the &#8220;bar is green&#8221;.  So MonkeyCI does that in a decidedly low tech way:<br />
<img src="http://farm4.static.flickr.com/3361/3548951274_850919ef39.jpg?v=0" alt="MonkeyCI" /><br />
<br clear="all"/></p>
<p>Everytime someone runs the full suite of unit tests they record the day and time, and put their initials.  If the build is failing then they immediately fixed it.  We&#8217;ve played with writing the results in red for failing builds and green for successful builds as well.  Then, each day at the standup someone highlights how the CI is doing, and verifies that multiple folks are initialing, which means that the tests are running on multiple systems successfully.  </p>
<p>While this does mean you have an additional manual process, it&#8217;s also really easy to do, requiring just a whiteboard!  And for small project teams, the overhead of maintaining a reliable CI system is too much.</p>
<p>We&#8217;re doing another two developer project right now, and at least so far <strong>MonkeyCI</strong> has been great.  We haven&#8217;t seen integration issues yet such as database scripts that don&#8217;t run, or busted code being checked in.  I&#8217;ll post a picture of our whiteboard once we have a bunch of checkoffs recorded!  </p>
<p>We call this simple low tech process <strong>MonkeyCI</strong> because typically we refer to anything manual, such as testing by pounding keyboards as Monkey testing.   Also, somewhat of a reference to the great developers at the Primate Programming Institute who I am sure would use this approach to CI!:</p>
<p>
<a href="http://www.newtechusa.com/ppi/main.asp"><img src="http://www.newtechusa.com/ppi/link-buttons/ppi-banner.gif" width="468" height="60" alt="Primate Programming Inc: The Evolution of Java and .NET Training" border="0" /></a>
</p>
<p><br clear="all"/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/05/20/monkeyci-super-light-weight-continuous-integration-for-small-teams/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programatically Capturing Web pages as Images</title>
		<link>http://www.opensourceconnections.com/2009/05/12/programatically-capturing-web-pages-as-images/</link>
		<comments>http://www.opensourceconnections.com/2009/05/12/programatically-capturing-web-pages-as-images/#comments</comments>
		<pubDate>Tue, 12 May 2009 13:26:21 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[fish4brains]]></category>
		<category><![CDATA[HighTechCville]]></category>
		<category><![CDATA[thumbshots]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=432</guid>
		<description><![CDATA[<p>I don&#8217;t normally post blog articles that are reposts of other content, but this email thread answered a question that I&#8217;ve struggled with, which is how do you render a web page and save it as an image.  I do this on <a href="http://www.hightechcville.com">HighTechCville</a>, and our Fish4Brains RailsRumble entry a couple of years ago via <a href="http://thumbshots.org">thumbshots.org</a>, but I&#8217;ve never been happy with that service:</p>
<p><a href="http://www.opensourceconnections.com/2009/05/12/programatically-capturing-web-pages-as-images/" class="more-link">Read more on Programatically Capturing Web pages as Images&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t normally post blog articles that are reposts of other content, but this email thread answered a question that I&#8217;ve struggled with, which is how do you render a web page and save it as an image.  I do this on <a href="http://www.hightechcville.com">HighTechCville</a>, and our Fish4Brains RailsRumble entry a couple of years ago via <a href="http://thumbshots.org">thumbshots.org</a>, but I&#8217;ve never been happy with that service:</p>
<blockquote><p>
At Sun, 3 May 2009 11:19:17 -0400,<br />
Eric Pugh wrote:<br />
Cool!</p>
<p>It&#8217;s one of those things that seems like everybody wants it, but no<br />
one has quite figured out. And the various &#8220;services&#8221; like<br />
thumbshots all feel kinda &#8220;seedy&#8221;, I am always expecting to see<br />
advertisements for viagra stamped on top of the screenshots and<br />
other questionable business practices.</p>
<p>It seems like you should be able to have the pages be render inside<br />
of a library such as WebKit, but I guess rendering is very<br />
intertwined with monitor displays and resolutions etc.</p>
<p>I have a research projects that aggregates info about people,<br />
events, and organizations and I&#8217;d love a better solution for linking<br />
in screenshots of the organizations and individuals site. Here is an<br />
example using the thumbshot service for now..:<br />
<a href="http://www.hightechcville.com/organizations/318-worrell-water-technologies">http://www.hightechcville.com/organizations/318-worrell-water-technologies</a></p>
<p>Here is the text (thanks to Mark Phillips for this):</p>
<p>Khtml2png &#8211; <a href="http://khtml2png.sourceforge.net/">http://khtml2png.sourceforge.net/</a> â€œKhtml2png is a<br />
command line program to create screenshots of webpages. It uses<br />
libkhtml (the library that is used in the KDE web browser Konqueror).<br />
In khtml2png 2.0.5 to 2.5.0, &#8220;convert&#8221; from the ImageMagick graphic<br />
conversion toolkit is used to create the output files in various<br />
image file formats. 2.6.0 and future development will use the built-in<br />
conversion of the Qt library.â€ â€“ from the Khtml2png website</p>
<p>Pearl Crescent Page Saver -<br />
<a href="http://pearlcrescent.com/products/pagesaver/">http://pearlcrescent.com/products/pagesaver/</a> â€œPearl Crescent Page<br />
Saverâ€ is an extension for Mozilla Firefox that lets you capture<br />
images of web pages. These images can be saved in PNG format or (with<br />
Firefox 2) in JPEG format. The entire page or just the visible portion<br />
may be captured. Options let you control whether images are captured<br />
at full size (which is the default) or scaled down to a smaller size.<br />
Page Saver uses the canvas feature that was introduced in Firefox 1.5.â€<br />
â€“ from the Pearl Crescent Page Saver website</p>
<p>Webkit2png &#8211; <a href="http://www.paulhammond.org/webkit2png/">http://www.paulhammond.org/webkit2png/</a> â€œWebkit2png is a<br />
command line tool that creates PNG screenshots of webpages. â€¦<br />
webkit2png makes use of webkit, the rendering engine used in Safari.â€<br />
â€“ from the Webkit2png website This utility is only available for Mac<br />
OSX because of the dependence on Safari.</p>
<p>Webshot &#8211; <a href="http://www.websitescreenshots.com/">http://www.websitescreenshots.com/</a> â€œWebShot is a program<br />
that allows you to take screenshots and thumbnails of web pages or<br />
whole websites. It comes with a command line interface for advanced<br />
users. The following image formats are supported: JPG, GIF, PNG, BMP.â€<br />
â€“ from the WebShot website WebShot uses Internet Explorer as the<br />
engine for creating thumbnails of HTML files.</p>
<p>best,<br />
Erik Hetzner</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/05/12/programatically-capturing-web-pages-as-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Richmond SPIN on Continuous Integration</title>
		<link>http://www.opensourceconnections.com/2009/05/06/richmond-spin-on-continuous-integration/</link>
		<comments>http://www.opensourceconnections.com/2009/05/06/richmond-spin-on-continuous-integration/#comments</comments>
		<pubDate>Wed, 06 May 2009 20:18:56 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Speaking]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[richmondspin]]></category>
		<category><![CDATA[SPIN]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=427</guid>
		<description><![CDATA[<p>I have the honor of speaking to the <a href="http://www.richmondspin.org/">Richmond SPIN</a> group on Continous Integration next week Wednesday, May 13.  SPIN is the Software and Systems Process Improvement Network, and are the local groups sponsored by <a href="http://www.sei.cmu.edu/collaborating/spins/">Carnegie Mellon University&#8217;s Software Engineering Institute</a>.<br />
<img src="http://www.opensourceconnections.com/wp-content/uploads/2009/05/spin.jpg" alt="" title="Richmond SPIN" width="288" height="167" class="alignright size-full wp-image-428" /><br />
My presentation is going to be a bit different from some of the previous topics that have talked about process improvement, whereas I am talking about a specific improvement that enhances your process.  A CI system can provide the base framework for layering on much more then just the basic automatic code/compile/test cycle, and we&#8217;ll talk about what else it can be.</p>
<p><a href="http://www.opensourceconnections.com/2009/05/06/richmond-spin-on-continuous-integration/" class="more-link">Read more on Richmond SPIN on Continuous Integration&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>I have the honor of speaking to the <a href="http://www.richmondspin.org/">Richmond SPIN</a> group on Continous Integration next week Wednesday, May 13.  SPIN is the Software and Systems Process Improvement Network, and are the local groups sponsored by <a href="http://www.sei.cmu.edu/collaborating/spins/">Carnegie Mellon University&#8217;s Software Engineering Institute</a>.<br />
<img src="http://www.opensourceconnections.com/wp-content/uploads/2009/05/spin.jpg" alt="" title="Richmond SPIN" width="288" height="167" class="alignright size-full wp-image-428" /><br />
My presentation is going to be a bit different from some of the previous topics that have talked about process improvement, whereas I am talking about a specific improvement that enhances your process.  A CI system can provide the base framework for layering on much more then just the basic automatic code/compile/test cycle, and we&#8217;ll talk about what else it can be.</p>
<p>More information and registration is available at <a href="http://www.richmondspin.org/home22332">http://www.richmondspin.org/home22332</a>.</p>
<p>I&#8217;m looking forward to a good crowd, lots of questions, and drinks afterwords!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/05/06/richmond-spin-on-continuous-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Scrum take on &#8220;Metrics and Analysis in Companies at Different Maturity Levels of the CMMI&#8221;</title>
		<link>http://www.opensourceconnections.com/2009/04/23/a-scrum-take-on-metrics-and-analysis-in-companies-at-different-maturity-levels-of-the-cmmi/</link>
		<comments>http://www.opensourceconnections.com/2009/04/23/a-scrum-take-on-metrics-and-analysis-in-companies-at-different-maturity-levels-of-the-cmmi/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 13:43:47 +0000</pubDate>
		<dc:creator>Eric Pugh</dc:creator>
				<category><![CDATA[Conference]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[cmmi]]></category>
		<category><![CDATA[SPIN]]></category>
		<category><![CDATA[tps_reports]]></category>

		<guid isPermaLink="false">http://www.opensourceconnections.com/?p=422</guid>
		<description><![CDATA[<p>Last month <a href="http://www.opensourceconnections.com/author/sstults/">Scott</a>, <a href="http://www.opensourceconnections.com/author/asime/">Arin</a>, and myself road tripped to attend the <a href="http://www.richmondspin.org/">Richmond SPIN</a> meeting, where Kris Puthucode of the Software Quality Center gave a talk on &#8220;<a href="http://www.richmondspin.org/home2233">Metrics and Analysis in Companies at Different Maturity Levels of the CMMI<br />
Model&#8221;</a>.  The focus on the talk was what results you can expect out of metrics if you do the work of performing the analysis required. </p>
<p><a href="http://www.opensourceconnections.com/2009/04/23/a-scrum-take-on-metrics-and-analysis-in-companies-at-different-maturity-levels-of-the-cmmi/" class="more-link">Read more on A Scrum take on &#8220;Metrics and Analysis in Companies at Different Maturity Levels of the CMMI&#8221;&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Last month <a href="http://www.opensourceconnections.com/author/sstults/">Scott</a>, <a href="http://www.opensourceconnections.com/author/asime/">Arin</a>, and myself road tripped to attend the <a href="http://www.richmondspin.org/">Richmond SPIN</a> meeting, where Kris Puthucode of the Software Quality Center gave a talk on &#8220;<a href="http://www.richmondspin.org/home2233">Metrics and Analysis in Companies at Different Maturity Levels of the CMMI<br />
Model&#8221;</a>.  The focus on the talk was what results you can expect out of metrics if you do the work of performing the analysis required. </p>
<p>I was attending the presentation with a certain sense of trepidation&#8230;   I consider myself a hard core developer( despite my &#8220;<a href="http://testobsessed.com/">Test Obsessed</a>&#8221; armband) who doesn&#8217;t have time or patience for pointy headed manager paperwork.  But I am also someone who focuses on process improvement and honing my craft of software development, so where can metrics inspired by CMMI be useful to a fast moving Agile team cranking out functioning software every three weeks?  So I listened to Kris and tried to think about what he said in the context of Scrum.</p>
<p>The first slide pointed out that there are three kinds of lies: &#8220;lies, damn lies, and statistics&#8221;.  You need to be careful about what your data says.  When you are measuring velocity in Scrum, you need to have a couple of sprints, at least 3 to have any sense of your progress.  If you say &#8220;we get X done&#8221; based on the first sprint, well often the first one is very conservative sprint.  And, as you look at your average burndown, you need to have a couple of days of information before you can get a sense of average burndown as the first days often you find as many tasks as you accomplish.  And, over the 15 days of your iteration, progress can be pretty spiky&#8230;  Many teams have pretty flat burn down at the beginning, and then some steep drops&#8230;  Ideally you are looking to see progress per day become flatter, less spiky, which would indicate that your estimating is improving.  Or your team is being less affected by external factors that might hamper their productivity.</p>
<p>He talked about whether to use average or median numbers in looking at series of numbers, such as looking at your burndown..  If you have a lot of outliers, then use median to get a better view, otherwise use average.  So if you burndown 20, 25, 22, 40, 25 then using the average is good.  But if you have 8, 20, 25, 22, 40, 12 then maybe median would be better.</p>
<p>Kris talked about the cultural challenge of convincing people to provide the data required to build metrics.  People need to know why the numbers matter, and even better why it will help then.  It&#8217;s why developer&#8217;s hate filling out TPS reports!  And why I like Scrum and it&#8217;s low overhead, as well as more passive measurement tools like <a href="http://en.wikipedia.org/wiki/Hackystat">HackyStat</a> and <a href="http://www.rallydev.com/sixth_sense/home.html">6thSense</a>(now part of RallyDev).  I feel like mandating one metric, say your basic time tracking is viable, but if you add more on you start getting more push back or gaming of the metrics.  </p>
<p>He talked about getting metrics like Project Start Date and Project End Date.  A local company splits up it&#8217;s year as 3 week iterations, and then apportions iterations across competing projects.   These iterations then feed the project start and end dates.  </p>
<p>He stressed that you need to have a shared vision on metrics, and a shared vision of what &#8220;on time, in budget, with quality&#8221; really means.  I know we the other day had a scrum team debate how to track found tasks.   And this was a set of people that had worked together previously on different project having different visions of tracking found tasks and how they should affect the &#8220;ideal burndown&#8221; line!  Covering periodically what that shared vision, and ensuring your team and stakeholders are all on the same page is very valuable.</p>
<p>He stressed that your metrics need to be actual &#8220;measurable&#8221; things.  You need to be able to quantify the metrics that you are using using a shared basis so that when you compare two things using the same metric that you are doing an apples to apples comparison, not an apples to kiwi comparison!  For Scrum, it means you need to use the same time frame for iterations, and you can compare one sprint to another for a specific team on a specific project, but not across teams or projects.  </p>
<p>Scrum for us provides a very standarized metrics across the OSC organization, regardless of client or specific technology.  As long as we are sharing the same vision for our metrics!</p>
<p>When we do a retrospective, and look back at our burndowns, we are doing &#8220;Progress Indicators&#8221; that are lagging indicators.  One of the things that the speaker was advocating was to look at forward looking indicators that predict into the future where we will be.  But of course, identifying and seeing a leading indicator is difficult, and takes a lot more analysis.  In scrum we would have to tie our tasks to various sprint goals which are appropriately estimated against to provide our velocity.  </p>
<p>Did highlight that you need multiple projects happening to be able to gather the variety of data points to be able to compare data points.  Compare two scrum teams together and it&#8217;s tough to compare them because you can&#8217;t see the outliers.  But, if you have 10 scrum teams, who have a shared vision of the metrics, then you can start comparing them together.  You may have to normalize across the teams, but with enough iterations you can compare and predict.</p>
<p>So some things to show would be a histgram of how much the team burns down a day.  Highlight what kind of deviation we have in our progress per day.  Over multiple sprints you can maybe see what the first third, middle third, and final third look like.  Can we characterize &#8220;At OSC, we typically see this kinda of result in the thirds of the project?&#8221;   Hey, does this feed into our Waterfall projects in 3 weeks?</p>
<p>First week is requirements solidification.  Second week is development.  Third week is testing and polish.</p>
<p>Can we figure out how to predict the results for sprint 3?   We could do this for sprint 1 and 2 and predict sprint 3.  </p>
<p>We measure progress per day as a ratio, and then sum it over a week.  With that progress per week, then we can see what a sprint 3 would do.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.opensourceconnections.com/2009/04/23/a-scrum-take-on-metrics-and-analysis-in-companies-at-different-maturity-levels-of-the-cmmi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
