<?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>Zenwerx</title>
	<atom:link href="http://zenwerx.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://zenwerx.com</link>
	<description>Development and Consulting</description>
	<lastBuildDate>Tue, 28 Feb 2012 11:50:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Whoops!</title>
		<link>http://zenwerx.com/2012/02/28/whoops/</link>
		<comments>http://zenwerx.com/2012/02/28/whoops/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 11:50:22 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=415</guid>
		<description><![CDATA[Just wanted to apologize to anyone who might have hit the site yesterday and saw that it was down. I forgot to renew the domain and didn&#8217;t realize until about 6pm. Everything should be working as normal again if you &#8230; <a href="http://zenwerx.com/2012/02/28/whoops/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just wanted to apologize to anyone who might have hit the site yesterday and saw that it was down. I forgot to renew the domain and didn&#8217;t realize until about 6pm. Everything should be working as normal again if you happen to be reading this post!</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2012/02/28/whoops/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Findie Rock Android App Released</title>
		<link>http://zenwerx.com/2011/09/03/findie-rock-android-app-released/</link>
		<comments>http://zenwerx.com/2011/09/03/findie-rock-android-app-released/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 12:29:48 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=407</guid>
		<description><![CDATA[Just a quick post to note that I have released a companion app for Findie Rock . It is available for free on the android market: https://market.android.com/details?id=com.zenwerx.findierock .]]></description>
			<content:encoded><![CDATA[<p>Just a quick post to note that I have released a companion app for <a href="http://www.findierock.com">Findie Rock</a> . It is available for free on the android market: <a href="https://market.android.com/details?id=com.zenwerx.findierock">https://market.android.com/details?id=com.zenwerx.findierock</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/09/03/findie-rock-android-app-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET : IEnumerable + LINQ Extension Methods</title>
		<link>http://zenwerx.com/2011/04/30/net-ienumerable-linq-extension-methods/</link>
		<comments>http://zenwerx.com/2011/04/30/net-ienumerable-linq-extension-methods/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 16:41:30 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=401</guid>
		<description><![CDATA[Before I begin, I am going to make clear that I have harped on the evils of LINQ in the past, although I mostly said this in the context of LINQ-2-SQL (and not being aware of what you are doing!). &#8230; <a href="http://zenwerx.com/2011/04/30/net-ienumerable-linq-extension-methods/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Before I begin, I am going to make clear that I have harped on the evils of LINQ in the past, although I mostly said this in the context of LINQ-2-SQL (and not being aware of what you are doing!).</p>
<p>This isn&#8217;t going to be an overly long post, but I wanted to express my gratitude for the LINQ extension methods which make a lot of repetitive code no longer necessary. These methods have been available for use since .NET 3, and I have been using them for almost as long. I know I&#8217;m pretty late to the party here in praising them, but I needed to get this out anyway!</p>
<p>The real love comes from the fact I no longer have to write wrappers around containers, or even templated (generic) methods of my own to do searching within containers. How many times in the past have I had to write a loop to iterate over a collection of objects to pick out a subset of that collection based on a defined criteria? Too many to count. It&#8217;s one of those frustrations that you couldn&#8217;t solve very easily without resorting custom filtering code and ugly callbacks, since you might never know what criteria you need to search on.</p>
<p>Enter lambdas (closures) and the IEnumerable extension methods to the rescue! We can now write something as simple as:</p>
<blockquote><p>subset = set.Where( x =&gt; x.SomeProperty == criterion );</p></blockquote>
<p>And huzzah! I have a subset of the items I wanted. The other lovely fact here, is that the LINQ is lazy&#8230; it doesn&#8217;t actually evaluate this set until I make a reference to it. While I probably shouldn&#8217;t be calling this code if I&#8217;m not going to be referencing it, I am a fan of lazy evaluation (lazy loading, lazy anything really).</p>
<p>As with anything in the development world, this sort of method can be dangerous if you don&#8217;t use it right. For example, using code like this to filter (or sort) data instead of letting your database do it is pretty silly. On the other hand, if you need to select a set of data from the database and need both the full set, and a subset of the same data&#8230; this method is absolutely wonderful!</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/04/30/net-ienumerable-linq-extension-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Piwik Analytics</title>
		<link>http://zenwerx.com/2011/04/30/piwik-analytics/</link>
		<comments>http://zenwerx.com/2011/04/30/piwik-analytics/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 16:25:27 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[Sites]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=405</guid>
		<description><![CDATA[I&#8217;ve been using Google Analytics for a long time to track the number of visits to the site, as well as other metrics like where visitors come from. My biggest complaint with Google&#8217;s Analytics package, is that it&#8217;s not real &#8230; <a href="http://zenwerx.com/2011/04/30/piwik-analytics/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using Google Analytics for a long time to track the number of visits to the site, as well as other metrics like where visitors come from. My biggest complaint with Google&#8217;s Analytics package, is that it&#8217;s not real time! I have to wait until tomorrow to see results for today (actually, it&#8217;s about 1-3 hours behind&#8230; but that&#8217;s not the default).</p>
<p>Most of the time, that&#8217;s not a big deal. There are some days though that I want to see real time stats about what is happening to my sites and Google Analytics just doesn&#8217;t cut it. So with a quick search, I was able to find <a href="http://piwik.org/">Piwik</a>, an <em><strong>open source</strong></em> and <em><strong>real time</strong></em> analytics package. I&#8217;m only in the testing phase at the moment, but in general the setup was fairly easy&#8230; I guess we&#8217;ll see how it goes!</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/04/30/piwik-analytics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu Day 11.04</title>
		<link>http://zenwerx.com/2011/04/28/ubuntu-day-11-04/</link>
		<comments>http://zenwerx.com/2011/04/28/ubuntu-day-11-04/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 23:52:01 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=403</guid>
		<description><![CDATA[It&#8217;s Ubuntu Day (1 of 2) for 2011. Praise your local Linux guru, and go download Ubuntu 11.04 . I have to say, I don&#8217;t like unity&#8230; at all. I went back to the classic desktop as soon as I &#8230; <a href="http://zenwerx.com/2011/04/28/ubuntu-day-11-04/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s Ubuntu Day (1 of 2) for 2011. Praise your local Linux guru, and go download <a href="http://www.ubuntu.com/download/ubuntu/download">Ubuntu 11.04</a> . I have to say, I don&#8217;t like unity&#8230; at all. I went back to the classic desktop as soon as I figured out how to do it! This isn&#8217;t actually my first experience with the unity desktop, either. When I got my netbook back in October, I attempted to install the Ubuntu netbook remix. I was quick to wipe and install plain Ubuntu upon the precious system.</p>
<p>I was actually very close to reinstalling Ubuntu 10.10 this evening. There&#8217;s always an issue when installing/upgrading and this time, as it always seems to be, there was a problem with the sound. At first I didn&#8217;t even think it was the sound though! Upon loading Firefox 4 (so that I could download Google Chrome), I saw a youtube video on my homepage. I figured I should check it out quickly since flash is also a sore spot with Ubuntu every once in a while. It played, which was a good sign, but it seemed to play is super fast forward no matter what I did.</p>
<p>So I sharpened up my google-fu, and started trying to figure out why this was happening to no avail, including several re-installs of the flash plugin. With that hitting a sore spot, I decided I should try some music. It happened to do the same thing! Finally, after what seemed like forever, I was able to find a vague post on launchpad discussing hardware selections. A-HA, I said to myself. I remember this from the days when I had a Creative Soundblaster Live! card, and the motherboard also had onboard sound.</p>
<p>I fiddled with settings for a few minutes and managed to get things going, but this dilemma really drives me crazy. I don&#8217;t understand why these types of issues are so darn hard to figure out. Ubuntu seemed to think I wanted sound going out from my video card over DVI&#8230; but when that didn&#8217;t work, it didn&#8217;t ever consider another option for sound at all. Nope, it just decided to not work. I have the patience, albeit just enough of it, to try and figure these issues out, but I would never, not in a million years, expect an every day user to try to figure an issue like this out.</p>
<p>So&#8230; Mark Shuttleworth and Ubuntu Developer alike. I ask you, why can&#8217;t things like this be EASY?! I installed Windows 7 last night on the same PC, there wasn&#8217;t a single issue (other than wiping out the MBR&#8230; but that&#8217;s a gripe for another day). I won&#8217;t say that Linux hasn&#8217;t come a long way in the last 5 or 6 years, but I still think there&#8217;s a long, long way to go.</p>
<p>Also&#8230; why the heck do you have to change the default applications every damn release. It&#8217;s driving me insane!</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/04/28/ubuntu-day-11-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Happy Pi Day!</title>
		<link>http://zenwerx.com/2011/03/14/happy-pi-day/</link>
		<comments>http://zenwerx.com/2011/03/14/happy-pi-day/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 13:08:24 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[3.14]]></category>
		<category><![CDATA[pi]]></category>
		<category><![CDATA[pi day]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=387</guid>
		<description><![CDATA[Happy Pi Day to everyone who can deal with American date standards for a day so we can celebrate an awesome number! And&#8230; I broke the pi script (well, technically all my &#8220;projects&#8221; pages) with a little rewrite rule I &#8230; <a href="http://zenwerx.com/2011/03/14/happy-pi-day/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="/pi">Happy Pi Day</a> to everyone who can deal with American date standards for a day so we can celebrate an awesome number! </p>
<p>And&#8230; I broke the pi script (well, technically all my &#8220;projects&#8221; pages) with a little rewrite rule I was testing the other day. I forgot to remove it and it made a nasty redirect loop for things that actually existed. Oh well, it&#8217;s fixed for pi day!</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/03/14/happy-pi-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Har Har HashBang!</title>
		<link>http://zenwerx.com/2011/02/09/har-har-hashbang/</link>
		<comments>http://zenwerx.com/2011/02/09/har-har-hashbang/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 19:43:47 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=381</guid>
		<description><![CDATA[A friend of mine pointed me at the following article today, and I do have to say it was a beautiful read: http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs/ If you want your content to work with &#8220;ajax&#8221; and &#8220;web 2.0&#8243; do the mass of your &#8230; <a href="http://zenwerx.com/2011/02/09/har-har-hashbang/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A friend of mine pointed me at the following article today, and I do have to say it was a beautiful read:<br />
<a href="http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs/">http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs/</a></p>
<p>If you want your content to work with &#8220;ajax&#8221; and &#8220;web 2.0&#8243; do the mass of your HTML rendering first. Don&#8217;t break your site with ridiculous things just because &#8220;it&#8217;s cool!&#8221;, that doesn&#8217;t fly.</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/02/09/har-har-hashbang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Looking for a Software Development Job</title>
		<link>http://zenwerx.com/2011/01/19/looking-for-a-software-development-job/</link>
		<comments>http://zenwerx.com/2011/01/19/looking-for-a-software-development-job/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 19:52:32 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=374</guid>
		<description><![CDATA[It seems that I am looking for work starting today. If anyone sees this and is on the prowl for a Software Developer in the Kitchener-Waterloo area, I am available. Please see my resume for more detail. Cheers Michael]]></description>
			<content:encoded><![CDATA[<p>It seems that I am looking for work starting today. If anyone sees this and is on the prowl for a Software Developer in the Kitchener-Waterloo area, I am available. Please see my <a href="http://zenwerx.com/resume">resume</a> for more detail.</p>
<p>Cheers</p>
<p>Michael</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2011/01/19/looking-for-a-software-development-job/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Full Text Indexes &#8211; Not So Hard</title>
		<link>http://zenwerx.com/2010/12/04/full-text-indexes-not-so-bad/</link>
		<comments>http://zenwerx.com/2010/12/04/full-text-indexes-not-so-bad/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 16:45:46 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=369</guid>
		<description><![CDATA[As a software developer I have always had my fair share of interaction with databases; many different types of them in fact. Databases are not my favourite thing to work with, but let&#8217;s just say they are something which is &#8230; <a href="http://zenwerx.com/2010/12/04/full-text-indexes-not-so-bad/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As a software developer I have always had my fair share of interaction with databases; many different types of them in fact. Databases are not my favourite thing to work with, but let&#8217;s just say they are something which is unavoidable when you need an application to remember things. Especially vast amounts of things!</p>
<p>When I sit down to design a data model, as I have done many, many, MANY times in the past I always try to think about 3rd normal form as a base. I know that full normalization isn&#8217;t always the most efficient when you actually need to run an application, but my theory is always to start with a nicely normalized set of schemas/entities and if necessary I denormalize to improve performance at a later point.</p>
<p>Anyway, I&#8217;m starting to get off on a tangent. One of the things we have to consider when designing databases is how our data will be accessed. How often we will search based on certain criteria and create indexes accordingly to speed up these requests for data. This is usually about as complex as databases get for me, minus writing complex queries. I don&#8217;t usually get down to the details like partitioning and replication and all the grimy stuff.</p>
<p>On the most recent project I&#8217;ve been hacking away on for work (I&#8217;ve discussed this a couple times already regarding the MVP pattern), I ran into an issue I had never had to tackle before. We have fields in our database which are large blocks of text. These blocks may be searched by our users. OK, this is easy so far&#8230; I can just use a &#8220;LIKE&#8221; search to find the text I need (ignore the fact this could never make use of an index unless I did &#8220;searchterm%&#8221;). But if we think about this, we want people&#8217;s searches to be a little smarter than a simple like query since these searches are the real starting point of our application.</p>
<p>So we have an issue at this point, how to we support smart searches? For example, if I have some text in my database like &#8220;I made a database&#8221;, and my user enters a search for &#8220;databases&#8221; is a like query going to match this? Obviously the answer is no, the database isn&#8217;t that smart and neither is my code. It would make sense for this to work, how would we do it? Should we teach the search code to know the English language? Probably not, but the answer is probably obvious for anyone who has worked with large pieces of text before ( on-line forum software anyone??). A full text index can do this for us!</p>
<blockquote><p>
Note: The examples below are for SQL Server&#8230; I do not know if they work in MySQL or other databases. I assume the approach is similar though.
</p></blockquote>
<p>I&#8217;ve never really worked on a project before where I&#8217;ve needed to deal with such large blocks of text, so using a full text index was definitely not the first thing which came to my mind. The first thing I managed to get working was just the searching itself. Rather than using a LIKE query I was able to do a CONTAINS search, which means rather than searching like this: &#8220;LIKE &#8216;%this%&#8217;&#8221;, I was able to search like this: &#8220;CONTAINS( TextField, &#8216;this&#8217; )&#8221;. And to tell you the truth I was really amazed at the speed improvement over the like search I was doing before. Running the query through the analyzer gave me half the time the original search was taking.</p>
<p>So the question now is, how do we do the expanded search we want? Well that&#8217;s also pretty easy! SQL Server has this wonderful operator for fulltext searches called &#8216;FORMSOF&#8217;. Now there are two ways we can make FORMSOF work that I know of, there may be more (Remember what I said before, not a DB Expert! ): INFLECTIONAL and THESAURUS. In our case we want to use the INFLECTIONAL search, which means it will search based on the root of the word. Searching for <strong>databases</strong> will use <strong>database</strong> as the root and turn up matches for both words. I probably picked a bad example there since I can&#8217;t think of another way to form the word database. As another example let&#8217;s use a verb! If we tried the word search we would end up with matches for &#8220;search&#8221;, &#8220;searching&#8221;, &#8220;searches&#8221;, and &#8220;searched&#8221;. Do you see what I&#8217;m talking about now?</p>
<p>For clarity&#8217;s sake, I will actually show you a clause using the above. So our search would be like this: CONTAINS( searchfield, &#8216;FORMSOF(INFLECTIONAL, &#8220;word&#8221;)&#8217;) . Take note that the FORMSOF operator is inside the quotes. To the contains function it just looks like a string. Also note the word we are searching for is in double quotes inside the formsof operator!</p>
<p>And really that should be it. You should now be able to use a full text index on your database and know how to make use of it! Happy searching!</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2010/12/04/full-text-indexes-not-so-bad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress + forums = bbPress?</title>
		<link>http://zenwerx.com/2010/11/27/wordpress-forums-bbpress/</link>
		<comments>http://zenwerx.com/2010/11/27/wordpress-forums-bbpress/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 15:31:25 +0000</pubDate>
		<dc:creator>Michael Carpenter</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://zenwerx.com/?p=358</guid>
		<description><![CDATA[While trying to find a simple forum system for use by FindieRock I ran across a little gem called bbPress which intrigued me. I am considering using wordpress to host the blog portion of the Findie Rock site, and that &#8230; <a href="http://zenwerx.com/2010/11/27/wordpress-forums-bbpress/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While trying to find a simple forum system for use by <a href='http://www.findierock.com'>FindieRock</a> I ran across a little gem called <a href='http://bbpress.org/'>bbPress</a> which intrigued me. I am considering using wordpress to host the blog portion of the <a href="http://www.findierock.com">Findie Rock</a> site, and that got me started thinking. I wanted to involve a community section on <a href="http://www.findierock.com">Findie</a>, and if I had to do any integration with wordpress I wouldn&#8217;t want to do it again with a piece of forum software either. This is where a little google-fu lead me to bbPress, which does integrate nicely with wordpress&#8230; although it does run beside wordpress, and is not a plugin. I was a little disappointed by this, but we will see what we can do. The other disappoint here is theming support. I was really hoping bbPress would integrate nicely with existing wordpress themes, but this is not the case! I either have to find a pair of themes that look nice together, or complete retheme one side or the other if I want them to look nice (not a task I&#8217;m particularly interested in doing).</p>
<p>Anyway, we&#8217;ll see how this goes. As of right now theme integration has failed horribly. Maybe I need to do some more research to see if there&#8217;s a better option for forums which integrate nicely with a Zend Framework site without me coding it from scratch.</p>
]]></content:encoded>
			<wfw:commentRss>http://zenwerx.com/2010/11/27/wordpress-forums-bbpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

