<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
  xmlns:thr="http://purl.org/syndication/thread/1.0">
  <link rel="self" href="http://intertwingly.net/blog/index.atom"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <id>http://intertwingly.net/blog/index.atom</id>
  <icon>../favicon.ico</icon>

  <title>Sam Ruby</title>
  <subtitle>It’s just data</subtitle>
  <author>
    <name>Sam Ruby</name>
    <email>rubys@intertwingly.net</email>
    <uri>/blog/</uri>
  </author>
  <updated>2012-07-18T11:15:17-07:00</updated>
  <link href="/blog/"/>
  <link rel="license" href="http://creativecommons.org/licenses/BSD/"/>

  <entry>
    <id>tag:intertwingly.net,2004:3299</id>
    <link href="/blog/2012/07/16/Inhibiting-Suspend"/>
    <link rel="replies" href="3299.atom" thr:count="1" thr:updated="2012-07-17T08:34:14-07:00"/>
    <title>Inhibiting Suspend</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns='http://www.w3.org/2000/svg' width="109" height="92" viewBox="0 0 109 92">
  <g style='fill:#FFFFFF;stroke:#3B80AE;stroke-width:3'>
    <path d='M107,51c3,10-3,20-13,23l-60,15c-10,3-20-3-23-13l-9-36c-2-10,3-20,13-22l60-16c10-2,20,3,23,13z' style='stroke:#BABABA'></path>
    <path d='M101,50c2,10-2,17-12,19l-53,14c-9,3-18-1-20-11l-8-30c-2-11,1-17,12-20l53-14c10-2,18,2,20,11z' style='fill:#3B80AE;stroke:none'></path>
    <path d='M57,65l-27-26l48-5z' style='opacity:0.5;fill:none;stroke:#FFFFFF'></path>
    <path d='M91,36c0,2-1,4-3,5l-15,4c-2,0-4-1-5-3l-3-11c0-2,1-4,3-5l15-4c2,0,4,1,5,3z'></path>
    <path d='M46,42c0,3-1,5-3,6l-19,5c-3,0-5-1-6-4l-3-13c-1-3,0-5,3-6l19-5c2,0,5,1,5,4z'></path>
    <path d='M66,67c0,1-1,3-2,3l-11,3c-1,0-2-1-3-2l-2-8c0-1,1-2,2-3l11-3c1,0,3,1,3,2z'></path>
  </g>
</svg>
<p>The <a href="http://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Inhibit">interface</a> is a bit low level, but workable:</p>
<pre class="code">require 'dbus' # gem install ruby-dbus
bus = DBus::SessionBus.instance
sm = bus.service('org.gnome.SessionManager').object('/org/gnome/SessionManager')
sm.introspect
sm.default_iface = 'org.gnome.SessionManager'
cookie = sm.Inhibit($0, 0, 'inhibiting', 4).first
at_exit { cookie = sm.Uninhibit(cookie) if sm.IsInhibited(4).first }</pre>
<p>Note: the call to <code>Uninhibit</code> is optional — it will occur on process exit anyway.</p>
<p>Hat tip to <a href="http://www.lucidelectricdreams.com/2011/06/disabling-screensaverlock-screen-on.html">JanuZ</a>.</p></div></content>
    <updated>2012-07-16T08:48:01-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3298</id>
    <link href="/blog/2012/07/10/utf8mb4"/>
    <link rel="replies" href="3298.atom" thr:count="4" thr:updated="2012-07-10T20:06:12-07:00"/>
    <title>utf8mb4</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="115" height="87" viewBox="0 0 115 87">
  <path d="M0,1v83h26c-10,0-22-11-22-21v-62zM22,1v53c0,16,22,16,22,0v-53zM41,84c10,0,22-11,22-21v-22l27,43zM60,1h30v20h19v-20h5v84h-5v-56h-19v18z" fill="#C60025"></path>
</svg>
<p><a href="http://golem.ph.utexas.edu/~distler/blog/archives/002539.html"><cite>Jacques Distler</cite></a>: <em>Remarkably, even after a decade of such pain, Unicode is, in 2012, still “cutting edge.”</em></p>
<p>Ouch.</p></div></content>
    <updated>2012-07-10T10:55:32-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3297</id>
    <link href="/blog/2012/06/23/Ubuntu-12-04-and-Ruby-1-9-3"/>
    <link rel="replies" href="3297.atom" thr:count="0"/>
    <title>Ubuntu 12.04 and Ruby 1.9.3</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I previously had installed Ubuntu 12.04 on a NetBook, and my overall impression was simply that it was more stable than its predecessor — particularly for Unity.</p>
