<?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>In Valid Logic</title>
	<atom:link href="http://invalidlogic.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://invalidlogic.com</link>
	<description>Endlessly expanding technology</description>
	<lastBuildDate>Fri, 12 Mar 2010 02:20:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Team City &amp; its levels of awesome</title>
		<link>http://invalidlogic.com/2010/03/11/team-city-its-levels-of-awesome/</link>
		<comments>http://invalidlogic.com/2010/03/11/team-city-its-levels-of-awesome/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 02:20:16 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[telligent]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=496</guid>
		<description><![CDATA[Recently, I&#8217;ve been working on migrating our build process at Telligent from using Cruise Control .NET to use JetBrain&#8217;s Team City.  Cruise Control has served us well, but after looking at the feature set of Team City, it had a number of things that we were wanting to leverage as we continued to expand [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I&#8217;ve been working on migrating our build process at <a href="http://telligent.com">Telligent</a> from using <a href="http://ccnet.thoughtworks.com/">Cruise Control .NET</a> to use <a href="http://www.jetbrains.com/teamcity/">JetBrain&#8217;s Team City</a>.  Cruise Control has served us well, but after looking at the feature set of Team City, it had a number of things that we were wanting to leverage as we continued to expand our build process.  Was asked on Twitter what I liked so much about Team City versus Cruise Control, but there wasn&#8217;t a good way to sum it up in 140 characters.  So here is a brief list of some of the reasons:</p>
<ol>
<li>No XML configuration files.  Granted, our builds are in <a href="http://nant.sourceforge.net/">NAnt</a>, so we&#8217;re still married to XML, but creating a new build doesn&#8217;t need to take any XML editing anymore.  Our build scripts have no hard coded values, everything it needs it passed in from Team City.  So we can go an existing build, click Copy, then just edit the configuration settings as needed.</li>
<li>It queues builds.  We run a number of daily builds at 4pm Central and at that time, the build server comes to a screeching halt because all of them run at the same time.  We&#8217;ve <em>had</em> to stagger them an extend the timeout limit on several because of how slow it gets.  Team City instead runs one at a time, queues the others, and lets you prioritize the queue if you need to bump things up.</li>
<li>Does more for you.  First of all, it exports the source from the main repository cache for you.  When building, you want to avoid working off the main repository cache since then you can get stuck with collisions on update, but with CC.NET, we always had to do the export and everything ourself.  Team City takes care of and reverts the source to a clean state one each run.</li>
<li>Artifacts and cross dependencies.  In CC.NET, we always had a network share set up where we&#8217;d place built packages, but with Team City, they can be loaded back into the main site for storage and easily accessible.  On top of that, you can place dependencies between builds and have the artifacts extracted.  For instance, we have one built that fully packages a release every day.  We have another build that our Selenium tests.  We have a build dependency on them so that Team City extracts our latest package and the build script sets it up in IIS and runs against it.  As time goes on and we get more of our subcomponents into Team City, ensuring all subcomponents stay up to date will be automated and far easier.</li>
<li>Streaming build log.  No longer do I need to wait for the build to be done to see what is going on.  Team City can stream the build log to the browser, so I can see where its at, what is hung up on, or if it did something wrong that wasn&#8217;t an error, can stop the build and correct it.</li>
<li>Easily customize builds.  A while ago, we&#8217;d built a &#8220;preview build&#8221; and then a short while afterwards, realized there was an issue with the build.  Not with the code, but just the build process.  We needed to send an updated one, but wasn&#8217;t sure if the latest code was at a release-worthy state.  Luckily, Team City makes it super easy.  Right through the interface, I was able to kick off a new build of the same SVN revision as the earlier one.  It also was intelligent enough so that in the history, it distinguishes it so someone knows it is different and in the description, says it is a build of an earlier commit and out of line with the other builds.</li>
<li>Test history.  We&#8217;ve just started pulling in our test builds, but one nice thing I&#8217;ve immediately notice is some of the rich reporting it has around test stats.  For instance, it shows when a test started failing (if its been in multiple builds), allows you assign someone to be responsible, allows you to track a test&#8217;s history, and even identify problematic tests (probably ones that fail the most).  You can even track the test duration and see it change over time.</li>
</ol>
<p>Overall, would have to sum Team City up as just being incredibly refined.</p>
<p>I know a number of people who have larger Cruise Control setups than us, but overall Team City brings a lot to the table and the cost factor makes it a dead on winner.  Team City can easily pay for itself just in terms of productivity.  But on top of that, it is free up to 20 build configurations!</p>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/03/11/team-city-its-levels-of-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trunks officially launched</title>
		<link>http://invalidlogic.com/2010/03/04/trunks-officially-launched/</link>
		<comments>http://invalidlogic.com/2010/03/04/trunks-officially-launched/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 18:12:55 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=489</guid>
		<description><![CDATA[This morning was looking at my blog and I realized I&#8217;d never posted about launching Trunks!
On Monday, I took the beta sticker off Trunks, making it officially available.  Trunks has been doing quite while, and although it still has a small user base, I&#8217;ve been very pleased with its growth.  Over the three [...]]]></description>
			<content:encoded><![CDATA[<p>This morning was looking at my blog and I realized I&#8217;d never posted about <a href="https://trunksapp.com/blog/6-it-s-official-we-ve-launched">launching Trunks</a>!</p>
<p>On Monday, I took the beta sticker off Trunks, making it officially available.  Trunks has been doing quite while, and although it still has a small user base, I&#8217;ve been very pleased with its growth.  Over the three months it was in beta, new users were slowly trickling in and even <a href="http://afreshcup.com/home/2010/2/5/double-shot-642.html">got a mention</a> by Mike Gunderloy.  There weren&#8217;t any major issues that came up, just a few bugs here and there.  In that time, have added a few new features, refined the backend, monitored performance (even though its small, still important), and focused on stability of the systems.</p>
<p>Last week I was talking to a friend about Trunks and they were asking what was left in order to launch it&#8230; boiled down to adding diff support and the ability to pay for it (kind of important).  After thinking &#8220;that&#8217;s all,&#8221; I figured I&#8217;d buckle down and finish things off.  Also managed to fit in some UI tweaks and refinements, especially after cringing at the signup page I used to have.</p>
<p>If you haven&#8217;t already checked out Trunks, <a href="http://trunksapp.com/home">I definitely invite you to</a>.</p>
<div align="center"><img src="http://img.skitch.com/20100304-ga2fisfed79xe77fkpfr5ktsht.png" alt="Trunks - Screenshot" align="center" width="622" height="471" border="0" /></div>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/03/04/trunks-officially-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Papercut 2010.3.3 released!</title>
		<link>http://invalidlogic.com/2010/03/03/papercut-2010-3-3-released/</link>
		<comments>http://invalidlogic.com/2010/03/03/papercut-2010-3-3-released/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 02:08:58 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=479</guid>
		<description><![CDATA[Have been working on a new take on Papercut (details coming soon) when I noticed that there were several issues opened in Codeplex and a number of patches submitted.  I&#8217;d forgotten to enable email notifications!  So decided to sit down and felt some of them merited a new release.  Release notes below.
Download

This release includes a [...]]]></description>
			<content:encoded><![CDATA[<p>Have been working on a new take on Papercut (details coming soon) when I noticed that there were several issues opened in Codeplex and a number of patches submitted.  I&#8217;d forgotten to enable email notifications!  So decided to sit down and felt some of them merited a new release.  Release notes below.</p>
<p><a href="http://papercut.codeplex.com/releases/view/41337">Download</a></p>
<blockquote>
<p>This release includes a few bug fixes and updates, several of which were contributed patches (thanks!).</p>
<ul>
<li>Feature: Added support for embedded images (patch submitted by jasonpenny)</li>
<li>Enhancement: Show an alert when trying to use port that is already in use (Issue #5405)</li>
<li>Enhancement: Don&#8217;t show the options dialog in the taskbar (patch submitted by dukesb11)</li>
<li>Fix: Updates to fix issues with multipart messages (Issue #4959, patched submitted by jasonpenny)</li>
<li>Fix: Issue with async networking and not handling a disposed object (patch submitted by jasonpenny)</li>
<li>Fix: Out dated URL references (Issue #5457, patch submitted by billrob458)</li>
</ul>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/03/03/papercut-2010-3-3-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two years with Ruby</title>
		<link>http://invalidlogic.com/2010/02/19/two-years-with-ruby/</link>
		<comments>http://invalidlogic.com/2010/02/19/two-years-with-ruby/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 07:57:20 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=475</guid>
		<description><![CDATA[Tonight I realized that its now been two years since I first started working with Ruby.  Back in February of 2008, I&#8217;d posted about my first experiments with Rails.  Lo and behold, its now been two years.  I do say two years with Ruby though, not Rails.  I&#8217;ve been using Merb for about the [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight I realized that its now been two years since I first started working with Ruby.  Back in February of 2008, I&#8217;d posted about my <a href="http://invalidlogic.com/2008/02/21/experimenting-in-rails/">first experiments with Rails</a>.  Lo and behold, its now been two years.  I do say two years with Ruby though, not Rails.  I&#8217;ve been using Merb for about the past year and a half.  Although I have started messing around with Rails 3 and really like what I see so far.</p>
<p>So in the past two years, what have I done?  Sadly, a lot of it is sorely behind and out dated, but take a bit of a trip down memory lane&#8230;</p>
<ul>
<li>The SkitchDav I originally blogged about, but now no longer use</li>
<li><a href="http://github.com/krobertson/dm-dbslayer">DM-DBSlayer</a>. I was using it in a personal app, but the app didn&#8217;t need scale, so eventually removed it.</li>
<li><a href="http://github.com/krobertson/dm-paperclip">DM-Paperclip</a>.  I really need to dust this off, it needs some TLC.</li>
<li>Some hacking on <a href="http://github.com/krobertson/warehouse">Warehouse</a>, which eventually led to my ideas for Trunks.</li>
<li><a href="http://github.com/krobertson/branches">Branches</a>, which was basically a ruby port of Gitosis.  I wrote it anticipating using it for Trunks so I could interact with the DB in Ruby.  I did in the first incarnation of trunks, but am now on &#8220;Branches 2.0&#8243; which was done from scratch and super simplified so it is Trunks-only and structured to do both Git and Mercurial.  Would actually be nice to pull it out of Trunks and release it.  Damn, another project for my list.</li>
<li><a href="http://github.com/krobertson/tigger">Tigger</a>.  Really bad name.  When I first wrote Trunks but was unsure about launching it, tried to redo the interface as a better read-only web interface to git repos.  The app should still work&#8230; was on Merb 1.0.</li>
<li>And of course, <a href="http://trunksapp.com/">Trunks</a>.  Merb 1.1-pre.</li>
</ul>
<p>And I&#8217;ve also had several apps that haven&#8217;t seen the light of day and were more for my personal use or tinkering.</p>
<ul>
<li>For a while I was into <a href="http://eveonline.com/">EVE Online</a> and wrote an app to parse and process item reports from <a href="http://www.eve-central.com/">Eve Central</a>.  It allowed me to locate items that were selling under market rate quickly, compare prices across markets, and I could somewhat defer what items were selling most at different market hubs.  Really geeky.  Probably put several months into it.  Merb app.</li>
<li>Also wrote an app to track my sales by location, by item, and comparing sales volumes based on price as I played with prices.  Merb app.</li>
<li>And another for EVE Online&#8230; came up with the &#8220;Jita Mineral Index&#8221; which tracked mineral prices in the main market hub in the game.  I left it up for several months after I stopped playing, until I found that the app that processed the emails from Eve Central broke and had like 200k+ unprocessed messages in its inbox.  Merb app.</li>
<li>Some time ago, was playing with different virtualization APIs and wrote an app that would provision and deploy virtual servers in KVM and in XenServer.  I&#8217;m probably too much of a nut about virtualization.  Mixture of stuff&#8230; Ruby, <a href="http://github.com/ezmobius/nanite/">Nanite</a>, Merb.</li>
<li>A really basic Sinatra app to handle my domains that just have static pages.  Rather than having multiple sites, I have just one and it determines which template to render based on the host header.  Was my first Sinatra app.</li>
</ul>
<p>And of course some other stuff on <a href="http://github.com/krobertson">Github</a> and <a href="http://gist.github.com/krobertson">Gist</a>.</p>
<p>And I have some that will likely be coming soon:</p>
<ul>
<li><a href="http://smugpic.heroku.com/">This</a>, which I&#8217;ll likely blog about once I get a name for it and a domain.  And update the incorrect launch date in the News part, oops.</li>
<li>Was actually thinking of dusting off my original SkitchDav as a Sinatra app.  What triggered me to write this.</li>
<li>Also thinking of dusting off an app I prototyped a while ago involving Rack and Solr.</li>
<li>Always got ideas brewing in my head&#8230; just a matter of parsing out which are really worth my free time.</li>
</ul>
<p>All this Ruby has also helped me to grow so much more as a .NET developer.</p>
<ul>
<li>More languages you know the better.</li>
<li>Exposure to new methodologies and mindsets, new more progressive community.</li>
<li>Exposure to testing.  Testing is far easier in dynamic languages, and grasping the concepts in a dynamic language makes it easier to apply to a static language.</li>
<li>MVC.  Thank god for MVC.  Unlearned all the webforms crap and re-learned plain and simple HTTP and a logical structure for your app.</li>
<li>Making programming fun again.  Its nothing against .NET, but sometimes you need to break out from the familiar and learn something new to remind you why you love programming.  Before Ruby, I was stuck in what I knew and don&#8217;t really think I was coding for fun much.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/02/19/two-years-with-ruby/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Migrating datacenters: How to forward traffic</title>
		<link>http://invalidlogic.com/2010/02/12/migrating-datacenters-how-to-forward-traffic/</link>
		<comments>http://invalidlogic.com/2010/02/12/migrating-datacenters-how-to-forward-traffic/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 01:09:44 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[servers]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=467</guid>
		<description><![CDATA[I have some of my own datacenter space with a couple of servers that I use for a little bit of hosting that I do.  This weekend, I&#8217;m finishing a migration and having done this type of thing a couple of times, thought I&#8217;d share a few tips.
First of all, one thing that is very [...]]]></description>
			<content:encoded><![CDATA[<p>I have some of my own datacenter space with a couple of servers that I use for a little bit of hosting that I do.  This weekend, I&#8217;m finishing a migration and having done this type of thing a couple of times, thought I&#8217;d share a few tips.</p>
<p>First of all, one thing that is very nice to do, if you have a presence in both places at the same time, is to configure IP forwarding from your old site to your new site.  While it is a best practice to set the TTL on your DNS records really low (mine are currently 60 seconds), ISPs don&#8217;t always honor the TTLs and some will be more aggressive with caching.  As a rule, its usually 8-24 hours before you can really count on old caches being expired.</p>
<p>To combat this, forwarding any traffic that might be going to the old addresses to the new ones can be very helpful, and fairly easy to do.</p>
<p>There can be several ways to do this, but can often times end up more complicated.  The pure and simple way to do it is to use an application called <a href="http://www.boutell.com/rinetd/">rinetd</a>, which is basically an &#8220;internet redirection server&#8221;.  You simple edit its configuration file, specify the old IP address and port, and the new IP address and port.  Run it and you&#8217;re good!</p>
<p>I run ESXi on some of my systems, so I simply created a new virtual machine with a very basic configuration and installed Ubuntu on it.  I gave it a base IP that I wasn&#8217;t going to be forwarding, installed SSH on it (to remotely manage it), and then went to town setting up what I needed forwarded.  First, I added the IPs to be forwarded as aliases in /etc/network/interfaces:</p>
<pre class="brush: plain; light: true;">auto eth0:0
iface eth0:0 inet static
     address 192.168.1.111
     netmask 255.255.255.0</pre>
<p>Now, I need rinetd.  On Ubuntu, it is readily available as a package, so just run <tt>sudo apt-get install rinetd</tt> and you&#8217;re set.  Edit the /etc/rinetd.conf to list out how you want things forwarded:</p>
<pre class="brush: plain; light: true;"># old ip         old port    new ip          new port
192.168.1.111    80          172.16.1.222    80</pre>
<p>Afterwards, all you need to do is restart networking and rinetd.  So run <tt>sudo /etc/init.d/networking restart</tt> and <tt>sudo /etc/init.d/rinetd restart</tt>.</p>
<p>Few things worth noting.  rinetd binds to the address/port you specify, so if you are trying to forward port 80, you can&#8217;t have something else bound to port 80 on that IP, such as a webserver.  So if you need to forward something that you might have in use, you may have to tweak things.  If you need to forward SSH, it might be best to configure SSH to use another port for a little while.  Second, I&#8217;d sometimes just reboot the virtual machine instead of restarting networking.  I&#8217;d migrate some stuff one night and have it forward for 24 hours, then next night migrate something else and have it forwarded.  It&#8217;d sometimes get a little hairy adding/removing/reconfiguring aliases a lot, so I&#8217;d just reboot.</p>
<p>Another plus with rinetd is that a port of it exists for Windows!  A download exists on <a href="http://www.boutell.com/rinetd/">its site</a> and it is also possible to configure it as a Windows service using <a href="http://serviceex.com/">ServiceEx</a>.  I haven&#8217;t tried it myself, but I did find some pretty <a href="http://blog.ehuna.org/2009/10/an_easier_way_to_access_the_wi.html">detailed instructions</a> about configuring it on Windows.</p>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/02/12/migrating-datacenters-how-to-forward-traffic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One of these things is not like the other, except to SQL</title>
		<link>http://invalidlogic.com/2010/02/08/one-of-these-things-is-not-like-the-other-except-to-sql/</link>
		<comments>http://invalidlogic.com/2010/02/08/one-of-these-things-is-not-like-the-other-except-to-sql/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 18:56:11 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=454</guid>
		<description><![CDATA[Was recently working on an issue that was so perplexing, that I almost had David Penton, our resident SQL expert stumped.
We had an issue with some username handling and it ended up boiling down to there we could go into SQL Server, run this query, and get a result when you&#8217;d normally expect it to [...]]]></description>
			<content:encoded><![CDATA[<p>Was recently working on an issue that was so perplexing, that I <em>almost</em> had <a href="http://pentonizer.com/">David Penton</a>, our resident SQL expert stumped.</p>
<p>We had an issue with some username handling and it ended up boiling down to there we could go into SQL Server, run this query, and get a result when you&#8217;d normally expect it to not match:</p>
<pre class="brush: sql; light: true;">select 1 where N'ß' = N'ss'</pre>
<p>After that, I was truly stumped.  I&#8217;d Googled everything I could think of any came up empty.  Had I known what the <a href="http://en.wikipedia.org/wiki/German_alphabet#Sharp_s">German sharp S</a> was, life would have been easier.  Come to find out through <a href="http://www.ureader.com/message/1343195.aspx">some sources</a>, that some of the SQL standards (in this case, SQL92 is referenced) call for the German sharp S is translated down to &#8220;ss&#8221; in string comparisons.  So although it might seem like a bug, it is to-spec.  Oracle is also reported as working this way.</p>
<p>To work around the behavior, one option is a <a href="http://connect.microsoft.com/SQLServer/feedback/details/341130/-and-ss-are-not-equal#tabs">workaround function</a> for SQL Server which essentially has you convert the string to a binary column and store it.  This may be outside what you can do in your application though, as in ours, we&#8217;d need to update every place that does string comparisons on the username as well as altering the ASP.NET Membership tables and stored procedures.</p>
<p>An alternative is to change your database collation to use one that is more binary dependent such as Latin1_General_BIN.  This will treat ß and &#8217;ss&#8217; separately, though also be aware since it is binary, it is case insensitive and some behaviors such as sorting may also change.</p>
<p>A topic like this is important for any developer for a few reasons:</p>
<p>First, being in the US, it is easy to be ignorant of other culture&#8217;s language handling.  You may work to add resource labels so your application can be translated and such, but every so often you will find behaviors related to internalization that perplex you because you&#8217;ve never heard of the German sharp S (as in this case).</p>
<p>Second, when its an issue in SQL and you&#8217;re in doubt, look at collation first.  SQL Server has a <em>huge</em> list of collations, and each one does something different.  Its either a behavior with the one you&#8217;re using, or the user is using a collation you haven&#8217;t tried (tested) before.</p>
<p>And finally&#8230; need to try harder to stump Penton.  It can be done!</p>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/02/08/one-of-these-things-is-not-like-the-other-except-to-sql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hiring in today&#8217;s market</title>
		<link>http://invalidlogic.com/2010/02/05/hiring-in-todays-market/</link>
		<comments>http://invalidlogic.com/2010/02/05/hiring-in-todays-market/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 20:29:55 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=459</guid>
		<description><![CDATA[It is crazy how today&#8217;s job market is.  Earlier I was looking over the new topics on Hacker News for the &#8220;Ask HN&#8221; threads and was surprised to find three &#8220;whose hiring&#8221; ones in the past 7 hours.
Today&#8217;s market is super competitive, especially at the entry level jobs.  My sister graduated from CSU [...]]]></description>
			<content:encoded><![CDATA[<p>It is crazy how today&#8217;s job market is.  Earlier I was looking over the new topics on <a href="http://news.ycombinator.com/">Hacker News</a> for the &#8220;Ask HN&#8221; threads and was surprised to find three &#8220;whose hiring&#8221; ones in the past 7 hours.</p>
<p>Today&#8217;s market is super competitive, especially at the entry level jobs.  My sister graduated from <a href="http://www.fullerton.edu/">CSU Fullerton</a> with a degree in Journalism and Graphic Design, which has a strong communications program and is well respected.  She was also a contributing author to the school newspaper, interned at <a href="http://www.usmagazine.com/">Us Weekly</a> in Los Angeles for two years, and interned for Us Weekly in New York over the summer.</p>
<p>She graduated in May, but just now was able to get a job in her field.  That is nuts.  Granted over the summer she was doing an internship in New York, expected to stay there but later decided to come back to California.  But she still was actively looking for a job from August to the end of January.  On the job she finally got, she beat out 250 other people who&#8217;d submitted resumes.  She was also in consideration for another job, that one was up against even more people and it came down to her and one other person.</p>
<p>The market today is a stark contrast from when I was in college and all my professors and advisors were touting how easy it&#8217;ll be to get a job and making $60k easy.  I would be scared to be graduating in today&#8217;s market.</p>
<p>Today, a degree is just a piece of paper.  Everyone else who is graduating with you has the same piece of paper.  To beat them out, its who you know and the experience you have.  I&#8217;m by no means saying college is worthless, but rather it isn&#8217;t everything.  I&#8217;m a college drop out&#8230; I left college to work at Telligent.  I&#8217;ve been luck enough to have it work out, and now my work experience would be more relevant.  Its no longer enough to just go to college.</p>
<p>Building on <a href="http://invalidlogic.com/2010/02/05/being-professional-and-managing-your-identity/#comment-763">James&#8217;s comment</a> in my last post, a web developer today needs Google juice behind them.  A degree is great, but so is a blog with relevant topics, involvements in projects, a Github profile, and more.</p>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/02/05/hiring-in-todays-market/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Being professional and managing your identity</title>
		<link>http://invalidlogic.com/2010/02/05/being-professional-and-managing-your-identity/</link>
		<comments>http://invalidlogic.com/2010/02/05/being-professional-and-managing-your-identity/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 18:55:35 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=451</guid>
		<description><![CDATA[This new podcast has been causing quite the discussion on Twitter this morning and I thought I&#8217;d take a moment with a few thoughts.  The podcast is this one and you might want to listen to it, for the first couple minutes, but it will be truly be a waste of your time and [...]]]></description>
			<content:encoded><![CDATA[<p>This new podcast has been causing quite the discussion on Twitter this morning and I thought I&#8217;d take a moment with a few thoughts.  The podcast is <a href="http://dotnetdrunk.com/">this one</a> and you might want to listen to it, for the first couple minutes, but it will be truly be a waste of your time and will leave you feeling dirty about some of the other people in your profession.  Sexist, racist, homophobic, they run the full gamut.  One person was brave enough to post on <a href="http://forums.asp.net/">forums.asp.net</a> &#8220;announcing&#8221; the podcast with his normal user account, but it got deleted as the podcast is quite inappropriate.  He had another post looking for contributors, but that whole thing is besides my point.  I won&#8217;t link to him to spare him additional Google hits to damage what remains of his credibility.  And I don&#8217;t want to necessarily talk about the podcast.</p>
<p>I want to talk about professionalism and your brand.</p>
<p>It is kind of ironic that the podcast talks about how you should always be professional in your code comments while producing what they did (think beyond just code comments).  In this day and age, the internet is pervasive and data is everywhere.  Google crawls <em>everything</em>, and it remembers <em>everything</em>.  The post looking for contributors talks about other podcasts being &#8220;careful about how they talk&#8221;.  When its online, it isn&#8217;t about being careful how you talk, or even being professional.  It is about managing your identity.</p>
<p>The days of &#8220;dress to impress&#8221; are over.  You are no longer judged just by how you physically present yourself, you are your Google results.  You could go into a job interview dressed to the T, well presented and the pillar of what they are looking for.  But its becoming more common where they&#8217;ll Google your name and finding out who you really are.</p>
<p>What you do online stays with your forever.  You don&#8217;t need to be prim and proper by any means.  Just use common sense.  You are managing your brand.  What your coworkers see, your family, your future employers.  You can be bold and opinionated, you can still speak your mind, but do it intelligently.  Something like that single podcast can ignite a fire of comments and posts, links, name mentions, and then when someone Google&#8217;s your name, they&#8217;ll find your drunk rants  And it can be hard to manage your brand once it has taken off like that.</p>
<p>A while ago, I&#8217;d found this presentation through Twitter about &#8220;Evangelizing Yourself&#8221; by <a href="http://whitneyhess.com/blog/">Whitney Hess</a>.  It is chalked full of wisdom.  <a href="http://www.slideshare.net/whitneyhess/evangelizing-yourself-1184852">Listen to it</a> (the play button has the audio, I missed that at first).  It is all about what I&#8217;m trying to say and says it much better.</p>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/02/05/being-professional-and-managing-your-identity/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Named many-to-many relationships in DataMapper</title>
		<link>http://invalidlogic.com/2010/01/27/named-many-to-many-relationships-in-datamapper/</link>
		<comments>http://invalidlogic.com/2010/01/27/named-many-to-many-relationships-in-datamapper/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 01:59:59 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[datamapper]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[trunks]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=440</guid>
		<description><![CDATA[When implementing the collaborators feature in Trunks, ran into a bit of a roadblock with how to describe the relationships between the repository and the users.
Trunks is built on Merb and DataMapper, and the implementation involved two models: a User and a Project.  In Trunks, a repository is a Project because &#8220;repository&#8221; is a reserved [...]]]></description>
			<content:encoded><![CDATA[<p>When implementing the collaborators feature in <a href="http://trunksapp.com/">Trunks</a>, ran into a bit of a roadblock with how to describe the relationships between the repository and the users.</p>
<p>Trunks is built on <a href="http://merbivore.org/">Merb</a> and <a href="http://datamapper.org/">DataMapper</a>, and the implementation involved two models: a User and a Project.  In Trunks, a repository is a Project because &#8220;repository&#8221; is a reserved attribute in DataMapper and I was running into issues early on, so I changed it to Project.</p>
<p>A project belongs to a user, and a user has many projects.  A user can also be a collaborator on many projects, and a project can have many collaborators.  So I already had the first relationship which was a simple 1-to-many relationship.  The problem came about with adding collaborators.  In a sense, it is a normal many-to-many, which you can do in DataMapper similar to how you would in ActiveRecord using a &#8220;has_many &#8230;, :through =&gt; &#8230;&#8221; relationship, but I was creating a relationship between models that had an existing and separate relationship.</p>
<p>I didn&#8217;t want the user.projects collection to return the projects a user collaborated on, because it was intended to only be the user&#8217;s own projects.  And similarly, a project only has one owner, not many.</p>
<p>I essentially found I needed a &#8220;has many through&#8221; with named attributes.  To do this, I had to actually create the proxy class that goes between the user and the project model, rather than let DataMapper create it automatically.  That way, I can control the attribute names on the proxy class so that &#8220;users&#8221; and &#8220;projects&#8221; on the two models won&#8217;t get munged.</p>
<p>The result looked like this:</p>
<pre class="brush: ruby;">class User
  include DataMapper::Resource
  ...
  has n, :collaborations
  has n, :collab_projects, :model =&gt; 'Project', :child_key =&gt; [:id], :parent_key =&gt; [:user_id], :through =&gt; :collaborations
end

class Project
  include DataMapper::Resource
  ...
  has n, :collaborations
  has n, :collab_users, :model =&gt; 'User', :child_key =&gt; [:id], :parent_key =&gt; [:project_id], :through =&gt; :collaborations
end

class Collaboration
  include DataMapper::Resource

  property :id, Serial

  belongs_to :collab_user, :model =&gt; 'User', :child_key =&gt; [:user_id]
  belongs_to :collab_project, :model =&gt; 'Project', :child_key =&gt; [:project_id]
end</pre>
<p>Having a &#8220;collab_users&#8221; on the Collaboration class allowed me to have the project model to get an attribute name &#8220;collab_users&#8221; instead of trying to use &#8220;users&#8221;.  And on user, I could have &#8220;collab_projects&#8221; instead of mixing things up with the existing &#8220;projects&#8221; attribute.</p>
<p>When creating the relationships though, I had to be careful to spell out the actual parent and child fields rather than let them be automatic, otherwise it&#8217;ll run into issues where it&#8217;ll try to create &#8216;collab_user_id&#8217; and &#8216;collab_project_id&#8217; and inserts will fail because those columns aren&#8217;t being set.</p>
<p>Take the relationship definition on the user model:</p>
<pre class="brush: ruby; light: true;">	has n, :collab_projects, :model =&gt; 'Project', :child_key =&gt; [:id], :parent_key =&gt; [:user_id], :through =&gt; :collaborations</pre>
<p>I am essentially saying create an attribute named &#8216;collab_projects&#8217; through the &#8216;collaborations&#8217; relationship.  &#8216;collab_projects&#8217; will be of type Project.  The child key on Collaboration is &#8216;user_id&#8217; and the primary key on User is &#8216;id&#8217;.  Here, the fields I specify are betwen User and Collaboration, not on Project.</p>
<p>Then on Collaboration, I have:</p>
<pre class="brush: ruby; light: true;">	belongs_to :collab_user, :model =&gt; 'User', :child_key =&gt; [:user_id]</pre>
<p>Here I tell it that the attribute on Collaboration will be collab_user, but the model it is linking to is User.  Basically saying I belong to user, but don&#8217;t create an attribute named &#8216;user&#8217;.  I set the child key, which is the column on Collaboration, to be &#8216;user_id&#8217;.  I want to do that else it will try to create it as &#8216;collab_user_id&#8217;.</p>
<p>Confused enough?  All boils down to having two separate relationships between two models and having control over what the attributes are named.  After all this, I end up with these calls:</p>
<pre class="brush: ruby; light: true;">  user.projects        # the user's own projects
  user.collab_projects # the projects the user is a collaborator on

  project.user         # the owner of the project
  project.collab_users # the users who are collaborators on the project</pre>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/01/27/named-many-to-many-relationships-in-datamapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrated to Wordpress</title>
		<link>http://invalidlogic.com/2010/01/27/migrated-to-wordpress/</link>
		<comments>http://invalidlogic.com/2010/01/27/migrated-to-wordpress/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 17:08:56 +0000</pubDate>
		<dc:creator>krobertson</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://invalidlogic.com/?p=437</guid>
		<description><![CDATA[Last night, I managed to migrate my blog from Graffiti CMS to Wordpress.  I&#8217;d been planning on migrating for a while now, but was just a matter of finally deciding to sit down and do it.
Now, why did I migrate?  I know a few months ago, I caught some slack on Twitter for stating that [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, I managed to migrate my blog from <a href="http://graffiticms.com/">Graffiti CMS</a> to <a href="http://wordpress.org/">Wordpress</a>.  I&#8217;d been planning on migrating for a while now, but was just a matter of finally deciding to sit down and do it.</p>
<p>Now, why did I migrate?  I know a few months ago, I caught some slack on Twitter for stating that I didn&#8217;t see what all the drama of Graffiti was (this was pre-open sourcing).  And I still agree.  Graffiti is a great tool, I liked it and enjoyed it, however I ended up deciding to migrate for a few reasons.  Most notably is the plugin availability/community.  Wordpress has tons of plugins for different tasks, and Graffiti simply doesn&#8217;t compare.  The developer in me may say &#8220;hey, I can write my own&#8221; but the reality is that I don&#8217;t have the time to or really want to.  I wanted a drop dead easy way to include code in posts and didn&#8217;t want to fiddle with it.  I wanted easier media management, and didn&#8217;t want to come up with something new on my own.</p>
<p>I had tossed around the idea of writing my own blog, since I wanted it off of my servers, but other services like <a href="http://tumblr.com">Tumblr</a> didn&#8217;t have <em>quite</em> what I wanted.  I thought it&#8217;d be nice to write a simple one in <a href="http://sinatrarb.com/">Sinatra</a> and use <a href="http://mongodb.org/">MongoDB</a> (via <a href="http://mongohq.com/">MongoHQ</a>), but it again came back to prioritizing my different projects, and I&#8217;ve called <a href="http://invalidlogic.com/2008/12/22/blogging-apps-are-the-new-hello-world/">blogging apps the new Hello World</a>.</p>
<p>In the move, I also wanted to bring over all the content from my original blog, qgyen.net.  Now I have basically merged the two blogs and everything from my original domain redirects here.  Gain more Google juice, and sadly, my old dead domain had <em>still</em> more subscribers than my new domain.  Yes, sad.</p>
<p>How was the process?  Not too bad.  For a good guide, I&#8217;d recommend <a href="http://jeftek.com/520/migrating-blog-from-graffiticms-to-wordpress/">Jef&#8217;s post</a>.  I made a few changes through:</p>
<ol>
<li>I used the original VB.NET version of the GraffitiToBlogML tool (<a href="http://darkfalz.com/post/2009/04/14/Graffiti-To-BlogML-Exporter.aspx">link</a>).  I simply found it before the C# port.</li>
<li>Both the VB.NET and C# version have the potential of producing invalid XML.  They basically just write out XML directly rather than use the XML libraries within .NET.  One place it broke for me is they produce the old post uri by basically taking the post title and replacing spaces with dashes, it doesn&#8217;t strip invalid characters.  I had some posts with quotations in the title (&#8220;).  This broke the XML.  I changed it to use category.LinkName and post.Name, since those are the url-able portions used directly by Graffiti itself.  I also had it not append .aspx, since Graffiti didn&#8217;t actually do that.</li>
<li>BlogML seems to treat the post&#8217;s creation date as when it was published.  This can be an issue if you had migrated from to Graffiti from something else, like Community Server.  I had 300 or so posts who up in December 2007 at first.  The migrated data had a creation date of December 2007, but Graffiti had a separate Published field that marked when it was published.  I changed the tool to handle that so I could migrate my data right.</li>
<li>At least in the VB version, it was missing some null checks, I ran into one with TagList being null instead of empty.</li>
<li>I imported using the BlogML importer rather than MoveableType one.  For a really simple walk through, see <a href="http://www.kjctech.net/2010/01/06/how-to-import-blogml-file-to-wordpress/">this guide</a>.</li>
</ol>
<p>I will definitely miss Graffiti, since it was so drop dead simple to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://invalidlogic.com/2010/01/27/migrated-to-wordpress/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.398 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-03-12 07:32:26 -->
<!-- Compression = gzip -->