<?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>Glo Bible: Glo Developer Blog</title>
	<atom:link href="http://globible.com/developerblog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://globible.com/developerblog</link>
	<description>Go behind the code to learn what goes into creating Glo.</description>
	<lastBuildDate>Fri, 13 Aug 2010 21:16:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL Server Compact + Full-Text Search?</title>
		<link>http://globible.com/developerblog/?p=61</link>
		<comments>http://globible.com/developerblog/?p=61#comments</comments>
		<pubDate>Fri, 13 Aug 2010 21:16:00 +0000</pubDate>
		<dc:creator>Rob Wingate</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=61</guid>
		<description><![CDATA[SQL Server Compact is a great in-process database engine: it&#8217;s free, lightweight, and xcopy deployable. However, since one of its selling points is its small footprint, Microsoft excludes from it many features that the full version of SQL Server has. One such feature is full-text search (FTS), which helps you build search engine capabilities into [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Server Compact is a great in-process database engine: it&#8217;s free, lightweight, and xcopy deployable. However, since one of its selling points is its small footprint, Microsoft excludes from it many features that the full version of SQL Server has. One such feature is full-text search (FTS), which helps you build search engine capabilities into your applications.</p>
<p>So if SQL Compact doesn&#8217;t support full-text search, how do you implement it in your SQL Compact application? More specifically, how did we do it in Glo?</p>
<p>Plus, Glo holds textual information not only in relational tables, but also in lots of files external to the database. How does Glo retrieve search results from all of those files?</p>
<p>Glo&#8217;s search engine uses <a href="http://lucene.apache.org/lucene.net/">Lucene.NET</a>, which is a C# port of the open-source Lucene search engine written by Doug Cutting. Lucene is an information-retrieval API that helps you build and read FTS indexes programmatically. Essentially, it can make any text searchable within your application.</p>
<p>There&#8217;s nothing wrong with executing LIKE &#8216;%term%&#8217; queries on database tables for simple search functionality, although it&#8217;s likely to be slow. But in the same way that searching the index in the back of a book is faster than searching every page in the book, searching FTS indexes is faster than searching your entire database. A LIKE &#8216;%term%&#8217; query that starts with a wildcard will usually force a table scan or at least an index scan, and will take much longer than an index seek.</p>
<p>A few years ago, a man asked me how it&#8217;s possible for Google to return so many results so quickly when he searches the Internet. &#8220;How can Google search the whole Internet so fast?&#8221; I explained to him that executing a search doesn&#8217;t search the Internet at all, it instead reads a set of pre-built index files, which, like the index at the back of the book, hold the answers all in one place.</p>
<p>Lucene uses the same principle to get search results. In fact, retrieving search results from FTS indexes is straightforward; getting the proper and latest data into the indexes is the part that takes creativity. I&#8217;ll expound on how Glo accomplishes that in a future post.</p>
<p>Props to my co-worker friend Adam Hill, who encouraged me to check Lucene out.</p>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=61</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Clustered Indexes in SQL Server Compact</title>
		<link>http://globible.com/developerblog/?p=47</link>
		<comments>http://globible.com/developerblog/?p=47#comments</comments>
		<pubDate>Tue, 04 May 2010 16:06:27 +0000</pubDate>
		<dc:creator>Rob Wingate</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=47</guid>
		<description><![CDATA[Contrary to what my copy of &#8220;Microsoft SQL Server 2005 Compact Edition&#8221; (Dhingra &#038; Swanson, ©2008 SAMS Publishing) says twice on page 513, SQL Server Compact Edition only supports NONCLUSTERED indexes.
Clustered indexes aren&#8217;t always absolutely necessary, but for some queries they increase retrieval speed significantly. Having spent several weeks tuning Glo&#8217;s content database for performance, [...]]]></description>
			<content:encoded><![CDATA[<p>Contrary to what my copy of &#8220;<em>Microsoft SQL Server 2005 Compact Edition</em>&#8221; (Dhingra &#038; Swanson, ©2008 SAMS Publishing) says twice on page 513, SQL Server Compact Edition only supports NONCLUSTERED indexes.</p>
<p>Clustered indexes aren&#8217;t always absolutely necessary, but for some queries they increase retrieval speed significantly. Having spent several weeks tuning Glo&#8217;s content database for performance, I was a little discouraged to read about this lack of support: </p>
<p><a href="http://technet.microsoft.com/en-us/library/ms345331.aspx">http://technet.microsoft.com/en-us/library/ms345331.aspx</a></p>
<p>The reference above is from 3.5 SP1, and the SP2 docs don&#8217;t allude to a change in this regard. Fortunately most (but not all) of Glo&#8217;s queries run extremely fast &#8212; sub-millisecond in places.</p>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=47</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Glo: Bible of the Year</title>
		<link>http://globible.com/developerblog/?p=44</link>
		<comments>http://globible.com/developerblog/?p=44#comments</comments>
		<pubDate>Tue, 04 May 2010 16:01:49 +0000</pubDate>
		<dc:creator>Rob Wingate</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=44</guid>
		<description><![CDATA[Glo won the 2010 Christian Book Award in the Bible category:
http://www.christiannewswire.com/news/6714813801.html
As one who has been on the Glo team from the beginning, it&#8217;s gratifying to me to hear that Glo is out there making a difference for people. It&#8217;s a testimony that technology continues to be a vehicle for spreading God&#8217;s word.
]]></description>
			<content:encoded><![CDATA[<p>Glo won the 2010 Christian Book Award in the Bible category:</p>
<p><a href="http://www.christiannewswire.com/news/6714813801.html">http://www.christiannewswire.com/news/6714813801.html</a></p>
<p>As one who has been on the Glo team from the beginning, it&#8217;s gratifying to me to hear that Glo is out there making a difference for people. It&#8217;s a testimony that technology continues to be a vehicle for spreading God&#8217;s word.</p>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=44</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lesson Learned: WCF vs. NOT</title>
		<link>http://globible.com/developerblog/?p=25</link>
		<comments>http://globible.com/developerblog/?p=25#comments</comments>
		<pubDate>Mon, 01 Mar 2010 22:08:21 +0000</pubDate>
		<dc:creator>Rob Wingate</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=25</guid>
		<description><![CDATA[For the first ~18 months of Glo&#8217;s development, it self-hosted a fairly large set of WCF services through which we pumped the data coming from SQL Compact over named pipes. Data access &#038; entity-mapping layers sat behind five WCF endpoints used by the Presenters for data retrieval.
The reasoning behind this architecture was simple: it would [...]]]></description>
			<content:encoded><![CDATA[<p>For the first ~18 months of Glo&#8217;s development, it self-hosted a fairly large set of <a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx">WCF</a> services through which we pumped the data coming from <a href="http://www.microsoft.com/Sqlserver/2005/en/us/compact.aspx">SQL Compact</a> over named pipes. Data access &#038; entity-mapping layers sat behind five WCF endpoints used by the Presenters for data retrieval.</p>
<p>The reasoning behind this architecture was simple: it would be nice to leverage the same code for both the desktop and Silverlight apps, so let&#8217;s build it as a WCF service, then just point to a different URI to connect to the service based on the platform.</p>
<p>This worked fine until we started hitting WCF limits. Of course it&#8217;s simple to adjust <code>MaxReceivedMessageSize, MaxItemsInObjectGraph, MaxArrayLength</code> etc defaults, but we also saw we needed to code around perf issues when returning big data chunks. I dealt with tweaking limits for awhile, but after failing to fix WCF errors saying I had exceeded <code>MaxNameTableCharCount</code>, it made me start thinking about bailing on it altogether. The services appeared to be too big &#038; had caused me one too many headaches.</p>
<p>I did tests to gauge potential benefit of eliminating WCF, and was sort of amazed to see the overhead they had imposed. Serialization &#038; transport issues aside, I had attended Juval Lowy&#8217;s lecture on <a href='http://channel9.msdn.com/shows/ARCast.TV/ARCastTV-Every-Class-a-WCF-Service-with-Juval-Lowy/'>&#8220;Every Class a WCF Service&#8221;</a> and came away thinking perf would not be terribly impacted.</p>
<p>So I spent a couple days replacing the services with a layer that loads data entities directly. This boosted backend performance by over 30%, and naturally eliminated associated headaches.</p>
<p>Moral of the story: even if I have to replicate Glo&#8217;s data layer as online WCF services for a web version, removing them from the desktop version was definitely worth it. LESSON LEARNED.</p>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=25</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retaining Your Glo Data and Settings When Re-formatting</title>
		<link>http://globible.com/developerblog/?p=15</link>
		<comments>http://globible.com/developerblog/?p=15#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:35:35 +0000</pubDate>
		<dc:creator>Rob Wingate</dc:creator>
				<category><![CDATA[Configuration]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=15</guid>
		<description><![CDATA[Glo stores your journal data, bookmarks, notes, reading plans, user tags and personal settings in a variety of formats (XML, binary, etc), but in a single location. To retain that data through a reformat or reinstall, you just need to save that folder somewhere, like onto a memory stick, before reformatting or uninstalling. After your [...]]]></description>
			<content:encoded><![CDATA[<p>Glo stores your journal data, bookmarks, notes, reading plans, user tags and personal settings in a variety of formats (XML, binary, etc), but in a single location. To retain that data through a reformat or reinstall, you just need to save that folder somewhere, like onto a memory stick, before reformatting or uninstalling. After your machine is set up again, before running Glo, put the folder back where Glo can find it.</p>
<p>Find the folder here on Vista or Windows 7:</p>
<p><code>C:\Users\[current user]\AppData\Local\glo\</code></p>
<p>Find it here on XP:</p>
<p><code>C:\Documents and Settings\[current user]\Local Settings\Application Data\glo\</code></p>
<p>Of course, substitute &#8216;[current user]&#8216; for your own user account name.</p>
<p>This &#8216;glo&#8217; folder contains a few sub-folders and loose files. Save the &#8216;glo&#8217; folder onto a USB stick or wherever is convenient to archive it. After reformatting and reinstalling, drop the folder back where it was, or in whichever path the new [current user] is using.</p>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=15</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Team, Technologies, Tools</title>
		<link>http://globible.com/developerblog/?p=7</link>
		<comments>http://globible.com/developerblog/?p=7#comments</comments>
		<pubDate>Wed, 03 Feb 2010 19:11:21 +0000</pubDate>
		<dc:creator>Rob Wingate</dc:creator>
				<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=7</guid>
		<description><![CDATA[Here&#8217;s some background info as an introduction to the Glo Development Blog.  We&#8217;re an eight-man team, and most of us have been working on Glo since early 2008.  We develop in an Agile environment.  Since we live in a .NET developer-rich community, but cannot find any local WPF developers to join our team, we figure [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s some background info as an introduction to the Glo Development Blog.  We&#8217;re an eight-man team, and most of us have been working on Glo since early 2008.  We develop in an Agile environment.  Since we live in a .NET developer-rich community, but cannot find any local WPF developers to join our team, we figure we must be the b[igg]est WPF team around.</p>
<h2>Technologies Glo Uses:</h2>
<ul>
<li>Microsoft .NET Framework 3.5</li>
<li>C#, C++, WPF, CAB (Prism), Unity, LINQ</li>
<li>SQL Server Compact Edition 3.5</li>
<li>MapDotNet</li>
<li>Lucene.NET</li>
</ul>
<h2>Tools We Use To Develop Glo:</h2>
<ul>
<li>Visual Studio 2008</li>
<li>SQL Server 2008</li>
<li>Expression Blend</li>
<li>Enterprise Library 4.1</li>
<li>WCF, ASMX</li>
<li>WinForms, ASP.NET</li>
<li>ANTS Profilers</li>
<li>SQL Toolbelt</li>
<li>Sourcegear Vault</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=7</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Welcome to the Glo Developer Blog!</title>
		<link>http://globible.com/developerblog/?p=1</link>
		<comments>http://globible.com/developerblog/?p=1#comments</comments>
		<pubDate>Wed, 13 Jan 2010 18:59:24 +0000</pubDate>
		<dc:creator>Peter</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://globible.com/developerblog/?p=1</guid>
		<description><![CDATA[We&#8217;ll use this space to talk about the development of Glo. Check back for updates!
]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ll use this space to talk about the development of Glo. Check back for updates!</p>
]]></content:encoded>
			<wfw:commentRss>http://globible.com/developerblog/?feed=rss2&amp;p=1</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