<p>For the first time I tried it on a desktop, and to my surprise the following worked:</p>
<pre class="code">sudo apt-get install ruby1.9.3</pre>
<p>And by worked, I mean not only did it install Ruby 1.9.3, but it made it (and gem, and irc) the default ruby.</p>
<p>For those that still use <a href="https://rvm.io//">rvm</a>, (many of the ‘cool kids’ have moved on to <a href="https://github.com/sstephenson/rbenv/">rbenv</a>, I noticed a few niggles</p></div></summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="140" height="140" viewBox="-70 -70 140 140">

  <defs>
    <path id="b" d="M 23,-20 A32,32 0,0,0 -23,-20 L -40,-30 A42,42 0,0,1 -14,-47 A17,17 0,0,0 14,-47 A42,42 0,0,1 40,-30 Z"></path>
    <circle id="h" cx="0" cy="-57" r="12"></circle>
  </defs>

  <g transform="translate(5,5)" opacity="0.125">
    <use xlink:href="#h" transform="rotate(30)"></use>
    <use xlink:href="#b" transform="rotate(30)"></use>
    <use xlink:href="#h" transform="rotate(150)"></use>
    <use xlink:href="#b" transform="rotate(150)"></use>
    <use xlink:href="#h" transform="rotate(-90)"></use>
    <use xlink:href="#b" transform="rotate(-90)"></use>
  </g>

  <a xlink:href="http://www.ubuntu.com/">
    <use xlink:href="#h" fill="#d00" transform="rotate(30)"></use>
    <use xlink:href="#b" fill="#f40" transform="rotate(30)"></use>
    <use xlink:href="#h" fill="#f80" transform="rotate(150)"></use>
    <use xlink:href="#b" fill="#d00" transform="rotate(150)"></use>
    <use xlink:href="#h" fill="#f40" transform="rotate(-90)"></use>
    <use xlink:href="#b" fill="#f80" transform="rotate(-90)"></use>
  </a>

</svg>
<p>I previously had installed Ubuntu 12.04 on a NetBook, and my overall impression was simply that it was more stable than its predecessor — particularly for Unity.</p>
<p>For the first time I tried it on a desktop, and to my surprise the following worked:</p>
<pre class="code">sudo apt-get install ruby1.9.3</pre>
<p>And by worked, I mean not only did it install Ruby 1.9.3, but it made it (and gem, and irc) the default ruby.</p>
<p>For those that still use <a href="https://rvm.io//">rvm</a>, (many of the ‘cool kids’ have moved on to <a href="https://github.com/sstephenson/rbenv/">rbenv</a>, I noticed a few niggles:</p>
<ul>
<li>Don’t follow the <a href="https://rvm.io//rvm/install/installation">instructions</a> and specify <code>--ruby</code> or <code>--rails</code>.  You will get a version of Ruby that can’t install gems.  Simply omit that parameter.</li>
<li>Next set the <a href="https://rvm.io/integration/gnome-terminal/">‘Run command as login shell’</a> checkbox.</li>
<li>Then run <code>rvm requirements</code> and install what it tells you to install.</li>
<li>Finally, run <code>rvm install 1.9.3</code> to build the latest.</li>
</ul>

<p>Personally, I follow that up with <code>rvm --default system</code>.  That means that while I have other Rubies available at my finger-tips, the one I generally use is the one provided with Ubuntu.</p></div></content>
    <updated>2012-06-23T15:45:50-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3296</id>
    <link href="/blog/2012/06/07/Prefixed-no-more"/>
    <link rel="replies" href="3296.atom" thr:count="0"/>
    <title>Prefixed no more</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="133" height="78" viewBox="0 0 133 78">
  <path d="M23,72c-2,0-3,2-5,2c-1-2,2-4,2-7c-3,0-4,4-6,4c1-6,9-12,4-12c0,0-10,7-11,6c2-2,10-14,7-14c-1,0-7,4-9,4c0-2,9-10,10-11c2,0,3-2,2-3c-5,0-11,8-15,6l2-2c1-1,16-14,16-16c-3-2-13,6-18,6c22-24,38-33,47-35c7,0,14,2,21,3c0,3,12-1,13-1c5,0,9,4,11,8c0,1,0,2,0,4c3,11,31,7,35,19c0,5,1,9,2,14c-2,4-2,12-6,13c-4,1-4,1-4,1c-3,2-7,5-10,6c0,0-16-6-20-3c-12,4-16,8-19,20l-49-3"></path>
  <path fill="#FFF" d="M86,22l-1-2h3v2h-2M83,19l-2,1l-1-2h2l1,1M122,57l-1-2c-1,0-1,1-3,1c0-1,0-3,0-4h2l1,2c1-1,2-1,3-1c1,1,1,2,0,3l-2,1M113,56c0-1,0-2,0-3c0-1,1-2,3-2c0,4,0,4-3,5M109,55c0-1-1-3,0-4h2c1,2,0,4-2,4M106,54l-2-2c-1,0-2,1-3,0c-1,0-1-2,0-4c1,0,2,0,3,1v2c1,0,2-1,3-1c1,0,0,2,0,3l-1,1M96,50c-2-1-1-2-1-4c2,0,3,0,4,2c-1,1-2,2-3,2"></path>
  <path fill="#ED1C24" d="M40,75v-2c-2,0-9,2-9-2c0-2,5-8,3-8c-3-6-7-11-10-17c2-1,0-3,2-6c3-1,2,4,5,3c-4-17,5-22,5-22c-3,0-4,0-6,1c1-7,11-14,17-15c5-1,15-3,18,2c0,1-1,2-1,3c4,0,10-4,15-5c2-1,4-1,7,0l1,2c-7-3-17,3-23,6c-1,0-2,1-3,1l1,1c3,1,4,2,8,2c1,1,2,2,3,3c1,1,2,2,3,2c0-2,0-2-1-4c1-2-1-3,2-5c2,0,2,1,3,1c-4,4-2,8,10,9c1,0,3,1,3-2c-2,0-2-2-2-3l2,1c1,3,27,7,31,12c1,2,0,3-4,5c0,2,2,5,3,6l2-2l1,1c0,2,0,3,0,5v1c-1,0-2,0-3,0c-4-1-9-1-13-1c-11-5-25-16-36-20c-2-1-1-1-4-1c0,2,1,2,3,3c3,4,6,6,5,11l-1,2c-4,0-1-8-4-9c-10,8,5,25,13,20c-4-2-4-4-4-5c10,5,31,10,33,11c0,1-4,1-4,2c-5,1-13-2-17-4c-5-1-11,7-22,4c-2-1-13-8-15-8c0,4,9,12,11,13l0,2c-2,2-5,5-5,7"></path>
  <path d="M80,24c3,1,11,4,9,5c-3,0-8,0-9-3v-2m-36-4l-2,2c0-1,1-3,1-3c3-6,9-8,14-7l0,1c-8,2-6,12-7,12c-2-1-3-5-6-5m0,34c0-6-8-17,3-22c1,0-2,15,7,19v2c-2,0-3,0-5,0c-1-2-1-1-2-1c0,2,1,5,1,7c-1-1-3-3-4-5m14-26c0-2-2-3,0-4c2,0,3-2,3-4c2,0,5,2,6,3c0,2-1,2-2,4c1,2,1,2,1,4h-1c-2,0-8-1-8,1c-2,0-3,0-5,0c-1-1,1-2,1-3c2,0,3-1,5-1"></path>
</svg>
<p>Firefox 13 for developers: <em>Support for <a href="https://developer.mozilla.org/en/CSS/border-radius"><code>-moz-border-radius*</code></a>  and <a href="https://developer.mozilla.org/en/CSS/box-shadow"><code>-moz-box-shadow</code></a> has been removed. Authors should use unprefixed <code>border-radius</code> or <code>box-shadow</code> instead. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=693510">bug 693510</a></em></p>
<p>+1</p></div></content>
    <updated>2012-06-07T05:33:07-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3295</id>
    <link href="/blog/2012/05/29/Twitter"/>
    <link rel="replies" href="3295.atom" thr:count="0"/>
    <title>Twitter -= #!</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" fill='black' xmlns='http://www.w3.org/2000/svg' width="95" height="105" viewBox="0 0 95 105">
  <path d='M75,75h-21l-6,28h-10l6-28h-21l-6,28h-10l6-28h-11v-10h13l5-25h-18v-10h20l6-28h10l-6,28h21l6-28h10l-6,28h12v10h-14l-5,25h19zM51,40h-21l-5,25h21z'></path>
  <path d='M93,25l-3,52h-8l-4-52v-22h15zM93,101h-14v-13h14z'></path>
</svg>
<a href="http://engineering.twitter.com/2012/05/improving-performance-on-twittercom.html"><cite>Dan Webb</cite></a>: <em>The first thing that you might notice is that permalink URLs are now simpler: they no longer use the hashbang (#!). While hashbang-style URLs have a <a href="http://danwebb.net/2011/5/28/it-is-about-the-hashbangs">handful of limitations</a>, our primary reason for this change is to improve initial page-load performance.</em></div></content>
    <updated>2012-05-29T14:50:26-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3294</id>
    <link href="/blog/2012/04/29/WebSocket-Demos"/>
    <link rel="replies" href="3294.atom" thr:count="0"/>
    <title>WebSocket Demos</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M4,14h92" stroke="#4682b4" stroke-width="5"></path> 
  <text x="50" y="90" font-size="90" fill="#5f9ea0" font-family="serif" text-anchor="middle"><![CDATA[W]]></text>
</svg>
<p><a href="https://github.com/rubys/wunderbar/blob/master/demo/chat.rb">chat</a> implements a shared textarea field across multiple clients.  Demonstrates bi-directional communication.</p>
<p><a href="https://github.com/rubys/wunderbar/blob/master/demo/diskusage.rb">diskusage</a> is more typical of my usage.  The <code>du</code> command produces tabular output that the user may want to sort different ways and yet is may take considerable time to complete.</p></div></content>
    <updated>2012-04-29T18:33:49-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3293</id>
    <link href="/blog/2012/04/24/Wunderbar-on-Rails"/>
    <link rel="replies" href="3293.atom" thr:count="0"/>
    <title>Wunderbar on Rails</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Usage: add <code>wunderbar</code> and <code>nokogiri</code> to your <code>Gemfile</code> and run <code>bundle install</code>.  Template extensions supported are <code>_html</code> and <code>_json</code>.  Examples: <a href="https://github.com/rubys/wunderbar/blob/master/test/views/rails_test/index.html._html">view</a>, <a href="https://github.com/rubys/wunderbar/blob/master/test/views/layouts/application.html._html">layout</a>, <a href="https://github.com/rubys/wunderbar/blob/master/test/views/rails_test/index.json._json">json</a>.</p>
<p>Note that as Rails layouts and views are predicated on the assumption that output is produced by concatenating text, one must use <code>_ yield</code> instead of simply <code>yield</code>.  On the plus side, Wunderbar will note when the first argument to a call which creates an element is <code>html_safe?</code> and will treat it as markup.</p></div></summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M4,14h92" stroke="#4682b4" stroke-width="5"></path> 
  <text x="50" y="90" font-size="90" fill="#5f9ea0" font-family="serif" text-anchor="middle"><![CDATA[W]]></text>
</svg>
<p>Usage: add <code>wunderbar</code> and <code>nokogiri</code> to your <code>Gemfile</code> and run <code>bundle install</code>.  Template extensions supported are <code>_html</code> and <code>_json</code>.  Examples: <a href="https://github.com/rubys/wunderbar/blob/master/test/views/rails_test/index.html._html">view</a>, <a href="https://github.com/rubys/wunderbar/blob/master/test/views/layouts/application.html._html">layout</a>, <a href="https://github.com/rubys/wunderbar/blob/master/test/views/rails_test/index.json._json">json</a>.</p>
<p>Note that as Rails layouts and views are predicated on the assumption that output is produced by concatenating text, one must use <code>_ yield</code> instead of simply <code>yield</code>.  I have noticed that this may lose blank lines in the process, which apparently is a <a href="http://groups.google.com/group/nokogiri-talk/browse_thread/thread/d332456737253631?pli=1">known</a> <a href="https://github.com/tenderlove/nokogiri/issues/575">issue</a> with Nokogiri.  Not a problem if the layout is erb, but then you lose the unified indentation that you get if you have a layout using <code>_html</code>.</p>
<p>On the plus side, Wunderbar will note when the first argument to a call which creates an element is <code>html_safe?</code> and will treat it as markup.  An example of where this is useful would be in the <code>_td link_to</code> calls below. </p>
<pre class="code">_h1_ 'Listing products'

_table do
  _tr do
    _th 'Title'
    _th
    _th
    _th
  end

  @products.each do |product|
    _tr_ do
      _td product.title
      _td link_to 'Show', product
      _td link_to 'Edit', edit_product_path(product)
      _td link_to 'Destroy', product, confirm: 'Are you sure?', method: :delete 
    end
  end
end

_br_

_ link_to 'New Product', new_product_path</pre></div></content>
    <updated>2012-04-24T14:12:59-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3292</id>
    <link href="/blog/2012/04/12/Wunderbar-now-does-Sinatra"/>
    <link rel="replies" href="3292.atom" thr:count="2" thr:updated="2012-04-22T09:44:27-07:00"/>
    <title>Wunderbar now does Sinatra</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://github.com/rubys/wunderbar/blob/master/demo/hellosinatra.rb">Demo</a></p>
<p>The result is a lot like <a href="http://markaby.rubyforge.org/">Markaby</a>, except you get to be/have to be explicit when you are creating a tag.  In this demo, there is no logic, so the benefits of doing so are less clear, but include you being able to use tags that aren’t known to Markaby, like the ones that were <a href="http://www.w3.org/TR/html5-diff/#new-elements">added in HTML5</a>.  Both inline and views are supported, but support for layouts has yet to be added.</p>
<p>Future plans include <a href="http://rubyonrails.org/">Rails</a>.</p></div></summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M4,14h92" stroke="#4682b4" stroke-width="5"></path> 
  <text x="50" y="90" font-size="90" fill="#5f9ea0" font-family="serif" text-anchor="middle"><![CDATA[W]]></text>
</svg>
<p><a href="https://github.com/rubys/wunderbar/blob/master/demo/hellosinatra.rb">Demo</a></p>
<p>The result is a lot like <a href="http://markaby.rubyforge.org/">Markaby</a>, except you get to be/have to be explicit when you are creating a tag.  In this demo, there is no logic, so the benefits of doing so are less clear, but include you being able to use tags that aren’t known to Markaby, like the ones that were <a href="http://www.w3.org/TR/html5-diff/#new-elements">added in HTML5</a>.  Both inline and views are supported, but support for layouts has yet to be added.</p>
<p>While the demos require Ruby 1.9.2+ (the Hash syntax is nicer), the library works equally well with Ruby 1.8.7.</p>
<p>The progression is that you start from <a href="https://github.com/rubys/wunderbar/blob/master/demo/helloworld.rb">scripts</a> that you can run from the command line:</p>
<pre class="code">ruby helloworld.rb</pre>
<p>...can pass arguments to:</p>
<pre class="code">ruby helloword.rb name=Sam</pre>
<p>...can run as a standalone server:</p>
<pre class="code">ruby helloworld.rb --port=3004</pre>
<p>...can install as a CGI:</p>
<pre class="code">ruby helloworld.rb --install="/Library/WebServer/Documents/helloworld.cgi"</pre>
<p>.,. and can now run under Sinatra.  Future plans include <a href="http://rubyonrails.org/">Rails</a>.</p>
<p>There even is a <a href="https://github.com/rubys/wunderbar/blob/master/tools/web2script.rb">tool</a> that will reverse engineer an existing web page into a script.</p></div></content>
    <updated>2012-04-12T17:12:31-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3291</id>
    <link href="/blog/2012/04/02/Hacked"/>
    <link rel="replies" href="3291.atom" thr:count="5" thr:updated="2012-05-20T03:28:03-07:00"/>
    <title>Hacked</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This site was hacked.  A reader of the site noted that Google’s <a href="https://www.google.com/search?q=site%3Aintertwingly.net">index of this site</a> had been co-opted by dubious pharmaceutical offerings.  I’ll gladly thank that individual publicly if they give me permission to do so; but my email reply got bounced as spam.</p>
<p>The immediate culprit was the addition of the following lines to a number of <code>.htaccess</code> files</p></div></summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <g stroke="#000" stroke-linejoin="round">
    <path fill="#DDD" d="M27,42c-8-53,55-53,47,0h-8 c10-41-40-41-30,0h-9z"></path>
    <path fill="#CB9" d="M23,91v-50c18-3,36-2,55,0v50c-19,3-37,2-55,0z"></path>
    <path fill="#EDA" d="M23,91v-50c18-3,36-2,55,0z"></path>
    <path fill="#A87" d="M78,41v50c-19,3-37,2-55,0z"></path>
  </g>
  <path fill="#EEE" d="M30,21c5-10,7-17,23-16c-10,0-18,14-23,16"></path>
  <path fill="#CB9" d="M78,41c-50,4-50,0-55,50c50-5,50,0,55-50z"></path>
  <path fill="#000" d="M46,77h10l-3-11a6,6,0,1,0-5,0z"></path>
</svg>
<p>This site was hacked.  A reader of the site noted that Google’s <a href="https://www.google.com/search?q=site%3Aintertwingly.net">index of this site</a> had been co-opted by dubious pharmaceutical offerings.  I’ll gladly thank that individual publicly if they give me permission to do so; but my email reply got bounced as spam.</p>
<p>The immediate culprit was the addition of the following lines to a number of <code>.htaccess</code> files:</p>
<pre class="code">&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (google|yahoo) [OR]
RewriteCond %{HTTP_REFERER} (google|aol|yahoo)
RewriteCond %{REQUEST_URI} /$ [OR]
RewriteCond %{REQUEST_FILENAME} (html|htm|php)$ [NC]
RewriteCond %{REQUEST_FILENAME} !common.php
RewriteRule ^.*$    /common.php [L]
&lt;/IfModule&gt;</pre>
<p>I removed those lines, as well as the <code>common.php</code> file, and scanned any and all php files on my site.  I saw the addition of lines such as the following:</p>
<pre class="code">$FYAqxDo='p'.'r'. 'eg_repl'. 'ace';...
$IHxWfs=str_rot13('cert_ercynpr');...
$DcNZVHCi="eW6DLAlbeAki"^"...
$LYDmvYopCKSSSGcfCVNpsskU='ba'.'se64_'.'deco'.'de'...</pre>
<p>I had old (vintage 2006) installations of PHP-openid-1.2.1 and PHP-yadis-1.0.2 that I am tentatively assuming were the ports of initial entry.</p>
<p>I also wiped my .ssh directory.  It has a private key there that was generated for this site that presumably was legitimate, but unused by me and now presumed compromised.  I never initiate sessions from this host, nor do I have any passwords saved there, so any damage caused was isolated.</p>
<p>I do daily backups of my site, which I keep for a week; as well as monthly backups that I basically keep forever.  In addition, as I recently <a href="http://intertwingly.net/blog/2012/02/13/On-The-Move">migrated hosts</a>, I have a hot backup.</p>
<p>The PHP hacks were done after I migrated but before March 1st.  The htaccess hacks were done over a week ago, but after March 1st.</p>
<p>Over the next few days, I’ll be looking at diffs of different snapshots of my site contents to see if there is anything else I missed.</p></div></content>
    <updated>2012-04-02T04:16:43-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3290</id>
    <link href="/blog/2012/04/01/Improved-Wunderbar-JSON-support"/>
    <link rel="replies" href="3290.atom" thr:count="0"/>
    <title>Improved Wunderbar JSON support</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M4,14h92" stroke="#4682b4" stroke-width="5"></path> 
  <text x="50" y="90" font-size="90" fill="#5f9ea0" font-family="serif" text-anchor="middle"><![CDATA[W]]></text>
</svg>
<p>I’ve integrated <a href="https://github.com/rails/jbuilder">jbuilder</a> like functionality into <a href="https://github.com/rubys/wunderbar#readme">Wunderbar</a>.  Key differences?  A DSL that doesn’t suck, and output that isn’t ugly.</p>
<p>To harsh?  You be the judge.  Compare <a href="https://github.com/rails/jbuilder/blob/master/test/jbuilder_test.rb#L176">jbuilder</a> ("json dot bar json bar json dot child bang") vs <a href="https://github.com/rubys/wunderbar/blob/master/test/test_jbuilder.rb#L154">Wunderbar</a> ("underbar underbar underbar underbar").</p>
<p>As to the output?  Don’t be fooled by the jbuilder <a href="https://github.com/rails/jbuilder#readme">readme</a>.  In actuality is no unnecessary whitespace in the output.  That’s good if you are bandwidth limited.  Not so good when viewing the XHR traffic via firebug...</p></div></content>
    <updated>2012-04-01T05:57:41-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3289</id>
    <link href="/blog/2012/03/28/Keeping-it-on-the-Rails"/>
    <link rel="replies" href="3289.atom" thr:count="0"/>
    <title>Keeping it on the Rails</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>It is increasingly becoming the case that <a href="http://pragprog.com/book/rails4/agile-web-development-with-rails">Agile Web Development with Rails</a> is being actively co-developed with <a href="http://rubyonrails.org/">Rails</a> itself.</p>
<p>While <a href="http://intertwingly.net/projects/dashboard.html">my tests</a> have been an <a href="https://github.com/rails/rails/blob/master/RELEASING_RAILS.rdoc">official part of the release process</a> for a long time now, yesterday’s release of <a href="http://weblog.rubyonrails.org/2012/3/27/ann-rails-3-2-3-rc1-has-been-released/">3.2.3RC1</a> provides a number of examples that illustrate this.</p>
<p>The intent is to prove an updated to the eBook free of charge which incorporates the necessary changes, either concurrent with the final release of 3.2.3 or shortly thereafter.</p></div></summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns='http://www.w3.org/2000/svg' width="100" height="100" viewBox="0 0 1000 1000">

<!-- 5 -->
<path d='M160,560c2-6-2-13-6-17l-6-9c-104-164,58-356,234-305c59,18,119,63,158,116c33,45,49,95,53,140c8,87-16,169-62,219c0,0-22,24,8,42c28,16,112-18,152-163c37-132-50-403-312-455c-190-37-302,124-304,268c0,58,30,125,63,159c14,14,21,11,22,5' fill='#17733B'></path>
<radialGradient cx='651' cy='363' id='r5g1' r='257' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#E0EECF'></stop>
	<stop offset='1' style='stop-color:#17753C'></stop>
</radialGradient>
<path d='M581,733c-20,9-31-2-31-2c107-75,132-334-31-471c-159-133-277-83-327-52c0,0,36-73,145-76c61-2,229,40,314,213c99,202-1,327-22,352c-13,17-37,31-48,36' fill='url(#r5g1)'></path>
<radialGradient cx='477' cy='494' id='r5g2' r='247' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#DAECCE'></stop>
	<stop offset='1' style='stop-color:#17733B'></stop>
</radialGradient>
<path d='M562,675c44-90,66-232-27-346c-93-114-198-113-198-113s156-14,250,175c73,147-25,284-25,284' fill='url(#r5g2)'></path>

<!-- 1 -->
<path d='M593,219c4,5,12,4,18,4c3-1,7-1,11-1c194-9,279,228,147,354c-45,43-115,72-180,80c-55,6-106-6-147-25c-79-36-139-97-159-163c0,0-10-31-40-14c-29,16-41,106,64,213c96,98,375,159,551-42c127-146,44-324-80-397c-51-30-123-37-169-25c-20,5-21,12-16,16' fill='#821C35'></path>
<radialGradient cx='518' cy='742' id='r1g1' r='257' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#F7A8A9'></stop>
	<stop offset='0.7178' style='stop-color:#821C35'></stop>
</radialGradient>
<path d='M232,497c3-22,18-25,18-25c12,129,224,280,424,208c195-71,210-198,208-257c0,0,45,67-7,164c-29,53-149,177-342,164c-223-14-282-164-294-194c-7-20-8-48-7-60' fill='url(#r1g1)'></path>
<radialGradient cx='492' cy='526' id='r1g2' r='247' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#F2A5B7'></stop>
	<stop offset='1' style='stop-color:#821C35'></stop>
</radialGradient>
<path d='M293,510c55,83,167,173,312,149c146-24,197-115,197-115s-66,143-276,130c-164-11-233-164-233-164' fill='url(#r1g2)'></path>

<!-- 3 -->
<clipPath id="r3c">
	<path d="M999,999 L558,370 c-30-50-40-50-70-84h-400v700z" opacity="0"></path>
</clipPath>
<g clip-path="url(#r3c)">
<path d='M677,766c-6,2-10,9-11,14c-2,3-4,7-5,11c-90,172-338,127-381-51c-14-60-5-135,21-195c23-51,58-89,95-115c71-50,154-71,220-56c0,0,32,7,33-28c0-33-71-88-217-51c-133,34-324,245-238,498c62,183,258,200,383,129c51-28,94-88,107-134c5-19-1-23-7-22' fill='#3564AF'></path>
<radialGradient cx='262' cy='440' id='r3g1' r='364' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#EFF1F6'></stop>
	<stop offset='1' style='stop-color:#3564AF'></stop>
</radialGradient>
<path d='M617,315c18,14,13,28,13,28c-118-54-355,54-392,263c-36,205,66,281,118,309c0,0-81,6-138-88c-32-51-79-217,28-378c125-186,283-162,316-157c21,3,45,16,55,23' fill='url(#r3g1)'></path>
<radialGradient cx='462' cy='525' id='r3g2' r='350' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#EFF1F6'></stop>
	<stop offset='1' style='stop-color:#3564AF'></stop>
</radialGradient>
<path d='M576,362c-100,6-234,58-286,195s1,228,1,228s-90-128,26-304c91-136,259-119,259-119' fill='url(#r3g2)'></path>
</g>

<!-- 6 -->
<radialGradient cx='528' cy='251' id='r6g1' r='277' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#E2EFCF'></stop>
	<stop offset='1' style='stop-color:#14743B'></stop>
</radialGradient>
<path d='M804,494c-16,4-38-12-43-43c-17-99-90-288-283-364c-176-69-252-6-252-6c-10,4-6-12,2-18c7-7,105-112,334-13c217,94,278,309,272,383c0,10-3,24-4,29c-5,21-15,28-26,32' fill='url(#r6g1)'></path>
<radialGradient cx='748' cy='240' id='r6g2' r='312' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#E2EFCF'></stop>
	<stop offset='1' style='stop-color:#14743B'></stop>
</radialGradient>
<path d='M800,488c-1-132-88-337-289-418c-193-78-256-19-256-19s73-91,293-4c208,82,265,267,278,321c12,52,4,94-4,108c-9,16-22,12-22,12' fill='url(#r6g2)'></path>
<radialGradient cx='634' cy='302' id='r6g3' r='185' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#E2EFCF'></stop>
	<stop offset='1' style='stop-color:#14743B'></stop>
</radialGradient>
<path d='M767,457c-16-90-50-158-87-212c-45-66-103-114-191-158c0,0,112,25,198,148c73,106,80,222,80,222' fill='url(#r6g3)'></path>

<!-- 4 -->
<path d='M298,243c12,11,9,38-15,58c-78,64-204,222-174,427c28,187,121,221,121,221c8,6-8,11-17,8s-150-35-178-283c-27-235,128-396,195-428c9-4,22-9,27-10c21-6,32-2,41,7' fill='#3564AF'></path>
<radialGradient cx='107' cy='418' id='r4g1' r='441' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#D3DCE8'></stop>
	<stop offset='1' style='stop-color:#3564AF'></stop>
</radialGradient>
<path d='M295,248c-114,68-248,245-217,459c29,207,111,232,111,232s-115-18-150-251c-33-221,99-364,140-402c38-36,78-50,95-50c18,0,21,12,21,12' fill='url(#r4g1)'></path>
<radialGradient cx='217' cy='485' id='r4g2' r='261' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#F0F1F9'></stop>
	<stop offset='1' style='stop-color:#3564AF'></stop>
</radialGradient>
<path d='M285,293c-70,59-112,121-141,182c-34,71-47,145-41,243c0,0-34-109,29-244c55-117,153-181,153-181' fill='url(#r4g2)'></path>

<!-- 2 -->
<radialGradient cx='661' cy='712' id='r2g1' r='275' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#E89EB0'></stop>
	<stop offset='1' style='stop-color:#821C35'></stop>
</radialGradient>
<path d='M329,810c4-16,28-27,58-16c94,35,294,66,457-63c147-118,131-216,131-216c1-10,13,2,15,11c2,10,44,147-156,296c-190,141-407,87-468,45l-23-18c-15-16-17-27-14-39' fill='url(#r2g1)'></path>
<radialGradient cx='576' cy='888' id='r2g2' r='312' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#CFA2AD'></stop>
	<stop offset='1' style='stop-color:#821C35'></stop>
</radialGradient>
<path d='M335,810c116,64,336,92,506-42c164-128,145-212,145-212s43,108-142,255c-175,139-365,96-418,80c-50-15-83-42-91-57c-9-16,0-24,0-24' fill='url(#r2g2)'></path>
<radialGradient cx='579' cy='758' id='r2g3' r='185' gradientUnits='userSpaceOnUse'>
	<stop offset='0' style='stop-color:#DE95A7'></stop>
	<stop offset='1' style='stop-color:#821C35'></stop>
</radialGradient>
<path d='M379,796c86,31,161,36,227,31c79-6,150-32,232-87c0,0-78,85-226,98c-129,11-233-42-233-42' fill='url(#r2g3)'></path>

</svg>
<p>It is increasingly becoming the case that <a href="http://pragprog.com/book/rails4/agile-web-development-with-rails">Agile Web Development with Rails</a> is being actively co-developed with <a href="http://rubyonrails.org/">Rails</a> itself.</p>
<p>While <a href="http://intertwingly.net/projects/dashboard.html">my tests</a> have been an <a href="https://github.com/rails/rails/blob/master/RELEASING_RAILS.rdoc">official part of the release process</a> for a long time now, yesterday’s release of <a href="http://weblog.rubyonrails.org/2012/3/27/ann-rails-3-2-3-rc1-has-been-released/">3.2.3RC1</a> provides a number of examples that illustrate this.</p>
<p>Within hours after the release, I got an excited IM from Santiago Pastorino that my tests were failing.  In particular, the failure was thus:</p>
<pre class="code">rake db:migrate
rake aborted!
An error has occurred, this and all later migrations canceled:
uninitialized constant Arel::Relation
Tasks: TOP =&gt; db:migrate
(See full trace by running task with --trace)</pre>
<p>The root cause was quickly determined to be a recent change to <a href="https://github.com/rails/arel/commit/9978fc40a8a5a262670279129a335845ad647f48">arel</a>, and a number of corrective actions were promptly taken: first, <a href="https://github.com/rails/arel/commit/6e8d1587091e00a84ea24ab92d9e836c3c38bcb8">the change was backed out</a>, then <a href="https://github.com/rails/rails/commit/2fa7ccf7aee3696e99f1b528db848aff5a671f77">Rails 4.0 was updated</a> and <a href="https://github.com/rails/rails/commit/24208d9a8662e2e35afc9c64695c600b2e960418">Rails 3.2 was changed to point to a branch of arel</a>, and finally, the <a href="https://github.com/rails/arel/commit/d43ae586aab7092c6bf742609ff1dc3ebf6aff6a">original change was reapplied</a>.</p>
<p>The previous error that was caught was <a href="https://github.com/rails/rails/commit/b700153507b7d539a57a6e3bcf03c84776795051"> connection pool of new applications have size 1</a>.  This demonstrates the unique value that my tests bring to the table.  Outside of my tests, the bulk of the test of Rails is an impressive array of unit tests (which verify that the connection pool setting does what it is supposed to do), and real world testing (using applications with highly tuned configurations), and my tests.  Only the latter is effectively testing that the defaults provided actually work together to provide a viable configuration to use as a starter set for new applications.</p>
<p>One last example, this one shows the level cooperation involved.  The underlying security changes that were the raison d'être for the 3.2.3 release caused the following scenario to fail:</p>
<pre class="code">rails generate scaffold Product title:string
rake db:migrate
rake test</pre>
<p>The root cause was that the code generated as scaffolding used the very feature which is now being discouraged as it creates a security issue. The fix required both changes to Rails itself (to change the scaffolding generated) and to the scenario provided in the book (both in identifying the code that needs to be changed, and in the changes that need to be made).</p>
<p>The intent is to prove an updated to the eBook free of charge which incorporates the necessary changes, either concurrent with the final release of 3.2.3 or shortly thereafter.</p></div></content>
    <updated>2012-03-28T13:44:13-07:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3288</id>
    <link href="/blog/2012/02/25/Hearing-Aid"/>
    <link rel="replies" href="3288.atom" thr:count="2" thr:updated="2012-03-17T19:29:21-07:00"/>
    <title>Hearing Aid</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="95" height="106" viewBox="0 0 95 106">
  <path d="M45,100c-4-2-7-4-7-5c0-4,7-35,9-38c2-5,2-18-1-17l-28-31c25-11,44-10,55,1c9,8,15,23,12,30c-3,4-1,8,5,15c3,4,3,4,0,6c-2,2-4,1-5,8v4c0,1-4,1-1,1c2,0-1,2-1,2l-1,7c0,6-3,9-8,7c-5-2-11,1-14,7c-3,8-4,8-15,3M39,41l-34-18l4-4l31,22zM38,45l-35-9v6zM39,49l-31,10l-2-6zM40,52l-24,20l-2-4zM42,55l-17,37l-6-3z" fill="#01447B"></path>
</svg>
<p>I now have an <a href="http://en.wikipedia.org/wiki/Hearing_aid#Open-fit_devices">open fit</a> hearing aid device for my left ear.  That ear has experienced <a href="http://en.wikipedia.org/wiki/Tinnitus">tinnitus</a> for approximately 10 years.  An <a href="http://en.wikipedia.org/wiki/Auditory_brainstem_response">ABR</a> test given at that time found nothing.  My hearing loss is primarily in the 2000 Hz and above.</p>
<p>Last night, I went to dinner with my wife in a noisy restaurant and I could hear every word she said.</p></div></content>
    <updated>2012-02-25T04:34:06-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3287</id>
    <link href="/blog/2012/02/22/Your-Next-Desktop-Could-be-a-Phone"/>
    <link rel="replies" href="3287.atom" thr:count="2" thr:updated="2012-02-25T10:37:17-08:00"/>
    <title>Your Next Desktop Could be a Phone</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="140" height="140" viewBox="-70 -70 140 140">

  <defs>
    <path id="b" d="M 23,-20 A32,32 0,0,0 -23,-20 L -40,-30 A42,42 0,0,1 -14,-47 A17,17 0,0,0 14,-47 A42,42 0,0,1 40,-30 Z"></path>
    <circle id="h" cx="0" cy="-57" r="12"></circle>
  </defs>

  <g transform="translate(5,5)" opacity="0.125">
    <use xlink:href="#h" transform="rotate(30)"></use>
    <use xlink:href="#b" transform="rotate(30)"></use>
    <use xlink:href="#h" transform="rotate(150)"></use>
    <use xlink:href="#b" transform="rotate(150)"></use>
    <use xlink:href="#h" transform="rotate(-90)"></use>
    <use xlink:href="#b" transform="rotate(-90)"></use>
  </g>

  <a xlink:href="http://www.ubuntu.com/">
    <use xlink:href="#h" fill="#d00" transform="rotate(30)"></use>
    <use xlink:href="#b" fill="#f40" transform="rotate(30)"></use>
    <use xlink:href="#h" fill="#f80" transform="rotate(150)"></use>
    <use xlink:href="#b" fill="#d00" transform="rotate(150)"></use>
    <use xlink:href="#h" fill="#f40" transform="rotate(-90)"></use>
    <use xlink:href="#b" fill="#f80" transform="rotate(-90)"></use>
  </a>

</svg>
<p><a href="https://twitter.com/hsivonen/status/172225206507675648"><cite>Henri Sivonen</cite></a>: <em>This getting interesting: <a href="http://t.co/yOQPvOEK">Using an Android phone as an Ubuntu desktop when docked</a></em></p>
<p>Definitely Want.</p>
<p>Especially love the idea of sending and receiving texts from my desktop.  Would prefer a dock the size of a mac mini with a hard drive, USB and ethernet ports.</p></div></content>
    <updated>2012-02-22T03:27:07-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3286</id>
    <link href="/blog/2012/02/20/Mulligan"/>
    <link rel="replies" href="3286.atom" thr:count="0"/>
    <title>Mulligan</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" fill='black' xmlns='http://www.w3.org/2000/svg' width="95" height="105" viewBox="0 0 95 105">
  <path d='M75,75h-21l-6,28h-10l6-28h-21l-6,28h-10l6-28h-11v-10h13l5-25h-18v-10h20l6-28h10l-6,28h21l6-28h10l-6,28h12v10h-14l-5,25h19zM51,40h-21l-5,25h21z'></path>
  <path d='M93,25l-3,52h-8l-4-52v-22h15zM93,101h-14v-13h14z'></path>
</svg>
<p><a href="https://twitter.com/danwrong/status/171680703824662528"><cite>Dan Webb</cite></a>: <em>I’m in charge of undoing twitters hashbang URLs</em></p>
<p>+1</p></div></content>
    <updated>2012-02-20T15:13:02-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3285</id>
    <link href="/blog/2012/02/19/OpenID-upgrades"/>
    <link rel="replies" href="3285.atom" thr:count="5" thr:updated="2012-02-26T15:35:03-08:00"/>
    <title>OpenID upgrades</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M43,90c-88,-16,-21,-86,41,-51l9,-6v17h-26l8,-5c-55,-25,-86,29,-32,36z" fill="#ccc"></path>
  <path d="M43,90v-75l14,-9v75z" fill="#f60"></path>
</svg>
<p>As a part of my <a href="http://intertwingly.net/blog/2012/02/13/On-The-Move">server move</a>, I’ve upgraded my consumer logic to <a href="http://pypi.python.org/pypi/python-openid/">Python openid-2.2.5</a> and provider from <a href="http://siege.org/phpmyid.php">phpMyID</a> to <a href="http://simpleid.sourceforge.net/">SimpleId 0.8.1</a>.  In theory, I should now support <a href="http://openid.net/specs/openid-authentication-2_0.html">OpenID 2.0</a>.</p>
<p>The one small API change I noted in this process is in the consumer.  <code>server.complete</code> now needs an additional <code>returnto</code> parameter.</p></div></content>
    <updated>2012-02-19T11:09:11-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3284</id>
    <link href="/blog/2012/02/18/WunderWiki"/>
    <link rel="replies" href="3284.atom" thr:count="1" thr:updated="2012-03-01T07:05:08-08:00"/>
    <title>WunderWiki</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M4,14h92" stroke="#4682b4" stroke-width="5"></path> 
  <text x="50" y="90" font-size="90" fill="#5f9ea0" font-family="serif" text-anchor="middle"><![CDATA[W]]></text>
</svg>
<p>I added a simple <a href="https://github.com/rubys/wunderbar/blob/master/demo/wiki.rb">wiki</a> as a demo for <a href="https://github.com/rubys/wunderbar">WunderBar</a>.  It demonstrates shelling out to handing multiple URIs, handing get/post, dealing with both unescaped text and markup, shelling out to commands, AJAX, CSS, jQuery.</p>
<p>The demo relies on <a href="http://git-scm.com/">git</a> and <a href="https://github.com/rtomayko/rdiscount">rDiscount</a> to do the version control and markup processing.  It also doesn’t have all the features that you would expect from a wiki, such as conflict detection and resolution.</p></div></content>
    <updated>2012-02-18T08:20:43-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3283</id>
    <link href="/blog/2012/02/15/Twelve-Steps"/>
    <link rel="replies" href="3283.atom" thr:count="1" thr:updated="2012-02-20T09:18:43-08:00"/>
    <title>Twelve Steps</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="0 0 100 100">
  <a xlink:href="http://www.tbray.org/ongoing/When/200x/2004/01/11/PostelPilgrim">
  <path d="M10,15c10,10,10,0,40,0c30,0,30,10,40,0q-10,30-40,30q-30,0-40-30"
    stroke="black" fill="red"></path>
  <ellipse stroke="black" fill="white" cx="50" cy="40" rx="22" ry="35"></ellipse>
  <circle cx="50" cy="40" r="5" stroke="black" fill="red"></circle>
  <circle cx="48" cy="38" r="1" fill="white"></circle>
  <path d="M35,45C40,75,60,75,65,45Q50,60,35,45Z"
    stroke="red" stroke-width="2" stroke-linejoin="round"></path>
  <circle cx="40" cy="30" r="2"></circle>
  <circle cx="60" cy="30" r="2"></circle>
  <path d="M35,30q5-10,10,0q-5-30-10,0" stroke="black" fill="none"></path>
  <path d="M55,30q5-10,10,0q-5-30-10,0" stroke="black" fill="none"></path>
  </a>
</svg>
<a href="http://lists.w3.org/Archives/Public/www-tag/2012Feb/0045.html"><cite>Jeni Tennison</cite></a>: <em>it became clear that there were several places where having some kind of standard method for building a tree from non-well-formed XML would be beneficial...So the <a href="http://www.w3.org/community/xml-er/">XML Error Recovery Community Group</a> has been set up for this purpose.</em></div></content>
    <updated>2012-02-15T07:43:10-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3282</id>
    <link href="/blog/2012/02/13/On-The-Move"/>
    <link rel="replies" href="3282.atom" thr:count="9" thr:updated="2012-05-15T00:48:42-07:00"/>
    <title>On The Move...</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns='http://www.w3.org/2000/svg' width="100" height="100" viewBox="0 0 100 100">
  <rect fill="#039" x="0" y="3" height="95" width="95" rx="15"></rect>
  <path d='M20,56L19,35C19,30,27,20,33,21L55,21A30,30,0,0,1,20,56Z' fill='#369' stroke='#369' stroke-linejoin='round' stroke-width='5px'></path>
  <path d='M17,67A37,37,0,0,0,67,18A36,36,0,1,1,17,67' fill='#FFF'></path>
</svg>
<p>Intertwingly.net is moving to <a href="http://dreamhost.com/">DreamHost</a>.  I’m sure that every one of my scripts has hard coded paths or depend on the server being in EST/EDT or will otherwise break for unanticipated (but in retrospect entirely obvious) reasons.  I don’t believe that I will lose any email in the process, but you never know.</p>
<p>My <code>@apache.org</code> email address will not be affected by this move.</p></div></content>
    <updated>2012-02-13T10:06:16-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3281</id>
    <link href="/blog/2012/02/09/Dominoes"/>
    <link rel="replies" href="3281.atom" thr:count="8" thr:updated="2012-02-20T04:56:05-08:00"/>
    <title>Dominoes</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
  <path d="M1,1h33v33h33v33h33v33h-99z" fill="#000"></path>
  <path d="M0,0h33v33h-33z" fill="#9cc"></path>
  <path d="M0,33h33v33h-33z" fill="#699"></path>
  <path d="M33,33h33v33h-33z" fill="#9cc"></path>
  <path d="M0,66h33v33h-33z" fill="#330"></path>
  <path d="M33,66h33v33h-33z" fill="#699"></path>
  <path d="M66,66h33v33h-33z" fill="#9cc"></path>
</svg>
<p><a href="https://twitter.com/slightlylate/status/167549285754339328"><cite>Alex Russell</cite></a>: <em><a href="https://twitter.com/glazou">@glazou</a> being entirely reasonable in the face of vendor-driven CRAZY (implementing other people’s prefixes): <a href="http://www.glazman.org/weblog/dotclear/index.php?post/2012/02/09/CALL-FOR-ACTION%3A-THE-OPEN-WEB-NEEDS-YOU-NOW">glazman.org/weblog/dotclea…</a> Via <a href="https://twitter.com/#!/phae">@phae</a>.</em></p>
<p>Alex, I think you need to move up the food chain a little.</p>
<p>The root-cause is vendor-driven advocacy directed at content producers which encourages them to produce compelling content using experimental features.  Everything else is consequences.  If you believe that those consequences are CRAZY, then you must conclude that the root-cause is CRAZY.</p></div></content>
    <updated>2012-02-09T04:57:20-08:00</updated>
  </entry>

  <entry>
    <id>tag:intertwingly.net,2004:3280</id>
    <link href="/blog/2012/02/04/Default-to-Incognito"/>
    <link rel="replies" href="3280.atom" thr:count="3" thr:updated="2012-03-05T08:30:27-08:00"/>
    <title>Default to Incognito</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><svg style="float:right" xmlns='http://www.w3.org/2000/svg' width="100" height="100" viewBox="0 0 100 100">
  <circle cx='50' cy='50' r='44' fill='#666'></circle>
  <path d='M48,95c-8-1-15-7-18-11s-6-6-2-11s17-12,17-12c-9-2-15-10-15-19v-5c0-1-1-3-4-6c-8-9-4-13-4-17a47,45,0,0,0,28,81' fill='#2A2'></path>
  <path d='M32,33c4-11,25-18,36-1h4c3,0,13,2,21,4a45,51,0,0,0-67-24c0,0-1,4,0,7s4,9,5,12' fill='#C11'></path>
  <path d='M34,75c0,0-4,3-2,6c3,3,12,12,22,14a47,45,0,0,0,34-72c0,0,6,9,6,17c-5-1-13-6-24-5c6,18-9,27-19,26' fill='#FD0'></path>
  <path d='M45,61c-9-2-16-9-15-24c0,0,0-2-2-4a24,23,0,0,0,13,30M72,32a24,23,0,0,0-42-4l2,5c5-12,26-17,36-1M70,36c5,13-3,26-19,26l-5,4a24,23,0,0,0,28-28M28,23c3-1,1-6-2-6zM34,13a3,1-30,1,0,0,1M20,18c-19,26-15,43,3,60c7,6,2,6-1,3c-17-13-24-38-2-63M25,30l-3-1c-3,1-9-2-1-7' fill='#FFF' opacity='.4'></path>
  <radialGradient id='gcb' cx='50' cy='39' r='20' gradientUnits='userSpaceOnUse'>
    <stop offset='0' stop-color='#BDF'></stop>
    <stop offset='.5' stop-color='#18C'></stop>
    <stop offset='1' stop-color='#333'></stop>
  </radialGradient>
  <circle cx='50' cy='42' r='18' fill='url(#gcb) #37C'></circle>
  <path d='M74,88c0,0,1-3-3-7c14-8,19-22,20-33c0,0,5-1,6,7M62,93c0,0-3-2-5-7c0,0,6-1,10-3c0,0,4,3,3,8' stroke='#EC0' fill='none'></path>
</svg>
<p>Patch for <code>/usr/share/applications/google-chrome.desktop</code>:</p>
<pre class="code">108c108
&lt; Exec=/opt/google/chrome/google-chrome %U
---
&gt; Exec=/opt/google/chrome/google-chrome %U --incognito
114c114
&lt; X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito
---
&gt; X-Ayatana-Desktop-Shortcuts=NewIncognito;NewWindow</pre></div></content>
    <updated>2012-02-04T13:54:53-08:00</updated>
  </entry>

</feed>

