<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>Where am I?</title>
    <link>http://blakeley.com/blogofile</link>
    <description>Performance, scalability, databases, and whatever comes up.</description>
    <pubDate>Wed, 25 Jan 2012 21:30:52 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Conditional Profiling for MarkLogic</title>
      <link>http://blakeley.com/blogofile/2011/12/14/conditional-profiling-for-marklogic</link>
      <pubDate>Wed, 14 Dec 2011 15:16:17 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[MarkLogic]]></category>
      <guid isPermaLink="true">http://blakeley.com/blogofile/2011/12/14/conditional-profiling-for-marklogic</guid>
      <description>Conditional Profiling for MarkLogic</description>
      <content:encoded><![CDATA[<p>Today I pushed <a href="https://github.com/mblakele/cprof">cprof</a> to GitHub.
This XQuery library helps application developers
who need to retrofit existing applications with profiling capabilities.
Just replace all your existing calls to
<code>xdmp:eval</code>, <code>xdmp:invoke</code>, <code>xdmp:value</code>,
<code>xdmp:xslt-eval</code>, and <code>xdmp:xslt-eval</code> with corresponding <code>cprof:</code> calls.
Add a little logic around <code>cprof:enable</code> and <code>cprof:report</code>, and you are done.</p>]]></content:encoded>
    </item>
    <item>
      <title>Rebalancing for CoRB</title>
      <link>http://blakeley.com/blogofile/archives/597</link>
      <pubDate>Tue, 01 Nov 2011 20:50:34 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/597</guid>
      <description>Rebalancing for CoRB</description>
      <content:encoded><![CDATA[
I've written some quick scripts for <a href="https://github.com/mblakele/corb-rebalancer">rebalancing forests in a MarkLogic Server database</a>. This leverages CoRB, and makes the job fairly simple. So if you add more forests to a database, and don't have the luxury of clearing and reloading, I hope this code will help.<br/><br/>
]]></content:encoded>
    </item>
    <item>
      <title>MarkLogic 5.0 - First Look</title>
      <link>http://blakeley.com/blogofile/archives/577</link>
      <pubDate>Tue, 01 Nov 2011 12:24:23 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/577</guid>
      <description>MarkLogic 5.0 - First Look</description>
      <content:encoded><![CDATA[
In case you have missed the news, <a href="http://developer.marklogic.com/download">MarkLogic Server 5.0-1</a> is now available. The upgrade went smoothly for me, but this is a major release so it is wise to back up your databases and configuration before upgrading. The on-disk forest version appears to have changed, which will trigger reindexing of all forests. You may want to manually disable reindexing before upgrading, so that you don't have to contend with multiple forests trying to reindex at the same time.
<br/><br/>
This is also a good time to double-check your free disk space, since reindexing uses extra disk space. Some of that space won't be released when reindexing finishes, either. For example, one of my forests looked like this:
<br/><br/>
<div>
<a href="/blogofile/images/wp-content/2011/11/Screen-shot-2011-11-01-at-10.15.11-.png"><img class="size-medium wp-image-580" title="Forest status after reindexing" src="/blogofile/images/wp-content/2011/11/Screen-shot-2011-11-01-at-10.15.11--300x47.png" alt="This forest is holding on to over 2-GiB of deleted fragments." width="300" height="47" /></a>
</div>
<br/><br/>
You can purge those deleted fragments by forcing a merge of the forest, or of the entire database. After doing this, my forest used less disk space.
<br/><br/>
<div>
<a href="/blogofile/images/wp-content/2011/11/Screen-shot-2011-11-01-at-10.24.34-.png"><img class="size-medium wp-image-580" title="Forest status after forced merge" src="/blogofile/images/wp-content/2011/11/Screen-shot-2011-11-01-at-10.24.34--300x32.png" alt="After the forced merge, the deleted fragments are gone and the forest is smaller." width="300" height="32" /></a>
</div>
<br/><br/>
This new release is stricter about unquoted attributes. With previous releases this would generally work, even though the <a href="http://www.w3.org/TR/xquery/#doc-xquery-DirectConstructor">XQuery 1.0 Recommendation</a> requires quoted attribute values:
<p style="padding-left: 30px;"><span style="font-family: monospace;">&lt;test a={xdmp:random()}/&gt;</span></p>
<br/><br/>
Now it throws an <code>XDMP-UNEXPECTED</code> error. Quote the attribute value correctly, and the problem is fixed.
<p style="padding-left: 30px;"><span style="font-family: monospace;">&lt;test a="{xdmp:random()}"/&gt;</span></p>
<br/><br/>
I'm looking forward to learning more about the 5.0 release, but so far it looks good.<br/><br/>
]]></content:encoded>
    </item>
    <item>
      <title>Yet another search parser - XQYSP</title>
      <link>http://blakeley.com/blogofile/archives/588</link>
      <pubDate>Mon, 24 Oct 2011 13:19:59 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/588</guid>
      <description>Yet another search parser - XQYSP</description>
      <content:encoded><![CDATA[
If you need something a little more sophisticated that the search parser built into the MarkLogic search API, give <a href="https://github.com/mblakele/xqysp">XQYSP</a> a try. It supports nested groups, range queries, near queries with distance and ordering, and should be fairly easy to extend.
<br/><br/>
XQYSP takes a slightly different approach than the Search API or the older lib-parser.xqy, both of which returned cts:query items. Instead, XQYSP returns an abstract syntax tree (AST) as XML. It is up to you, the caller, to transform that AST into a cts:query. That is a little more work for you, but adds a lot of flexibility at the same time. Most of the tasks that used to go into lib-parser-custom.xqy can now be implemented without changing the parser itself. To make it easier to get started, though, I have provided sample code to generate a query from an AST. I hope it is useful.<br/><br/>
]]></content:encoded>
    </item>
    <item>
      <title>XQUT - Unit Testing in Pure XQuery</title>
      <link>http://blakeley.com/blogofile/archives/590</link>
      <pubDate>Tue, 13 Sep 2011 16:06:42 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/590</guid>
      <description>XQUT - Unit Testing in Pure XQuery</description>
      <content:encoded><![CDATA[
<p>
I was working on a couple of pure XQuery projects that needed unit
testing. While I could have integrated with JUnit or another existing
framework, I really wanted something simple that I could run directly
from <a href="http://github.com/marklogic/cq">cq</a>.
Hence <a href="http://github.com/mblakele/xqut">XQUT</a>.
</p>
<p>
XQUT will usually be invoked like this:
</p>
<script src="https://gist.github.com/1332346.js?file=xqut-sample.xqy"></script>

<p>
The cq app server should point to the code you are testing,
so that your test suite can import libraries. The eval root is
different: it is the location of the XQUT code, so that you only need
one copy of XQUT. The external variable <code>SUITE</code> is an XML
test suite. A simple test suite might look like this:
</p>
<script src="https://gist.github.com/1332351.js?file=xqut-sample.xml"></script>

<p>
The XML is fairly simple. Under the root <code>suite</code>
element we have one or more <code>unit</code> elements, each
representing a test. The test XQuery can be defined as the lexical
value of the element, or as its <code>expr</code> child. The result
can be defined by a <code>result</code> attribute or element.
</p>
<p>
For more sophisticated tests, you can
add <code>xsi:type</code> attributes and sequences
of <code>result</code> elements. You can also use an
optional <code>environment</code> element to import libraries, define
variables, and define namespace prefixes. If you
add <code>setup</code> elements, these will be evaluated before any
tests. The <a href="https://github.com/mblakele/xqut/blob/master/test/test.xml">test
suite for XQUT</a> itself contains more examples.
</p>
]]></content:encoded>
    </item>
    <item>
      <title>Group By in XQuery 1.0 for MarkLogic Server</title>
      <link>http://blakeley.com/blogofile/archives/560</link>
      <pubDate>Tue, 23 Aug 2011 14:12:17 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/560</guid>
      <description>Group By in XQuery 1.0 for MarkLogic Server</description>
      <content:encoded><![CDATA[
<p>
XQuery 3.0 introduces new syntax for "group by". At this time,
MarkLogic Server 4.2 is the latest release, and it doesn't have
support for that syntax. So how can we implement "group by" when
writing XQuery for MarkLogic?
</p>

<p>
Let's start with the
<a href="http://www.w3.org/TR/xquery-30-use-cases/#groupby-queries-results">W3C
use cases</a>. First, let's fetch the
<a href="http://www.w3.org/TR/xquery-30-use-cases/#dataproducts">sample
data</a> and put it into MarkLogic. We can do that
using <a href="https://github.com/marklogic/cq">cq</a>. I'll leave out
the schemas, since we don't need those. I also won't be exhaustive
about optimizing every expression in these examples: suffice to say
that there is room for even more improvement.
</p>

<script src="https://gist.github.com/1342270.js"> </script>

<p>
Sorry about the long block of code, but we need those documents. Paste
that into cq, evaluate it, and you should get the empty sequence. That
means your documents were inserted correctly: you can use the
'explore' link to check.
</p>

<a
 href="/blogofile/images/wp-content/2011/08/Screen-shot-2011-08-23-at-13.02.29-.png"><img
 src="/blogofile/images/wp-content/2011/08/Screen-shot-2011-08-23-at-13.02.29--300x218.png"
 alt="The cq explorer shows the W3C test documents."
 title="The cq explorer shows the W3C test documents."
 width="300" height="218"
 class="alignnone size-medium wp-image-562" /></a>

<p>
Now we can write some queries. Here is the first use case (Q1).
</p>

<script src="https://gist.github.com/1342274.js"> </script>

<p>
And the result should look like this:
</p>

<script src="https://gist.github.com/1342278.js"> </script>

<p>
We can't write XQuery 3.0 using XQuery 1.0 &mdash; but we can get the
same result using an extra distinct-values step.
</p>

<script src="https://gist.github.com/1342280.js"> </script>

<p>
This code is a little awkward, though. Instead of looping through the
records once, we have to perform a database lookup on each product
name. Normally this would be an unavoidable cost, and perhaps a reason
to look forward to XQuery 3.0. But MarkLogic gives us a way to cheat,
and use an accumulator model to get the same result more quickly. I'm
talking about
<a href="http://developer.marklogic.com/pubs/4.2/apidocs/map.html">maps</a>.
</p>

<script src="https://gist.github.com/1342282.js"> </script>

<p>
This produces the same output, and will scale better the
<code>distinct-values()</code> version would. Of course it is also less
portable. But database application developers often have to implement
non-portable optimizations, and the less portable code can be
segregated into its own library modules.
</p>

<p>Now let's look at the next example (Q2).</p>

<script src="https://gist.github.com/1342287.js"> </script>

<p>Expected result:</p>

<script src="https://gist.github.com/1342290.js"> </script>

<p>Here is a solution using maps:</p>

<script src="https://gist.github.com/1342291.js"> </script>

<p>
Again, this solution produces the same results. This time we had two
elements in the grouping key, and the map key must be a string. So we
had to use an old database trick and concatenate the two values with a
known delimiter. Naturally we have to be careful in our choice of
delimiter.
</p>

<p>
For the remaining queries, I'll skip the W3C examples and output
XML. Here are my solutions. Again, these return the desired results,
but could benefit from more optimization work.
</p>

<script src="https://gist.github.com/1342293.js"> </script>

<script src="https://gist.github.com/1342299.js"> </script>

<script src="https://gist.github.com/1342297.js"> </script>

<script src="https://gist.github.com/1342296.js"> </script>

<script src="https://gist.github.com/1342295.js"> </script>

<script src="https://gist.github.com/1342294.js"> </script>

<p>
This final use-case is kind of odd, because the sample code works if
you simply comment out the "group by". In other words, the sample data
only contains one group. But I reimplemented it anyway.
</p>

<p>That's it. I hope this was worth your time.
</p>
]]></content:encoded>
    </item>
    <item>
      <title>XQuery Code Review</title>
      <link>http://blakeley.com/blogofile/archives/518</link>
      <pubDate>Sun, 05 Dec 2010 13:57:19 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/518</guid>
      <description>XQuery Code Review</description>
      <content:encoded><![CDATA[
<p>
Code review is a crucial part of good development methodology. It can
be a pre-checkin activity, or an ongoing background task in a
pair-programming environment. What should you look for when reviewing
XQuery code?
</p>
<p>
I'm sure I've forgotten a few things, but hopefully this will get you started.
</p>

<h3>Use strong typing</h3>
<p>You can catch many potential bugs this way. If a function's
parameters and return value aren't strongly typed, there should be a
comment explaining why that isn't practical. Try to narrow down the
types, too: be as specific as possible. If a parameter or return type
is node(), ask why it can't be element()? If it's element(), why can't
it be element(foo) or element(*, typename) instead? Don't forget about
quantifiers and schema-element().
</p>

<p>
Besides function variables and return types, this also applies to
module variables, FLWOR variable bindings, and typeswitch variable
bindings.
</p>

<h3>Look for injection paths</h3>
<p>The <code>xdmp:eval</code> and <code>xdmp:value</code> functions
are especially vulnerable, and should be avoided as much as possible
in favor of <code>xdmp:invoke</code> and <code>xdmp:unpath</code>, respectively.
 But it's important to check any user input. For example, is the user
entitled to see the contents of the document requested via
<code>xdmp:get-request-field</code>? It's best if the document is
protected by a good security configuration with read permissions, but
if security checks are being done in application code, be especially
careful to guard against injection attacks.
</p>

<h3>Are there order-by clauses or expressions with gt or lt operators?</h3>
<p>If so, could they be accelerated using range indexes? If range
indexes do exist, are they working? Sometimes the FLWOR syntax will be
subtly outside the boundaries of what MarkLogic Server can optimize,
and sometimes the query collation won't match a string range index
collation.
</p>

<p>
You can check using <code>xdmp:query-trace</code>
or <code>xdmp:plan</code>. Often this makes a good unit test,
especially for performance-critical functionality.
</p>

<h3>Does the code rely on effective boolean values?</h3>
<p>If you see 'if ($foo)then...', ask what the type of $foo is. If it
isn't already a boolean, then the effective boolean value rules come
into play. That could cause mysterious bugs or errors. Would it be
better to write 'if(exists($foo))...' or perhaps 'if ($foo ne 0)...'
instead? The core idea here is to write what you mean, and mean what
you write.
</p>

<p>
This idea also applies to XPath predicates, where-clauses, and any
other boolean context.
</p>

<h3>Review any XPath with '/text()' or '//text()' steps</h3>
<p>When I see a query is full of <code>text()</code> steps, my first
thought is that the developer may not really understand
atomization. Believe it or not, there's often some performance to be
gained by eliminating these extra steps in favor of atomization. But
more importantly, <code>text()</code> can be dangerous. It doesn't
mean "give me the lexical string value of the context nodes". It does
mean "give me the text children, if any, of each of the context
nodes". So it can return nothing, or one text node, or one million
text nodes. These two code examples look similar, but behave in very
different ways. As a result, I try to avoid <code>text()</code> as
much as possible. When it is needed, I leave comments describing why
<code>string()</code> won't work, and what will happen in cases such
as empty sequence or multiple nodes.
</p>

<pre style="padding-left: 30px;">let $n := &lt;p&gt;nodes &lt;i&gt;can&lt;/i&gt; have multiple text children&lt;/p&gt;</pre>
<pre style="padding-left: 30px;">return concat('testing... ', $n)</pre>
<pre style="padding-left: 30px;">=&gt; testing... nodes can have multiple text children</pre>
<pre style="padding-left: 30px;">let $n := &lt;p&gt;nodes &lt;i&gt;can&lt;/i&gt; have multiple text children&lt;/p&gt;</pre>
<pre style="padding-left: 30px;">return concat('testing... ', $n/text())</pre>
<pre style="padding-left: 30px;">=&gt; XDMP-ARGTYPE: (err:XPTY0004) concat("testing... ", (text{"nodes "},</pre>
<pre style="padding-left: 30px;">text{" have multiple text children"})) -- arg2 is not of typexs:anyAtomicType?</pre>

<h3>Review any XPath with '//' steps</h3>
<p>
Sometimes these are necessary, and sometimes they even benefit
performance. But more often they are a sign of short-sighted laziness,
or outright ignorance of the content. Rewriting these expressions as
fully-qualified paths can improve coderesiliency and also performance.
</p>
<p>
If the business logic really calls for descendant-or-self::node(),
comment the code to explain why.
</p>

<h3>Review any function calls within XPath predicates</h3>
<p>Function calls inside an XPath predicate can be horrible for
performance, since the function must be called for every item in the
predicate's input sequence. If the result of the functioncall is
static, simply bind the result to a variable. This is also trueof
operators: even simple math operations like:
</p>

<pre style="padding-left: 30px; ">$list[$start to $start +$size]</pre>
should be rewritten as
<pre style="padding-left: 30px; ">$list[$start to $stop]</pre>

<p>
If you have trouble seeing why this might be a problem, consider a
list with 100 items. Now consider this expression:
</p>

<pre style="padding-left: 30px; ">$list[ xdmp:sleep(100) ]</pre>

<p>Evaluation will cost 100-ms per item, or 10 seconds total. Every
expression takes a finite amount of time to evaluate, and performance
optimization is sometimes a matter of reducing the expression count.
</p>

<h3>Review any XPath sub-expressions within XPath predicates</h3>
<p>Here I don't mean <code>[ foo ]</code> but rather
<code>[ foo/bar ]</code> or <code>[ foo[bar] ]</code>.
These sub-expressions can be
bad for performance. If the result of the sub-expression is static,
bind it to a variable.
</p>

<h3>Watch for nested if-then-else-if-then-else... sub-expressions</h3>
<p>Can it be rewritten as a typeswitch? If so, this is often easier to
read, and faster.
</p>

<h3>Look for opportunities to eliminated unnecessary expressions</h3>
<p>For example, I frequently see code resembling this:
</p>

<pre style="padding-left: 30px;">...</pre>
<pre style="padding-left: 30px;">return if ($flag) then $result else ()</pre>

<p>It would be clearer and more XQuery-like to write this as:
</p>

<pre style="padding-left: 30px; ">...</pre>
<pre style="padding-left: 30px; ">where $flag</pre>
<pre style="padding-left: 30px; ">return $result</pre>

<p>Another common pattern is:
</p>

<pre style="padding-left: 30px;">if ($foo/bar) then $foo/bar else ()</pre>

<p>This can be re-written without changing the results, as:
</p>

<pre style="padding-left: 30px;">$foo/bar</pre>

<p>The trick is to understand that if there are no results for an
XPath expression, then the result is (). A similar pattern is:
</p>

<pre style="padding-left: 30px;">if ($foo eq $bar) then true() else false()</pre>

<p>This can be written as:
</p>

<pre style="padding-left: 30px;">($foo eq $bar)</pre>

<p>The parenthesis aren't strictly necessary, but make it easier to
read expressions like this:
</p>

<pre style="padding-left: 30px;">let $baz := ($foo eq $bar)</pre>
<pre style="padding-left: 30px;">...</pre>

<h3>Watch out for function mapping</h3>
<p>Function mapping is a powerful friend and a terrible enemy. If the
code is a 0.9-to-1.0 port, I recommend disabling function mapping in
every module. If it's new 1.0 code, think about how function mapping
might help or cause problems in different situations.
</p>

<p>
Disabling function mapping is easy. In the prologue, simply add:
</p>

<pre style="padding-left: 30px;">declare option xdmp:mapping "false";</pre>

<h3>Your turn</h3>
<p>As Mary might ask: comments, questions, or denunciations? Any tips
of your own that you would like to share? Let's hear them.
</p>
]]></content:encoded>
    </item>
    <item>
      <title>Chrome for Linux</title>
      <link>http://blakeley.com/blogofile/archives/473</link>
      <pubDate>Sun, 30 May 2010 21:22:44 UTC</pubDate>
      <category><![CDATA[home]]></category>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/473</guid>
      <description>Chrome for Linux</description>
      <content:encoded><![CDATA[
I'm giving Chrome 5.0.375.55 a chance to take over from Firefox 3.6. Here are my thoughts so far:
<br/><br/>
The minimalist windows take some getting used to, but I do enjoy the extra pixels. I turned off the bookmark toolbar, of course. The speed is nice, and I'll be interested to see if battery life is significantly better or worse than with Firefox 3.6.
<br/><br/>
I was pleasantly surprised to find that my bookmark keywords and bookmarklets imported without a hitch. Most of the keyboard shortcuts seem to match with Firefox. I have already installed a few extensions: here is a list. I'm still using <a href="http://privoxy.org/">privoxy</a> to handle most web annoyances, so I don't care about AdBlock.
<ol>
	<li><a href="https://chrome.google.com/extensions/detail/gofhjkjmkpinhpoiabjplobcaignabnl">FlashBlock</a></li>
	<li><a href="https://chrome.google.com/extensions/detail/cpecbmjeidppdiampimghndkikcmoadk">Type-ahead-find</a></li>
	<li><a href="https://chrome.google.com/extensions/detail/gbammbheopgpmaagmckhpjbfgdfkpadb">XML-Tree</a></li>
	<li><a href="https://chrome.google.com/extensions/detail/njoipeaphfnaplplihpbgndfojhdhmjo">ChromeReload</a></li>
</ol>
So far my biggest problem is <a href="http://github.com/marklogic/cq">cq</a>. I have a fix for the keyboard shortcuts, but I can't get XML-Tree to pick up the results frame as XML. I can see the Content-Type header is text/xml for the results frame, but I think perhaps XML-Test doesn't handle this situation. I may need to dust off the older idea of having the browser evaluate an XSLT to display the tree - perhaps with Chrome it will be fast enough to be a worthwhile solution.
<br/><br/>
I would also like to get emacsclient working. I know about <a href="https://chrome.google.com/extensions/detail/ljobjlafonikaiipfkggjbhkghgicgoh">Edit with Emacs</a>, but I'm not yet convinced that I want to run a second micro-server inside emacs.
<br/><br/>
It annoys me that Type-ahead-find doesn't work on chrome:// pages. Of course this is a security precaution, but it also points out why keyboard access should be well thought-out as part of the user experience. Supplementing an incomplete keyboard experience with extensions dooms keyboard users to an incomplete experience.<br/><br/>
]]></content:encoded>
    </item>
    <item>
      <title>MarkLogic CODiE</title>
      <link>http://blakeley.com/blogofile/archives/471</link>
      <pubDate>Fri, 14 May 2010 06:46:28 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/471</guid>
      <description>MarkLogic CODiE</description>
      <content:encoded><![CDATA[
MarkLogic Server 4.1 won a <a title="CODiE" href="http://www.siia.net/CODiEs/2010/winners.asp#software">CODiE</a> this week, for "Best Database Management Solution". That goes up next to past awards from 2009, 2006, and 2005.
<br/><br/>
I wonder what they will think of 4.2?<br/><br/>
]]></content:encoded>
    </item>
    <item>
      <title>MarkLogic User Conference 2010</title>
      <link>http://blakeley.com/blogofile/archives/469</link>
      <pubDate>Mon, 03 May 2010 09:07:22 UTC</pubDate>
      <category><![CDATA[XQuery]]></category>
      <category><![CDATA[Mark Logic]]></category>
      <guid>http://blakeley.com/blogofile/archives/469</guid>
      <description>MarkLogic User Conference 2010</description>
      <content:encoded><![CDATA[
The conference starts tomorrow. I'll be speaking twice: once on high availability, and once on semantic storage and queries. I hope to see you there.
<br/><br/>
<a href="http://www.marklogic.com/UserConference2010/agenda.html">http://www.marklogic.com/UserConference2010/agenda.html</a><br/><br/>
]]></content:encoded>
    </item>
  </channel>
</rss>

