<?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/"
	>

<channel>
	<title>Halogen Labs</title>
	<atom:link href="http://weblog.halogenlabs.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.halogenlabs.com</link>
	<description></description>
	<pubDate>Mon, 06 Apr 2009 00:47:04 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kill your admin interface</title>
		<link>http://weblog.halogenlabs.com/posts/kill-your-admin-interface/</link>
		<comments>http://weblog.halogenlabs.com/posts/kill-your-admin-interface/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 00:42:34 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/?p=596</guid>
		<description><![CDATA[It starts out simple enough. You&#8217;re building a webapp, and you want people with a certain role (read: Administrator) to have access to a separate &#8220;back-end&#8221; part of the system.  They have to do different stuff, so it makes sense to make a separate administrator interface. A classic example of this is something like [...]]]></description>
			<content:encoded><![CDATA[<p>It starts out simple enough. You&#8217;re building a webapp, and you want people with a certain role (read: Administrator) to have access to a separate &#8220;back-end&#8221; part of the system.  They have to do different stuff, so it makes sense to make a separate administrator interface. A classic example of this is something like WordPress, where you have a totally different area of the website to sign into, and you have a myriad of different tasks you can perform.</p>
<p>At first, it seems to make sense &#8212; administrators have various goals they want to accomplish, like mass-approving comments or creating a draft of an article.  The part of a blog that faces the reader is usually geared towards reading content, not making changes to it.</p>
<p>Lately, I&#8217;ve been thinking about something that I remember hearing a while back from Edward Tufte.  The phrase is &#8220;administrative debris,&#8221; and <a href="http://tomayko.com/writings/administrative-debris">Ryan Tomayko wrote about it a year ago.</a></p>
<p>Anyway, I&#8217;ve had the itch to finally write my own blogging app for personal use, and I&#8217;m following some of the ideas that Ryan writes about &#8212; things like using in-place editing, and making content look identical between reading/editing.</p>
<p>The nice thing about having your content be your interface is that it&#8217;s a lot quicker to make changes.  Because it&#8217;s less painful, I&#8217;ll be more likely to write.</p>
<ul>
<li>I don&#8217;t have to remember the secret admin URL.</li>
<li>When I&#8217;m logged in, I don&#8217;t have to parse a cluttered admin interface.</li>
</ul>
<p>I&#8217;ll post more thoughts about design of the project when I get closer to actually having it live.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/kill-your-admin-interface/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Be careful with ranges (Ruby)</title>
		<link>http://weblog.halogenlabs.com/posts/be-careful-with-ranges-ruby/</link>
		<comments>http://weblog.halogenlabs.com/posts/be-careful-with-ranges-ruby/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 19:46:54 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/?p=591</guid>
		<description><![CDATA[I recently installed the wonderful test_benchmark plugin for Rails, and ran it against our code.  I was surprised to find that we had a couple unit tests that were taking 4 seconds to complete.
Digging in, I found code that was doing the following on a time range:

range = # .. a time range 24 [...]]]></description>
			<content:encoded><![CDATA[<p>I recently installed the wonderful test_benchmark plugin for Rails, and ran it against our code.  I was surprised to find that we had a couple unit tests that were taking 4 seconds to complete.</p>
<p>Digging in, I found code that was doing the following on a time range:</p>
<p><code><br />
range = # .. a time range 24 hours "wide"<br />
start_time = range.min<br />
end_time = range.max<br />
</code></p>
<p>I looked up the API for Range, and there are no .min and .max methods defined, but they live in enumerable.  So what&#8217;s going on here?</p>
<p>A little more digging:</p>
<p><code><br />
>> count = 0; r.max { |a,b| count +=1; a <=> b }<br />
=> Fri Apr 03 20:07:29 UTC 2009<br />
>> count<br />
=> 88200<br />
</code></p>
<p>Oops.  88,200 comparisons for a time range.  Switching the code in the test and the class under test to use .first() and .last() instead of .min() and .max(), and I shaved off a cool 8 seconds from <code>rake test</code></p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/be-careful-with-ranges-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Is TextMate Dead? (Update: nope!)</title>
		<link>http://weblog.halogenlabs.com/posts/is-textmate-dead/</link>
		<comments>http://weblog.halogenlabs.com/posts/is-textmate-dead/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 15:24:51 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/?p=585</guid>
		<description><![CDATA[Is our beloved Mac text editor, TextMate, dead? The TM Blog hasn&#8217;t updated since the middle of August, 2008:

The latest cutting-edge version is 1.5.8, r1498, and it&#8217;s been a while since that&#8217;s updated, too.
Has TextMate died, or has it just reached a maturity level where it doesn&#8217;t need updates and new features as often?  [...]]]></description>
			<content:encoded><![CDATA[<p>Is our beloved Mac text editor, <a href="http://macromates.com/">TextMate</a>, dead? The TM Blog hasn&#8217;t updated since the middle of August, 2008:</p>
<p><img src="http://img.skitch.com/20090402-8h33wdejqtf4nptjgrpruhyrqu.png" alt="TextMate Blog"/></p>
<p>The latest cutting-edge version is 1.5.8, r1498, and it&#8217;s been a while since that&#8217;s updated, too.</p>
<p>Has TextMate died, or has it just reached a maturity level where it doesn&#8217;t need updates and new features as often?  Whatever happened to the fabled TextMate 2.0?  Last I read about 2.0 was <a href="http://blog.macromates.com/2006/20-will-require-leopard/">back in 2006</a> when Alan mentioned 2.0 would require Leopard.  Not even a peep about 2.0.  </p>
<p>What&#8217;s going on?</p>
<p>Edit: I found a <a href="http://wiki.macromates.com/FAQ/TextMate2">TextMate 2.0 FAQ</a>, which indicates that TM2 was actively being developed, at least towards the end of November 2008.  Hopefully we&#8217;ll see something in 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/is-textmate-dead/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Account Sign-In Patterns</title>
		<link>http://weblog.halogenlabs.com/posts/account-sign-in-patterns/</link>
		<comments>http://weblog.halogenlabs.com/posts/account-sign-in-patterns/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 23:59:33 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/account-sign-in-patterns/</guid>
		<description><![CDATA[The Wheres and Whens of User Expectations is a good article by UIE that talks about user expectations for account sign-in links and fields:

As we watched users, it seemed they first looked for two text-entry boxes of equal size. Their eyes would scan the page (often with the mouse cursor in tow) searching for the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.uie.com/articles/user_expectations">The Wheres and Whens of User Expectations</a> is a good article by UIE that talks about user expectations for account sign-in links and fields:</p>
<blockquote><p>
As we watched users, it seemed they first looked for two text-entry boxes of equal size. Their eyes would scan the page (often with the mouse cursor in tow) searching for the two entry fields.</p>
<p>Sites that had two text-entry boxes, often contained in a larger box with a distinct background and border, would quickly acquire the user&#8217;s attention. They&#8217;d type their username into the first box and their password into the second.</p>
<p>This pattern is so strong that we see it work even on sites that don&#8217;t follow the pattern. Over at Etrade.com, the online trading and banking site, their design has two pairs of dual text-entry boxes. One pair is the standard login field, but a more prominent pair is for stock quotes and the site&#8217;s search functions. </p>
<p>Because of the strong drive of the user to react to this pattern, it&#8217;s common to see users type their username and password into the stock and search buttons, completely missing the proper sign-in fields. From this, we can see designers need be careful when placing pairs of text fields that users don&#8217;t confuse them for the sign-in boxes.</p>
<h4>The Sign-In Link Pattern</h4>
<p>If users don&#8217;t see two boxes, they then start scanning for a link called Sign-in or Log-in. (We haven&#8217;t seen anyone who uses a button for this, but it&#8217;s also an option. However, we&#8217;d wonder if a button would create cognitive dissonance if it appeared without corresponding fields.)</p>
<p>A pattern that worked well in our research was, once logged in, to replace the sign-in link with the user&#8217;s name, id, or email address, followed by a sign-out link. Users showed they understood the semantics and reassured them that the system had recognized their account information.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/account-sign-in-patterns/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blog in flux</title>
		<link>http://weblog.halogenlabs.com/posts/blog-in-flux/</link>
		<comments>http://weblog.halogenlabs.com/posts/blog-in-flux/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 17:20:05 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/blog-in-flux/</guid>
		<description><![CDATA[Just futzing with the layout of the site.   Not that anybody reads this thing anymore :)
]]></description>
			<content:encoded><![CDATA[<p>Just futzing with the layout of the site.   Not that anybody reads this thing anymore :)</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/blog-in-flux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Whatup, blog readers</title>
		<link>http://weblog.halogenlabs.com/posts/whatup-blog-readers/</link>
		<comments>http://weblog.halogenlabs.com/posts/whatup-blog-readers/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 02:05:01 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/whatup-blog-readers/</guid>
		<description><![CDATA[Not a lot going on.  I had a very busy spring.  The house almost burned down.  Summer was busy too, as well as fall.  Hopefully I can relax this winter :)
Scope me on Twitter.
More later.
]]></description>
			<content:encoded><![CDATA[<p>Not a lot going on.  I had a very busy spring.  The house almost burned down.  Summer was busy too, as well as fall.  Hopefully I can relax this winter :)</p>
<p>Scope me on <a href="http://twitter.com/tcollen">Twitter</a>.</p>
<p>More later.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/whatup-blog-readers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fight the Smears</title>
		<link>http://weblog.halogenlabs.com/posts/fight-the-smears/</link>
		<comments>http://weblog.halogenlabs.com/posts/fight-the-smears/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 00:03:26 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/fight-the-smears/</guid>
		<description><![CDATA[I tend to not blog about political crap, but I need to link this:
Fight the Smears is a site (which actually redirects) run by the Barack Obama campaign designed to, well, Fight the Smears about Obama that commonly get passed around as viral e-mails.  You know the crap, those messages that claim that Obama [...]]]></description>
			<content:encoded><![CDATA[<p>I tend to not blog about political crap, but I need to link this:</p>
<p><a href="http://fightthesmears.com/">Fight the Smears</a> is a site (which actually redirects) run by the <a href="http://www.barackobama.com/">Barack Obama campaign</a> designed to, well, <a href="http://fightthesmears.com/">Fight the Smears</a> about Obama that commonly get passed around as viral e-mails.  You know the crap, those messages that claim that <a href="http://my.barackobama.com/page/invite/christian">Obama is a Muslim</a> or that he was sworn in on the Koran.</p>
<p>The site is quite genius, to think about it.  Not only do they take a <a href="http://snopes.com/">Snopes</a>-style method of debunking myths, they also make it extremely easy to plug in people&#8217;s email addresses with a short and to-the-point message regarding that particular issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/fight-the-smears/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Thoughts on Continuous Integration and Rails</title>
		<link>http://weblog.halogenlabs.com/posts/thoughts-on-continuous-integration-and-rails/</link>
		<comments>http://weblog.halogenlabs.com/posts/thoughts-on-continuous-integration-and-rails/#comments</comments>
		<pubDate>Fri, 30 May 2008 20:58:12 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/thoughts-on-continuous-integration-and-rails/</guid>
		<description><![CDATA[One of the first things I&#8217;ll do when working on a new project is to automate the build ASAP.  Starting a new job a couple weeks ago, I took the opportunity to get CruiseControl.rb up and running and getting the tests running reliably.
At my last job, we had automated the build by having CC.rb [...]]]></description>
			<content:encoded><![CDATA[<p>One of the first things I&#8217;ll do when working on a new project is to automate the build ASAP.  Starting a new job a couple weeks ago, I took the opportunity to get <a href="http://cruisecontrolrb.thoughtworks.com/">CruiseControl.rb</a> up and running and getting the tests running reliably.</p>
<p>At my last job, we had automated the build by having CC.rb run <code>rake db:migrate</code> followed by <code>rake test</code>.  This worked out fairly well, and we made it a practice to peer-review all migrations before committing them.</p>
<p>This technique had a few drawbacks, however.  One thing was that we were testing our migrations.  If someone committed a migration that broke, the build would fail.  Likewise, if someone committed a migration and then needed to change it later, we would have to manually roll back the database and re-migrate up, which was a pain in the butt.</p>
<p>Having the build run the migrations was nice, since other developers would be alerted to a potentially bad migration, but it ended up being more trouble than it was worth.</p>
<p>At my new job, there&#8217;s an established practice of using migrations to add static data to the database (which is the subject for another post).  Migrations are an easy way to do this, but you run into trouble if the data being added depends on other data in the database, or if the migration was bad.</p>
<p>I&#8217;m of the opinion that you should avoid hitting the database as much as possible during tests, and by running migrations during the build (especially ones that depend on static data in the database), you end up coupling yourself even more tightly to the database.</p>
<p>After thinking about it for a while, I&#8217;ve decided that the schema.rb file is, after all, the de facto source of the database schema (big DUH here). Therefore, each build should wipe the the test database clean of tables and then load the schema.rb file from the repository.</p>
<p>Our new rule here now is that if you check in a new migration, you must also check in the new schema.rb.</p>
<p>By doing this, we consider migrations a tool for communicating small changes to developers over time, and we have a reliable, repeatable way to load a fresh db schema into a new development environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/thoughts-on-continuous-integration-and-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google Analytics to the Rescue</title>
		<link>http://weblog.halogenlabs.com/posts/google-analytics-to-the-rescue/</link>
		<comments>http://weblog.halogenlabs.com/posts/google-analytics-to-the-rescue/#comments</comments>
		<pubDate>Tue, 27 May 2008 06:36:28 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/google-analytics-to-the-rescue/</guid>
		<description><![CDATA[Google Analytics can help you in a lot of interesting ways sometimes.   Recently I noticed my traffic had dropped to zero:

What does this mean?

Nobody&#8217;s visiting the site
Web server died
Google stopped indexing my site and stopped referring links to the site.
Sky is falling

I knew the first option wasn&#8217;t the case since I usually have [...]]]></description>
			<content:encoded><![CDATA[<p>Google Analytics can help you in a lot of interesting ways sometimes.   Recently I noticed my traffic had dropped to zero:</p>
<p><img src="/images/posts/analytics-oops.png" width="314" height="131" alt="whoops!" /></p>
<p>What does this mean?</p>
<ol>
<li>Nobody&#8217;s visiting the site</li>
<li>Web server died</li>
<li>Google stopped indexing my site and stopped referring links to the site.</li>
<li>Sky is falling</li>
</ol>
<p>I knew the first option wasn&#8217;t the case since I usually have a low level of &#8220;background radiation&#8221; traffic even when I&#8217;m not posting. I knew for a fact my web server was up.  I checked my robots.txt file and it was fine, so WTF?</p>
<p>Well, after checking my page source, realized I blew away my old Google Analytics code in the Wordpress Template, and the only thing that Google Analytics was reporting was the fact that I didn&#8217;t even have it installed!  </p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/google-analytics-to-the-rescue/feed/</wfw:commentRss>
		</item>
		<item>
		<title>9 tips for successful telecommuting</title>
		<link>http://weblog.halogenlabs.com/posts/9-tips-for-successful-telecommuting/</link>
		<comments>http://weblog.halogenlabs.com/posts/9-tips-for-successful-telecommuting/#comments</comments>
		<pubDate>Fri, 09 May 2008 17:05:54 +0000</pubDate>
		<dc:creator>Tony</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://weblog.halogenlabs.com/posts/x-tips-for-successful-telecommuting/</guid>
		<description><![CDATA[Two weeks ago this past Wednesday, I gave notice to my former employer that I had accepted a job from a local company as a Software Engineer.  It was a hard decision to make; just over eighteen months ago I had written about getting the job which basically amounted to a &#8220;dream job&#8221; situation. [...]]]></description>
			<content:encoded><![CDATA[<p>Two weeks ago this past Wednesday, I gave notice to my former employer that I had accepted a job from a local company as a Software Engineer.  It was a hard decision to make; just over eighteen months ago I had <a href="http://weblog.halogenlabs.com/posts/decloaking/">written about getting the job</a> which basically amounted to a &#8220;dream job&#8221; situation.  I was working with Rails, doing cool stuff with weather and mapping.  </p>
<p>The only catch was that it would be 100% telecommuting.</p>
<p>After eighteen months, I pretty much had it firmed up in my mind that telecommuting, and the lifestyle associated with it, wasn&#8217;t for me.  Before accepting the job, I had done a ton of research into what it would take.  Telecommuting isn&#8217;t for everybody, and when I would tell people that I telecommute, the usual response was something along the lines of, &#8220;Wow, that must be nice!&#8221;</p>
<p>It <em>was</em> nice, but the drawbacks didn&#8217;t really become apparent after the third month.</p>
<p>If you&#8217;re considering telecommuting, there are a lot of things to take into account, especially if it&#8217;s going to be 100% of the time.</p>
<h3>Keep work and personal space separate.</h3>
<p>This is probably the most important item here.  Dedicate a room to your home office.  Don&#8217;t share it with existing space if you can.  Keep work and personal space separate.  Resist the urge to be in the office space &#8220;after hours&#8221; if you&#8217;re doing casual web browsing, email-checking or whatever.</p>
<h3>You never really leave work.</h3>
<p>It&#8217;s too easy to walk into your home office after-hours and work.  Bored? You can sit down and work. </p>
<h3>You never really leave <em>home</em>.</h3>
<p>The flip side of this is that you&#8217;re always around the house.  Bored working? It&#8217;s almost too easy to go play some Guitar Hero or fire up the Wii.  You&#8217;ll have to be immensely disciplined to get work done.</p>
<h3>Don&#8217;t become a hermit.</h3>
<p>Socialize.  You&#8217;re around the house more, which means you don&#8217;t have a lot of people around to talk to.  Not long after I started telecommuting, I noticed a shift in my personality.  I&#8217;m already an introvert, but being isolated from people seemed to make it worse.  I generally felt more awkward around people, and it was harder to socialize and relate to people in general.  </p>
<h3>Be aware of time shifts.</h3>
<p>Because the home office was in Denver, I generally got started one hour later than if I were working locally.  This also meant that I worked an hour later as well.  Sometimes this would throw off things like eating dinner or going to bed.  This can obviously affect your family, so make sure they understand why you&#8217;re getting up late and staying up late if this happens.</p>
<h3>Get a separate phone line, and use it.</h3>
<p>If your home phone line (or cell phone) becomes your lifeline to the office, it&#8217;s even more important that your coworkers understand this setup.  They shouldn&#8217;t be calling you at home on Saturdays.  </p>
<p>One of my bigger challenges with telecommuting (especially as a software engineer) was that much of my communication with my coworkers and colleagues was over email or IM.  Looking back, I wish I had a separate, dedicated work line, and that I used it more.  It&#8217;s much, <em>much</em> easier to communicate complex thoughts and ideas over the phone, compared to email or chat.  Don&#8217;t be afraid to fire up the phone.</p>
<h3>Get a headset for your phone.</h3>
<p>We would have weekly engineering meetings, and status meetings with our client quite often.  Having a headset that I could plug into the phone was very useful, mostly because it kept my hands free for typing on the computer.</p>
<h3>Make your employer pay your bills.</h3>
<p>Ideally, your employer should be paying your landline or cellphone bills.  They should even be paying your cable or DSL bills.  After all, they are saving quite a bit of money by not having to maintain physical office space an other facilities for you.  I made the mistake of not getting my phone and ISP bills expensed, and wished I had gotten it taken care of from the start.</p>
<h3>Investigate the tax benefits of a home office.</h3>
<p>If you have a room dedicated to office space, I believe you can write off a percentage of your taxes based on what percentage of the house is being used.  I&#8217;m not a tax expert, but I highly recommend looking into writing off what you can.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.halogenlabs.com/posts/9-tips-for-successful-telecommuting/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
