<?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>Jabbering Giraffe</title>
	<atom:link href="http://happygiraffe.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://happygiraffe.net/blog</link>
	<description></description>
	<lastBuildDate>Wed, 02 Dec 2009 22:50:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>jslint4java 1.3.3</title>
		<link>http://happygiraffe.net/blog/2009/12/02/jslint4java-1-3-3/</link>
		<comments>http://happygiraffe.net/blog/2009/12/02/jslint4java-1-3-3/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 22:50:14 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1650</guid>
		<description><![CDATA[I&#8217;ve updated jslint4java again.  This time, I&#8217;ve added:

Support for the predef option, so you can specify a list of predefined global variables.  I first said I&#8217;d do this over a year ago.  
Updated to JSLint 2009-11-24, which brings a new devel option.  Now you can decide if alert(), console.log(), etc are [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve updated <a href="http://code.google.com/p/jslint4java">jslint4java</a> again.  This time, I&#8217;ve added:</p>
<ul>
<li>Support for the <em>predef</em> option, so you can specify a list of predefined global variables.  I first said I&#8217;d do this over a year ago. <img src='http://happygiraffe.net/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
<li>Updated to <a href="http://jslint.com/">JSLint</a> 2009-11-24, which brings a new <em>devel</em> option.  Now you can decide if <code>alert()</code>, <code>console.log()</code>, etc are available.</li>
</ul>
<p>Unfortunately, just after I&#8217;d committed the release, I noticed that I&#8217;ve managed to (somehow) pick up a junit dependency.  I&#8217;ll set about removing that for the next release (<a href="http://code.google.com/p/jslint4java/issues/detail?id=35">issue 35</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/12/02/jslint4java-1-3-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jslint4java 1.3.2</title>
		<link>http://happygiraffe.net/blog/2009/11/12/jslint4java-1-3-2/</link>
		<comments>http://happygiraffe.net/blog/2009/11/12/jslint4java-1-3-2/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 22:41:11 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jslint4java]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1646</guid>
		<description><![CDATA[Just a quick note that I&#8217;ve released jslint4java 1.3.2.  There&#8217;s not a lot of news in here.  The main new feature is that I added the ability to specify an external copy of jslint.js.  This is quite useful if Doug Crockford introduces new features before I release a new version of jslint4java.
This [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick note that I&#8217;ve released <a href="http://code.google.com/p/jslint4java">jslint4java</a> 1.3.2.  There&#8217;s not a lot of news in here.  The main new feature is that I added the ability to specify an external copy of <a href="http://www.jslint.com/fulljslint.js">jslint.js</a>.  This is quite useful if Doug Crockford introduces new features before I release a new version of jslint4java.</p>
<p>This release also upgrades to JSLint 2009-10-04, which sports a new <em>maxerrs</em> option.</p>
<p>Apart from that, I&#8217;m particularly grateful to both Simon Kenyon Shepard and Ryan Alberts for pointing out where my unit tests where non-portable.  I really need to get <a href="http://www.hudson-ci.org/">hudson</a> up and running on the games PC…</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/11/12/jslint4java-1-3-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Perforce Perspective</title>
		<link>http://happygiraffe.net/blog/2009/11/09/the-perforce-perspective/</link>
		<comments>http://happygiraffe.net/blog/2009/11/09/the-perforce-perspective/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 19:59:28 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[perforce]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1644</guid>
		<description><![CDATA[I&#8217;m a long time user of subversion, and more recently git.  Coming to Google, however, everything&#8217;s based around perforce.  I&#8217;m still new enough to it, that I don&#8217;t want to criticise it, merely contrast my experiences with it.
The first thing that I noticed with perforce (p4) is quite how server-based it is.  [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a long time user of <a href="http://subversion.tigris.org/">subversion</a>, and more recently <a href="http://git-scm.org/">git</a>.  Coming to Google, however, everything&#8217;s based around <a href="http://www.perforce.com/">perforce</a>.  I&#8217;m still new enough to it, that I don&#8217;t want to criticise it, merely contrast my experiences with it.</p>
<p>The first thing that I noticed with perforce (<code>p4</code>) is quite how server-based it is.  Subversion (and CVS) is often criticised for leaving lots of &#8220;turds&#8221; around: <code>.svn</code> or <code>CVS</code> directories.  They&#8217;re just clutter that you don&#8217;t want to be bothered with.  With perforce however, <em>everything</em> lives on the server.  There is almost no data stored on the client side (perhaps just a <code>.p4config</code> file).  Everything you do has to talk to the server.</p>
<p>The next surprise was how things are checked out.  In subversion, you usually check out the trunk of a project, or a branch.  You can do that in perforce, but it&#8217;s a great deal more flexible.  You supply a client spec, which is a small text file describing a mapping from the server&#8217;s directory structure to your own workspace.  e.g.</p>
<pre class='perforce-client'>
Client: myproject-client

Root: /home/dom/myproject

Views:
  //depot/myproject/...  //myproject-client/myproject/...
  -//depot/myproject/bigdata/... //myproject-client/myproject/bigdata/...
</pre>
<p>In this example, I&#8217;ve checked out all of <code>myproject</code>, except I&#8217;ve also removed some big data which I don&#8217;t need for my development.  You can create a client workspace which is composed of any part (or parts) of your repository.  Unsurprisingly, this is both a blessing and a curse.  You can create very complicated setups using these somewhat ephemeral client specs.  But they&#8217;re not (by default) versioned, so they&#8217;re really easy to lose.  I&#8217;ve also found it very easy to make small mistakes which mean the wrong bits of projects are checked out (or no bits).  If you&#8217;re new to a project, figuring out the correct client spec is one of the first hurdles you&#8217;ll come across.</p>
<p>Once you&#8217;ve got some code checked out, it&#8217;s not too dissimilar to other version control systems.  The most irritating thing that I came across was <code>p4</code>&#8217;s inability to detect added files.  So, if I create a file <code>…/myproject/foo.txt</code> and run <code>p4 pending</code>, it says &#8220;no change.&#8221;  You have to explicitly run <code>p4 add</code>.  This is terrible — it&#8217;s really easy to forget add files.  You can convince perforce to list these files, but it&#8217;s not trivial:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #660033;">-type</span> f <span style="color: #000000; font-weight: bold;">|</span> p4 <span style="color: #660033;">-x</span> - files <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'/ - no such file/{print $1}'</span></pre></div></div>

<p>One feature I quite like is the ability to have &#8220;pending changelists.&#8221;  A <em>changelist</em> is perforce&#8217;s equivalent of a commit in subversion.  You can create a <em>pending changelist</em>, which essentially allows you to build up a commit a little bit at a time, somewhat like git&#8217;s index.  But even though you can have multiple pending changelists in a single client, you are still restricted in that a given file can only be in one of them.  Personally, I find the git index more useful.  Plus, when you submit a pending changelist, it gets assigned a new changelist number.  This can make them difficult to track.</p>
<p>The critical feature for perforce is it&#8217;s integration (merging) support.  Whilst I&#8217;ve done a few <code>p4 integrate</code>s, I&#8217;ve not got the full hang of it yet.  But it&#8217;s clearly far in advance of svn&#8217;s merging.</p>
<p>Internally, perforce is built upon two things:</p>
<ol>
<li> A collection of RCS <code>*,v</code> files.
<li> A few database files to coordinate metadata.
</ol>
<p>This architecture is noticeable: as soon as you look at the file log, you can see that each file has its own individual version number.</p>
<p>Over the years, Google have built up tools to work around many of these issues.  There&#8217;s a nice discussion of perforce and how it&#8217;s used at Google in the <a href="http://lwn.net/Articles/357658/#Comments">comments</a> of the <a href="http://lwn.net/">LWN</a> article <a href="http://lwn.net/Articles/357658/">KS2009: How Google uses Linux</a> (which is a fascinating read in and of itself).</p>
<p>In case you&#8217;re interested in some of the challenges of running perforce at the scale of Google, it&#8217;s worth checking out some of the papers that have been presented at the perforce user conferences:</p>
<ul>
<li><a href="http://www.perforce.com/perforce/conferences/eu/2006/presentations/Google.pdf">Performance and Database Locking at Large Perforce Sites</a> (2006)
<li><a href="http://www.perforce.com/perforce/conferences/us/2007/presentations/DBloch_Life_on_the_Edge2007_paper.pdf">Life on the Edge: Monitoring and Running A Very Large Large Perforce Installation</a> (2007)
<li><a href="http://www.perforce.com/perforce/conferences/us/2009/Presentations/Wright-Disaster_Recovery-paper.pdf">Perforce Disaster Recovery at Google</a> (2009)
</ul>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/11/09/the-perforce-perspective/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The joy of apple keyboards</title>
		<link>http://happygiraffe.net/blog/2009/11/03/the-joy-of-apple-keyboards/</link>
		<comments>http://happygiraffe.net/blog/2009/11/03/the-joy-of-apple-keyboards/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 22:56:13 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1638</guid>
		<description><![CDATA[Recently, I&#8217;ve been using a Linux desktop for the first time in ages.  It&#8217;s Ubuntu (Hardy Heron), and it looks nice.  But after using a mac for three years, I&#8217;m really missing quite a few little things.

The ability to drag and drop anything anywhere.
Being able to type a wide range of Unicode characters [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I&#8217;ve been using a Linux desktop for the first time in ages.  It&#8217;s Ubuntu (Hardy Heron), and it looks nice.  But after using a mac for three years, I&#8217;m really missing quite a few little things.</p>
<ol>
<li>The ability to drag and drop anything anywhere.</li>
<li>Being able to type a wide range of Unicode characters easily.</li>
</ol>
<p>On a mac, it&#8217;s really, really easy to type in a wide variety of useful characters.  All you need is alt (&#x2325;), sometimes known as “option”.</p>
<table border="1">
<tr>
<th>Keys</th>
<th>Character</th>
<th>Name</th>
</tr>
<tr>
<td><code>&#x2325; ;</code></td>
<td>…</td>
<td>HORIZONTAL ELLIPSIS</td>
</tr>
<tr>
<td><code>&#x2325; -</code></td>
<td>–</td>
<td>EN DASH</td>
</tr>
<tr>
<td><code>&#x2325; &#x21E7; -</code></td>
<td>—</td>
<td>EM DASH</td>
</tr>
<tr>
<td><code>&#x2325; [</code></td>
<td>“</td>
<td>LEFT DOUBLE QUOTATION MARK</td>
</tr>
<tr>
<td><code>&#x2325; &#x21E7; [</code></td>
<td>”</td>
<td>RIGHT DOUBLE QUOTATION MARK</td>
</tr>
<tr>
<td><code>&#x2325; 2</code></td>
<td>™</td>
<td>TRADE MARK SIGN</td>
</tr>
<tr>
<td><code>&#x2325; 8</code></td>
<td>•</td>
<td>BULLET</td>
</tr>
<tr>
<td><code>&#x2325; e &nbsp; e</code></td>
<td>é</td>
<td> LATIN SMALL LETTER E WITH ACUTE </td>
</tr>
</table>
<p>How did I find all this out?  The lovely keyboard viewer that comes with OS X.  You can get the flag in your menu bar by going to International in system preferences and checking “Show input menu in menu bar.”</p>
<div style="text-align:center;"><img src="http://happygiraffe.net/blog/wp-content/uploads/2009/11/input-menu.png" alt="Selecting the keyboard viewer in the input menu" border="0" width="237" height="196" /></div>
<div style="text-align:center;"><img src="http://happygiraffe.net/blog/wp-content/uploads/2009/11/keyboard-viewer-normal.png" alt="OS X Keyboard Viewer (normal state)" border="0" width="318" height="175" /></div>
<p>Now, hold down alt and see what you can get (try alt and shift too).</p>
<div style="text-align:center;"><img src="http://happygiraffe.net/blog/wp-content/uploads/2009/11/image-capture-alt.png" alt="OS X Keyboard Viewer (alt)" border="0" width="318" height="175" /></div>
<p>But not everything is attached to a key.  In case you need more characters, there&#8217;s always the character palette.  Usually on the <code>&#x2325; &#x2318; T</code> key as well as in the Edit menu.  Here, you can get access to the vast repertoire of characters in Unicode.  Need an arrow?</p>
<div style="text-align:center;"><img src="http://happygiraffe.net/blog/wp-content/uploads/2009/11/character-palette-arrows.png" alt="Arrows in the Character Palette" border="0" width="370" height="390" /></div>
<p>There&#8217;s a lot you can do with the character palette, but the search box is probably the best way in.  Just tap in a bit of the name of the character you&#8217;re looking for and see what turns up.</p>
<p>This easy access to a wide array of characters is something I&#8217;ve rather come to take for granted in OS X.  So coming back to the Linux desktop, it was odd to find that I couldn&#8217;t as readily type them in.  Of course, I haven&#8217;t invested the time in figuring out how to set up <a href="http://en.wikipedia.org/wiki/X_keyboard_extension">XKB</a> correctly.  Doubtless I could achieve many of the same things.  But my past experiences of XKB and it&#8217;s documentation have shown me how complicated it can be, so I don&#8217;t rate my ability to pull it off.</p>
<p>The end result is that I&#8217;m spending most of my time on the (mac) laptop and ignoring the desktop.  I do like my characters. <img src='http://happygiraffe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/11/03/the-joy-of-apple-keyboards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASL (Apple System Log)</title>
		<link>http://happygiraffe.net/blog/2009/10/20/asl-apple-system-log/</link>
		<comments>http://happygiraffe.net/blog/2009/10/20/asl-apple-system-log/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 19:42:58 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1632</guid>
		<description><![CDATA[I&#8217;ve just been debugging a problem with the pulse-agent on a mac.  One of the big questions we had was: where the heck are the logs?  The pulse-agent is managed by launchd.  Apparently, this logs all stdout and stderr via ASL.
But what&#8217;s ASL?  Apparently, it&#8217;s the Apple System Log.  There&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just been debugging a problem with the pulse-agent on a mac.  One of the big questions we had was: where the heck are the logs?  The pulse-agent is managed by <a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man8/launchd.8.html#//apple_ref/doc/man/8/launchd">launchd</a>.  Apparently, this <a href="http://developer.apple.com/mac/library/technotes/tn2005/tn2083.html#SECLOGGING">logs all stdout and stderr via ASL</a>.</p>
<p>But what&#8217;s ASL?  Apparently, it&#8217;s the Apple System Log.  There&#8217;s a nice summary on <a href="http://boredzo.org/blog/archives/2008-01-19/next-week-apple-system-logger">Domain of the Bored</a>.  He also gives the key hint: you can use <a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/syslog.1.html">syslog(1)</a> to read the binary ASL files.</p>
<p>I didn&#8217;t delve too deeply into the flags.  It appeared that just running <code>syslog</code> spat out all the information I required.  But, it comes out encoded like <code>cat -v</code>.  But you can pipe it through <a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/unvis.1.html">unvis(1)</a> to clean that up.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ syslog <span style="color: #000000; font-weight: bold;">|</span> unvis <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">less</span></pre></div></div>

<p>Normally, <code>Console.app</code> would take care of all this transparently.  But when you&#8217;re ssh&#8217;d into a mac, that&#8217;s not an option.  So it&#8217;s good to know about syslog(1).</p>
<p>Looking closer at the flags, you can say <code>syslog -E safe</code> in place of piping through unvis(1).</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/10/20/asl-apple-system-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book review: Solr 1.4 Enterprise Search Server</title>
		<link>http://happygiraffe.net/blog/2009/10/20/book-review-solr-1-4-enterprise-search-server/</link>
		<comments>http://happygiraffe.net/blog/2009/10/20/book-review-solr-1-4-enterprise-search-server/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 19:25:21 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1630</guid>
		<description><![CDATA[
I was recently offered a review copy of Solr 1.4 Enterprise Search Server (thanks to Swati Iyer).  Whilst this is most fortuitous, I only wish I&#8217;d had this a month or two ago, when I was working fairly heavily on a Solr based project at $OLDWORK.  Still, I&#8217;ll be able to judge whether [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.packtpub.com/solr-1-4-enterprise-search-server?utm_source=happygiraffe.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_000941"><img src="http://happygiraffe.net/blog/wp-content/uploads/2009/10/solr-book-thumb.png" alt="solr-book-thumb.png" border="0" width="100" height="123" align="right" style="padding: 0.5em" /></a></p>
<p>I was recently offered a review copy of <a href="http://www.packtpub.com/solr-1-4-enterprise-search-server?utm_source=happygiraffe.net&#038;utm_medium=bookrev&#038;utm_content=blog&#038;utm_campaign=mdb_000941">Solr 1.4 Enterprise Search Server</a> (thanks to <a href="http://www.linkedin.com/pub/swati-iyer/13/309/804">Swati Iyer</a>).  Whilst this is most fortuitous, I only wish I&#8217;d had this a month or two ago, when I was working fairly heavily on a <a href="http://lucene.apache.org/solr/">Solr</a> based project at <code>$OLDWORK</code>.  Still, I&#8217;ll be able to judge whether or not the book <em>would</em> have been useful. <img src='http://happygiraffe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>First, some background.  Normally, Solr is documented through its <a href="http://wiki.apache.org/solr/FrontPage">wiki</a>.  As wikis go, it&#8217;s well maintained and informative.  But it suffers from both a lack of narrative structure and by being completely online.  The latter point really hit home when I was in ApacheCon 2008, in a Solr training class and couldn&#8217;t get at the documentation.  So, a book covering Solr <em>has</em> to be a good idea.</p>
<p>Even though this book covers Solr 1.4, most of it is still applicable to earlier versions (my experience is all with 1.3).  This is handy, seeing as Solr 1.4 isn&#8217;t released yet (and hence not yet in <a href="http://repo2.maven.org/maven2/org/apache/solr">central</a>).  Hopefully, it should be any day now, seeing as the version numbers have been bumped in svn (<a href="https://svn.apache.org/viewvc?view=revision&#038;revision=824893">r824893</a>).</p>
<p>The first nice thing about this book is simply that it&#8217;s not a massive tome.  At only 317pp, it&#8217;s really quite approachable.  When you open it, the writing is in a friendly, conversational style.</p>
<p>The book starts with a brief introduction to solr and lucene, before moving on to installation.  One thing I found unusual were the comparisons to relational database technology.  These continue in a few places through the book.  Perhaps I&#8217;m so used to search that I don&#8217;t need this.  But given that the focus is on “enterprise,” it&#8217;s quite likely that&#8217;s the best angle to pull in the target audience.  The chapter rounds off with a quick walkthrough of loading and querying data.  It&#8217;s good to see something practical even at this point.</p>
<p>With that out of the way, the discussion moves to the absolute bedrock of solr: the schema.  Defining what data you have and how you want to index and search it is of crucial importance.  Particularly useful is the advice to play with Solr&#8217;s analysis tool, in order to understand how the fields you define <em>actually</em> work.  Whilst the explanations of what the schema is and how design a good one are clear, it&#8217;s still likely that this is a chapter you&#8217;ll be revisiting as you get to know both Solr and your data more.</p>
<p>This chapter also introduces the data set you&#8217;ll work with through the book: the <a href="http://www.musicbrainz.org">MusicBrainz</a> data.  This isn&#8217;t an obvious choice for testing out a search engine (gutenberg?  shakespeare?), but it is fun.  And where it doesn&#8217;t fully exercise Solr, this is pointed out.</p>
<p>Next we move on to how to get your data into Solr.  This assumes a level of familiarity with the command line, in order to use <a href="http://curl.haxx.se/">curl</a>.  As well as the &#8220;normal&#8221; method of POSTing XML documents into Solr, this also covers uploading CSV files and the DataImportHandler.  The latter is a contrib module which I hadn&#8217;t seen before.  This lets you pull your data in to solr (instead of pushing) from any <abbr title="Java DataBase Connectivity">JDBC</abbr> data source.  The only missing thing is something that I spent a while getting right: importing XML data into Solr.  There is a confusion which stems from the fact that you can post XML into solr, but not arbitrary XML.  If you want to put an arbitrary XML document in a Solr field, you have to escape it and nest it into a solr document.  It&#8217;s ugly, but can be made to work.</p>
<p>Once you&#8217;ve got the data in, what about getting it out again?  The chapter on &#8220;basic querying&#8221; covers the myriad of ways you can alter Solr&#8217;s output.  But the basic query stuff is handled well.  In particular, it has a nice clear explanations of Solr&#8217;s variant of &#8220;data structure as XML&#8221; as well as the full query syntax.  There is also detail on the <code>solrconfig.xml</code> which I completely managed to miss in six months of staring at it.  Oh well.</p>
<p>At this point, the book has the basics covered.  You could stop here and get along very well with Solr.  But this is also the bit where the interesting parts start to appear:</p>
<ul>
<li>  There&#8217;s coverage of function queries, which allow you to manipulate the rankings of results in various ways (e.g. ranking newer content higher).  I confess that the function queries looked interesting, but I haven&#8217;t used them and the descriptions in the book swiftly go past my limited maths knowledge.
<li>  The dismax handler is introduced, which gives a far simpler query interface to your users.  This is something I wish I&#8217;d payed closer attention to in my last project.
<li>  Faceting is covered in detail.  This is one of Solr&#8217;s hidden gems, providing information about the complete set of results without performing a second query.  There&#8217;s also a nice demonstration of using faceting to back up a “suggestions” mechanism.
<li> Highlighting results data.  I could have saved a <em>lot</em> of time by reading this.
<li> Spellchecking (“did you mean”).  Again, the coverage highlights several pitfalls you need to be aware of.
</ul>
<p>Then comes the best surprise of all.  A chapter on deployment.  So many books forget this crucial step.  So, there is coverage of logging, backups, monitoring and security.  It might have been nice to also mention integrating it into the system startup sequence.</p>
<p>The remaining chapters cover client integration (with Java, PHP, JavaScript and Rails) and how to scale Solr.  Though I never needed the scaling for my project, the advice given is still useful.  For example, do you <em>need</em> to make every field stored? (doing so can increase disk usage)  The coverage of running Solr on <a href="http://aws.amazon.com/ec2/">EC²</a> also looked rather useful.</p>
<p>Perhaps the one thing that I&#8217;m not entirely happy with is the index (though I acknowledge a good index is hard to achieve).  Some common terms I looked up weren&#8217;t present.</p>
<p>Overall, I&#8217;m really pleased by this book.  Given my own experiences figuring out solr through the school of hard debugging sessions, I can say that this would have made my life a great deal easier.  If you want to use Solr, you&#8217;ll save yourself time with this book.</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/10/20/book-review-solr-1-4-enterprise-search-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>$WORK =~ s/semantico/google/</title>
		<link>http://happygiraffe.net/blog/2009/10/20/work-ssemanticogoogle/</link>
		<comments>http://happygiraffe.net/blog/2009/10/20/work-ssemanticogoogle/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 08:12:35 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1627</guid>
		<description><![CDATA[A couple of weeks ago, I started at Google.  It was time for a change.  I&#8217;d been at semantico for nine years and had an enormous amount of fun with some excellent people.  But I needed to do something different.  So I applied for a release engineer post at Google.  [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, I started at Google.  It was time for a change.  I&#8217;d been at <a href="http://www.semantico.com/">semantico</a> for nine years and had an enormous amount of fun with some excellent people.  But I needed to do something different.  So I applied for a release engineer post at Google.  After the byzantine <a href="http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html">hiring process</a>, I was accepted.  I still reckon I got lucky on the interviews. <img src='http://happygiraffe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>And it took me about two hours to realise I know <em>nothing</em>.  To scale up to that size, everything is custom-built.  It&#8217;s going to be a <span style="color:blue">l</span><span style="color:red">o</span><span style="color:#FFF325">o</span><span style="color:#FFF325">o</span><span style="color:#FFF325">o</span><span style="color:blue">n</span><span style="color:green">g</span> learning process.  And one that doesn&#8217;t stop.  When you have that may thousands of engineers clustered together, things don&#8217;t stand still for long.  But it&#8217;s going to be fun.</p>
<p>On leaving semantico, I was enormously pleased to be given the <a href="http://www.amazon.co.uk/Unicode-Standard-Version-5-0/dp/0321480910/">Unicode 5.0</a> book.  The one continuing thread throughout my time has been encoding issues.  It&#8217;s a fitting cap.</p>
<div style="text-align:center;"><a href="http://www.amazon.co.uk/Unicode-Standard-Version-5-0/dp/0321480910/"><img src="http://happygiraffe.net/blog/wp-content/uploads/2009/10/Unicode_5.0_cover.jpg" alt="The Unicode 5.0 Standard" border="0" width="240" height="240" /></a></div>
<p>I&#8217;d like to say thanks once again to semantico for all the fun times I&#8217;ve had.  I wish you the best of luck in the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/10/20/work-ssemanticogoogle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java Platform Encoding</title>
		<link>http://happygiraffe.net/blog/2009/09/24/java-platform-encoding/</link>
		<comments>http://happygiraffe.net/blog/2009/09/24/java-platform-encoding/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 13:45:37 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1624</guid>
		<description><![CDATA[This came up at $WORK recently.  We had a java program that was given input through command line arguments.  Unfortunately, it went wrong when being passed UTF-8 characters (U+00A9 COPYRIGHT SIGN [©]).  Printing out the command line arguments from inside Java showed that we had double encoded Unicode.
Initially, we just slapped -Dfile.encoding=UTF-8 [...]]]></description>
			<content:encoded><![CDATA[<p>This came up at <code>$WORK</code> recently.  We had a java program that was given input through command line arguments.  Unfortunately, it went wrong when being passed UTF-8 characters (U+00A9 COPYRIGHT SIGN [©]).  Printing out the command line arguments from inside Java showed that we had double encoded Unicode.</p>
<p>Initially, we just slapped <code>-Dfile.encoding=UTF-8</code> on the command line.  But that failed when the site that called this code went through an automatic restart.  So we investigated the issue further.</p>
<p>We quickly found that the presence of absence of the <code>LANG</code> environment variable had a bearing on the matter.</p>
<p><strong>NB:</strong> <code>ShowSystemProperties.jar</code> is very simple and just lists all system properties in sorted order.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ java <span style="color: #660033;">-version</span>
java version <span style="color: #ff0000;">&quot;1.6.0_16&quot;</span>
Java<span style="color: #7a0874; font-weight: bold;">&#40;</span>TM<span style="color: #7a0874; font-weight: bold;">&#41;</span> SE Runtime Environment <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.6.0_16-b01<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Java HotSpot<span style="color: #7a0874; font-weight: bold;">&#40;</span>TM<span style="color: #7a0874; font-weight: bold;">&#41;</span> Server VM <span style="color: #7a0874; font-weight: bold;">&#40;</span>build <span style="color: #000000;">14.2</span>-b01, mixed mode<span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$LANG</span>
en_GB.UTF-<span style="color: #000000;">8</span>
$ java <span style="color: #660033;">-jar</span> ShowSystemProperties.jar <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> encoding
file.encoding=UTF-<span style="color: #000000;">8</span>
file.encoding.pkg=sun.io
sun.io.unicode.encoding=UnicodeLittle
sun.jnu.encoding=UTF-<span style="color: #000000;">8</span>
$ <span style="color: #007800;">LANG</span>= java <span style="color: #660033;">-jar</span> ShowSystemProperties.jar <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> encoding
file.encoding=ANSI_X3.4-<span style="color: #000000;">1968</span>
file.encoding.pkg=sun.io
sun.io.unicode.encoding=UnicodeLittle
sun.jnu.encoding=ANSI_X3.4-<span style="color: #000000;">1968</span></pre></div></div>

<p>So, setting <code>file.encoding</code> works, but there&#8217;s an internal property, <code>sun.jnu.encoding</code> as well.</p>
<p>Next, see what happens when we add the explicit override.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">LANG</span>= java -Dfile.encoding=UTF-<span style="color: #000000;">8</span> <span style="color: #660033;">-jar</span> ShowSystemProperties.jar <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> encoding
file.encoding=UTF-<span style="color: #000000;">8</span>
file.encoding.pkg=sun.io
sun.io.unicode.encoding=UnicodeLittle
sun.jnu.encoding=ANSI_X3.4-<span style="color: #000000;">1968</span></pre></div></div>

<p>Hey!  <code>sun.jnu.encoding</code> isn&#8217;t changing!</p>
<p>Now, as far as I can see, sun.jnu.encoding isn&#8217;t actually documented anywhere.  So you have to go into the source code for Java (openjdk&#8217;s <a href="http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/536cbf2d9d0e">jdk6-b16</a> in this case) to figure out what&#8217;s up.</p>
<p>Let&#8217;s start in <code>main()</code>, which is in <a href="http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/536cbf2d9d0e/src/share/bin/java.c">java.c</a>.  Actually, it&#8217;s <code>JavaMain()</code> that we&#8217;re really interested in.  In there you can see:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> JNICALL
JavaMain<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span> _args<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  …
  jobjectArray mainArgs<span style="color: #339933;">;</span>
&nbsp;
  …
  <span style="color: #808080; font-style: italic;">/* Build argument array */</span>
  mainArgs <span style="color: #339933;">=</span> NewPlatformStringArray<span style="color: #009900;">&#40;</span>env<span style="color: #339933;">,</span> argv<span style="color: #339933;">,</span> argc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mainArgs <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      ReportExceptionDescription<span style="color: #009900;">&#40;</span>env<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">goto</span> leave<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  …
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><code>NewPlatformStringArray()</code> is defined in <code>java.c</code> and calls <code>NewPlatformString()</code> repeatedly with each command line argument.  In turn, that calls <code>new String(byte[], encoding)</code>.  It gets the encoding from <code>getPlatformEncoding()</code>.  That essentially calls <code>System.getProperty("sun.jnu.encoding")</code>.</p>
<p>So where does that property get set?  If you look in <a href="http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/536cbf2d9d0e/src/share/native/java/lang/System.c"><code>System.c</code></a>, <code>Java_java_lang_System_initProperties()</code> calls:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">    PUTPROP<span style="color: #009900;">&#40;</span>props<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;sun.jnu.encoding&quot;</span><span style="color: #339933;">,</span> sprops<span style="color: #339933;">-&gt;</span>sun_jnu_encoding<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>sprops appears to get set in <code>GetJavaProperties()</code> in <a href="http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/536cbf2d9d0e/src/solaris/native/java/lang/java_props_md.c">java_props_md.c</a>.  This interprets various environment variables including the one that control the locale.  It appears to pull out everything after the period in the <code>LANG</code> environment variable as the encoding in order to get <code>sun_jnu_encoding</code>.</p>
<p>Phew.  So we now know that there is a special property which gets used for interpreting &#8220;platform&#8221; strings like:</p>
<p>* Command line arguments<br />
* Main class name<br />
* Environment variables</p>
<p>And it <em>can</em> be overridden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">LANG</span>= java -Dsun.jnu.encoding=UTF-<span style="color: #000000;">8</span> -Dfile.encoding=UTF-<span style="color: #000000;">8</span> <span style="color: #660033;">-jar</span> ShowSystemProperties.jar <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> encoding
file.encoding=UTF-<span style="color: #000000;">8</span>
file.encoding.pkg=sun.io
sun.io.unicode.encoding=UnicodeLittle
sun.jnu.encoding=UTF-<span style="color: #000000;">8</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/09/24/java-platform-encoding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>neon-debug-mask</title>
		<link>http://happygiraffe.net/blog/2009/09/23/neon-debug-mask/</link>
		<comments>http://happygiraffe.net/blog/2009/09/23/neon-debug-mask/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 12:12:10 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1622</guid>
		<description><![CDATA[Sometimes, it&#8217;s useful to see what subversion&#8217;s actually doing when talking to a server.  There&#8217;s a neon-debug-mask option in ~/.subversion/servers.  But what values can it take?  They&#8217;re not documented in the subversion manual.
As always, the source is informative.

/* Debugging masks. */
#define NE_DBG_SOCKET (1&#60;&#60;0) /* raw socket */
#define NE_DBG_HTTP (1&#60;&#60;1) /* HTTP request/response [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes, it&#8217;s useful to see what subversion&#8217;s actually doing when talking to a server.  There&#8217;s a <a href="http://svnbook.red-bean.com/en/1.5/svn.advanced.confarea.html#svn.advanced.confarea.opts.servers"><code>neon-debug-mask</code></a> option in <code>~/.subversion/servers</code>.  But what values can it take?  They&#8217;re not documented in the subversion manual.</p>
<p>As always, the <a href="http://svn.webdav.org/repos/projects/neon/trunk/src/ne_utils.h">source</a> is informative.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* Debugging masks. */</span>
<span style="color: #339933;">#define NE_DBG_SOCKET (1&lt;&lt;0) /* raw socket */</span>
<span style="color: #339933;">#define NE_DBG_HTTP (1&lt;&lt;1) /* HTTP request/response handling */</span>
<span style="color: #339933;">#define NE_DBG_XML (1&lt;&lt;2) /* XML parser */</span>
<span style="color: #339933;">#define NE_DBG_HTTPAUTH (1&lt;&lt;3) /* HTTP authentication (hiding credentials) */</span>
<span style="color: #339933;">#define NE_DBG_HTTPPLAIN (1&lt;&lt;4) /* plaintext HTTP authentication */</span>
<span style="color: #339933;">#define NE_DBG_LOCKS (1&lt;&lt;5) /* WebDAV locking */</span>
<span style="color: #339933;">#define NE_DBG_XMLPARSE (1&lt;&lt;6) /* low-level XML parser */</span>
<span style="color: #339933;">#define NE_DBG_HTTPBODY (1&lt;&lt;7) /* HTTP response body blocks */</span>
<span style="color: #339933;">#define NE_DBG_SSL (1&lt;&lt;8) /* SSL/TLS */</span>
<span style="color: #339933;">#define NE_DBG_FLUSH (1&lt;&lt;30) /* always flush debugging */</span></pre></div></div>

<p>Or if you&#8217;re not a C coder (or had to spent more than 3 seconds working it out like me):</p>
<dl>
<dt>1</dt>
<dd>raw socket</dd>
<dt>2</dt>
<dd>HTTP request/response handling</dd>
<dt>4</dt>
<dd>XML parser</dd>
<dt>8</dt>
<dd>HTTP authentication (hiding credentials)</dd>
<dt>16</dt>
<dd>plaintext HTTP authentication</dd>
<dt>32</dt>
<dd>WebDAV locking</dd>
<dt>64</dt>
<dd>low-level XML parser</dd>
<dt>128</dt>
<dd>HTTP response body blocks</dd>
<dt>256</dt>
<dd>SSL/TLS</dd>
<dt>1073741824</dt>
<dd>always flush debugging</dd>
</dl>
<p>These are summed to enable the features you want. So, if I want requests, responses and bodies, that&#8217;s 2+8+128, so I need this in <code>~/.subversion/servers</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>global<span style="">&#93;</span></span>
<span style="color: #000099;">neon-debug-mask</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> 138</span></pre></div></div>

<p>Of course, interpreting the resulting output is up to you, but if you&#8217;re having difficulties, it may give you some clue what&#8217;s up.  I can immediately see the large &#8220;log&#8221; command that <code><a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html">git svn</a> rebase</code> is using for instance.</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/09/23/neon-debug-mask/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No escape() from JavaScript</title>
		<link>http://happygiraffe.net/blog/2009/09/14/no-escape-from-javascript/</link>
		<comments>http://happygiraffe.net/blog/2009/09/14/no-escape-from-javascript/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 12:50:58 +0000</pubDate>
		<dc:creator>dom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jslint]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://happygiraffe.net/blog/?p=1618</guid>
		<description><![CDATA[A couple of days ago, we got caught out by a few encoding issues in a site at $WORK.  The Perl related ones were fairly self explanatory and I&#8217;d seen before (e.g. not calling decode_utf8() on the query string parameters).  But the JavaScript part was new to me.
The problem was that we were [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago, we got caught out by a few encoding issues in a site at <code>$WORK</code>.  The Perl related ones were fairly self explanatory and I&#8217;d seen before (e.g. not calling <a href="http://search.cpan.org/dist/Encode/Encode.pm#$string_=_decode_utf8%28$octets_[,_CHECK]%29;"><code>decode_utf8()</code></a> on the query string parameters).  But the JavaScript part was new to me.</p>
<p>The problem was that we were using JavaScript to create an URL, but this wasn&#8217;t encoding some characters correctly.  After a bit of investigation, the problem comes down to the difference between <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions"><code>escape()</code></a> and <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/encodeURIComponent"><code>encodeURIComponent()</code></a>.</p>
<style type="text/css">
#escaper {
  border: 1px dotted black;
  text-align: center;
}
#escaper thead {
  background: #eee;
}
#escaper thead th {
  border-bottom: 1px solid black;
}
#escaper td, #escaper th {
  padding: .25em;
}
</style>
<table id="escaper" cellspacing="0">
<thead>
<tr>
<th>input</th>
<th><code>escape(…)</code></th>
<th><code>encodeURIComponent(…)</code></th>
</tr>
</thead>
<tr>
<td><code>a&#038;b</code></td>
<td><code>a%26b</code></td>
<td><code>a%26b</code></td>
</tr>
<tr>
<td><code>1+2</code></td>
<td><code>1+2</code></td>
<td><code>1%2B2</code></td>
</tr>
<tr>
<td><code>caf&#xE9;</code></td>
<td><code>caf%E9</code></td>
<td><code>caf%C3%A9</code></td>
</tr>
<tr>
<td><code>&#x100;dam</code></td>
<td><code>%u0100dam</code></td>
<td><code>%C4%80dam</code></td>
</tr>
</table>
<p>The last is particularly troublesome, as no server I know of will support decoding that <code>%u</code> form.</p>
<p>The takeaway is that <code>encodeURIComponent()</code> <em>always</em> encodes as UTF-8 and doesn&#8217;t miss characters out.  As far as I can see, this means you should simply never use <code>escape()</code>.  Which is why I&#8217;ve asked Douglas Crockford to <a href="http://tech.groups.yahoo.com/group/jslint_com/message/906">add it as a warning</a> to <a href="http://jslint.com/">JSLint</a>.</p>
<p>Once we switched the site&#8217;s JavaScript from <code>escape()</code> to <code>encodeURIComponent()</code>, everything worked as expected.</p>
]]></content:encoded>
			<wfw:commentRss>http://happygiraffe.net/blog/2009/09/14/no-escape-from-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
