<?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>Dave Smith's Blog</title>
	<atom:link href="http://thesmithfam.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://thesmithfam.org/blog</link>
	<description>Your blog is probably better than mine.</description>
	<lastBuildDate>Sun, 21 Jun 2009 23:49:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How long does it take to convert disk space to RAM?</title>
		<link>http://thesmithfam.org/blog/2009/06/21/how-long-does-it-take-to-convert-disk-space-to-ram/</link>
		<comments>http://thesmithfam.org/blog/2009/06/21/how-long-does-it-take-to-convert-disk-space-to-ram/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 23:48:13 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=277</guid>
		<description><![CDATA[About 12 years.
12 years ago I bought a new computer with 3GB of hard drive space (yes, just three). Today, the average new computer has about 3GB of RAM. It took 12 years to convert all that disk space to RAM.
If this pattern holds, then by the year 2021 we should have computers with about [...]]]></description>
			<content:encoded><![CDATA[<p>About <strong>12 years</strong>.</p>
<p>12 years ago I bought a new computer with 3GB of hard drive space (yes, just three). Today, the average new computer has about 3GB of <strong>RAM</strong>. It took 12 years to convert all that disk space to RAM.</p>
<p>If this pattern holds, then by the year <strong>2021 </strong>we should have computers with about <strong>500GB of RAM</strong>.</p>
<p>Awesome.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/06/21/how-long-does-it-take-to-convert-disk-space-to-ram/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More User Interface Critiques</title>
		<link>http://thesmithfam.org/blog/2009/06/14/more-user-interface-critiques/</link>
		<comments>http://thesmithfam.org/blog/2009/06/14/more-user-interface-critiques/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 05:23:38 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=272</guid>
		<description><![CDATA[Today in Windows XP, I double clicked on a scanner icon under &#8220;My Computer&#8221; after installing a new scanner. Here&#8217;s the dialog that popped up:

A few gripes worth considering:

The phrase &#8220;Microsoft Word&#8221; is mentioned 4 times.
3 out of 4 of my options have repeated text (once in black, and again in gray,  in case [...]]]></description>
			<content:encoded><![CDATA[<p>Today in Windows XP, I double clicked on a scanner icon under &#8220;My Computer&#8221; after installing a new scanner. Here&#8217;s the dialog that popped up:</p>
<p><img src="/images/microsoft-office-repetition.png" /></p>
<p>A few gripes worth considering:</p>
<ul>
<li>The phrase &#8220;Microsoft Word&#8221; is mentioned 4 times.</li>
<li>3 out of 4 of my options have repeated text (once in black, and again in gray,  in case you prefer gray text over black text)</li>
<li>The entire serial number  of the scanner is shown in the dialog. I&#8217;m sure this was done to guarantee uniqueness, but what a pain for the user, eh?</li>
<li>What does the phrase &#8220;initiate a new scan&#8221; mean? Sounds like programmer speak.</li>
<li>What is the difference between the &#8220;Microsoft Word&#8221; with a document icon and the &#8220;Microsoft Word&#8221; with a camera icon?</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/06/14/more-user-interface-critiques/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Desktop: How many more years?</title>
		<link>http://thesmithfam.org/blog/2009/06/09/linux-desktop-how-many-more-years/</link>
		<comments>http://thesmithfam.org/blog/2009/06/09/linux-desktop-how-many-more-years/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 06:28:41 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=239</guid>
		<description><![CDATA[How many more years am I going to have to wait before I get a Linux desktop that doesn&#8217;t look like it was cobbled together?
Before I rant about the Fedora 11 user interface, I have to say that I am a huge fan of Linux. I write code for Linux all day at work (both [...]]]></description>
			<content:encoded><![CDATA[<p>How many more years am I going to have to wait before I get a Linux desktop that doesn&#8217;t look like it was cobbled together?</p>
<p>Before I rant about the Fedora 11 user interface, I have to say that I am a <b>huge</b> fan of Linux. I write code for Linux all day at work (both user interface and back-end code), and I love it. Linux is great. However, the Linux desktop has not kept up with the quality of its back-end counterpart, and I want to talk about it today. Thanks for reading.</p>
<p>I installed Fedora 11 today, the latest and greatest that the Linux community has to offer. I opted to use the KDE version just for fun. Here&#8217;s what I got:</p>
<h2>Random Fonts</h2>
<p>When I logged in for the first time, my fonts were too large, so I opened the &#8220;System Settings&#8221; (by the way, that name is way too scary for lay users) and navigated to the fonts section. This is what I saw:</p>
<p><img src="/images/fedora-11-snapshot7.png" alt="Font Settings in Fedora 11" /></p>
<p>First of all, I have to change the font size 8 times. Why? Because I don&#8217;t know what  each of those 8 settings means, and I want to make sure I get them all. Why do I have a &#8220;Menu&#8221;, a &#8220;Toolbar&#8221;, and a &#8220;Small&#8221; font? If you&#8217;re going to give this much fine grained control, you have to at least show screenshots of where each of these fonts shows up on the screen. Your average user does not know the difference between a &#8220;Menu&#8221; and a &#8220;Toolbar&#8221;.</p>
<p>Secondly, this font preferences screen has at least 4 different fonts on it that I can see. How&#8217;s that for ironic?</p>
<h2>Awful System Settings</h2>
<p>KDE seems to be trying to emulate Mac OS X and Windows Vista <b>at the same time</b>, but failing to emulate either of them very well. Compare this screenshot from the Mac OS X system preferences and the equivalent KDE attempt.</p>
<p>Mac OS X (clean, efficient, polished)<br />
<img src="/images/mac-snapshot1.png" alt="Mac OS X Settings" /></p>
<p>KDE (sloppy, inefficient, unappealing):<br />
<img src="/images/fedora-11-snapshot6.png" alt="KDE Settings" /></p>
<p>Notice how the Mac OS X preferences screen manages to fit twice as many icons in the same amount of screen real estate, and yet, somehow the items are easier to read? That&#8217;s because the Mac uses <b>word wrapping</b> for long item names. Focus on this item from the KDE System Settings:</p>
<p><img style="border: 1px solid gray" src="/images/fedora-11-snapshot8.png" alt="Word wrapping?" /></p>
<p>Why would you not word wrap that text? Not word wrapping that text forces all the other icons in this column to be disproportionately wide. This causes the screen to both waste space and make each column width irregular.</p>
<p>Also take a look at the sheer <b>quantity</b> of lines on the KDE System Settings screen. Lines are the enemy. They make the user interface complicated by adding more information that your brain must (subconsciously) process. The KDE System Settings has a perimeter of <b>3</b> lines. The Mac OS X System Preferences has <b>1</b>.</p>
<p>Lasty, notice what happens when I click on &#8220;Appearance&#8221;. The screen morphs into a totally different kind of user interface. It went from a grid-shaped navigation pane to a left-hand navigation bar:</p>
<p><img src="/images/fedora-11-snapshot10.png" alt="KDE Sub-Settings" /></p>
<p>The change in navigation is startling. It looks like the KDE team took a stand-alone form and crammed it into this one. In fact, I&#8217;m sure that&#8217;s what they&#8217;ve done. That&#8217;s pretty cool from a programmer&#8217;s perspective, but it makes for inconsistent UI.</p>
<h2>Right (or was it left) Clicking</h2>
<p>Consistency is crucial to an easy-to-use interface, especially when it comes to user input like mouse clicking. When I logged into my new Fedora 11 desktop, I noticed a tray icon in the lower left that looked like two networked computers. I right-clicked on it so I could try to turn on my wireless networking, and this is what I got:</p>
<p><img src="/images/fedora-11-snapshot3.png" alt="Right click" /></p>
<p>I can&#8217;t tell what I&#8217;m supposed to do here. I right-clicked. I got a context menu, which is usual and customary for right-clicking. But nowhere do I see a place to choose my wireless network. I tried turning off the wireless networking, and turning it back on. That didn&#8217;t help.</p>
<p>Finally I tried a <b>left</b> click, and I got a <b>different</b> context menu (big no no):</p>
<p><img src="/images/fedora-11-snapshot2.png" alt="Left click" /></p>
<p>It appears now that KDE has adopted a paradigm of providing <b>two different context menus</b> depending on which mouse button you click. In my view, these two context menus should be merged into a single context menu that appears when you right click. Look how Mac OS X does it. You can right click or left click and you get the same <b>all-in-one context menu</b>:</p>
<p><img src="/images/mac-snapshot2.png" alt="Right or left click" /></p>
<p>This seems so obvious and easy to get right, and it&#8217;s crucial because this isn&#8217;t the kind of feature that users will use every day. The less frequently used stuff needs to be the most obvious.</p>
<h2>Suspend Still Does Not Work</h2>
<p>As I was writing this post (on my Mac), my Fedora 11 laptop went to sleep and suspended. It made two ding-dong sounds before it did so. When I pressed the power button to wake it back up, I was greeted by lots of spinning fan sounds, a blinking WiFi light, and a blank screen. I had to power off the laptop to bring back a login screen.</p>
<p>I have been using Linux for 8 years, and only one distribution ever provided me a working suspend feature: Red Hat 7.3. Yes, the free Red Hat, back before Fedora existed. In the mean time, I&#8217;ve used Windows 95, 98, 2000, XP, and Vista, and every single one of them has provided a functioning suspend feature, and I&#8217;m no fan of Windows.</p>
<h2>Logout</h2>
<p>When I click the &#8220;F&#8221; menu, and then click on the &#8220;Leave&#8221; tab, the menu morphs into a list of &#8220;Leave&#8221;-like options, like shut down, restart, and logout. If I click &#8220;Restart&#8221;, I get a picture of a stretched-out moon with some text crammed next to it that says &#8220;Restart Computer&#8221;. This text doesn&#8217;t <b>look</b> like a button. It doesn&#8217;t <b>act</b> like a button when I  hover on it. But guess what, <b>it&#8217;s a button</b>. KDE wants me to click on that button-like thing to confirm that I really want to shut down the computer. Here&#8217;s what it looks like:</p>
<p><img src="/images/fedora-11-snapshot9.png" alt="Restart Confirm" /></p>
<p>When you want the user to click on a button, it needs to look and act like a button, even if you&#8217;re trying to do fancy graphics.</p>
<p>While I&#8217;m on the restart confirmation box, why is it so small? You have a huge screen. Spread out a bit. Get a little breathing room. Put about 50 pixels between each widget in that box, and give it about 100 pixels of padding around its perimeter.</p>
<p>Oh, and fix that moon. It looks like it got sat upon. <img src='http://thesmithfam.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Chopped Text</h2>
<p>I think this dialog speaks for itself:</p>
<p><img src="/images/fedora-11-snapshot5.png" alt="Chopperoo" /></p>
<p>This was one of several dialogs that I could not read fully due to chopped text.</p>
<h2>Icon Size Inconsistency</h2>
<p>Icon sizes are not consistent with other icons, nor are they consistent with input elements, like the little &#8220;plus&#8221; signs in tree views. Take this example:</p>
<p><img src="/images/fedora-11-snapshot11.png" alt="Plus signs" /></p>
<p>Notice how the picture of the bug is about 20 times bigger than the &#8220;plus&#8221; sign to the left of it? In my opinion, this should not be a tree view at all, but rather a nice flat list with header text between the categories. Keep it simple. Perhaps just show the quantities, and then provide a &#8220;Show details&#8221; button.</p>
<p>Notice also the two different styles of buttons along the bottom of the form? The bottom row uses fixed width buttons, while the next row up uses super-wide-fill-the-screen buttons. Additionally, as near as I can tell, the lower row of buttons (&#8221;OK&#8221;, &#8220;Apply&#8221;, and &#8220;Cancel&#8221;) are not actually useful. I can get what I want without them. So not only are they inconsistent, they are also superfluous.</p>
<h2>So What Do You Actually Like?</h2>
<p>I do like the twirly ribbon thing that appears while you are logging in to KDE. That thing is pretty cool. Smoothly animated, and yet it gives you actual progress while KDE is starting up. It is oddly engaging. I can&#8217;t take my eyes off it.</p>
<p>I like the new default desktop wallpaper (though I liked the Fedora 10 solar flare better).</p>
<h2>Conclusion</h2>
<p>In conclusion, I think that the KDE desktop as packaged by Fedora 11 needs a good, long walkthrough with a fine-toothed comb by a team of user interface experts. I encountered all the inconsistencies noted in this article within the first 15 minutes of using Fedora 11, and I&#8217;m sure a focused team could find dozens more. If they&#8217;re fixed, I think Fedora 11 and KDE show great promise for the future.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/06/09/linux-desktop-how-many-more-years/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>If I had more time, I would have written less</title>
		<link>http://thesmithfam.org/blog/2009/05/22/if-i-had-more-time-i-would-have-written-less/</link>
		<comments>http://thesmithfam.org/blog/2009/05/22/if-i-had-more-time-i-would-have-written-less/#comments</comments>
		<pubDate>Fri, 22 May 2009 13:32:55 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=226</guid>
		<description><![CDATA[The prolific Mark Twain wasn&#8217;t talking about computer programmers, but he could have been.
There are a lot of differences between excellent computer programmers and your average, run-of-the-mill hackers. But there&#8217;s one major difference, and it&#8217;s subtle but critical. And, in my experience, it doesn&#8217;t have anything to do with age or tenure.
Great programmers can accomplish [...]]]></description>
			<content:encoded><![CDATA[<p>The prolific Mark Twain wasn&#8217;t talking about computer programmers, but he could have been.</p>
<p>There are a lot of differences between excellent computer programmers and your average, run-of-the-mill hackers. But there&#8217;s one major difference, and it&#8217;s subtle but critical. And, in my experience, it doesn&#8217;t have anything to do with age or tenure.</p>
<p>Great programmers can accomplish the same thing as run-of-the-mill hackers with a lot less code and a lot less complexity. I&#8217;m not talking about the kind of code you write for the <a href="http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest">IOCCC contest</a> or <a href="http://en.wikipedia.org/wiki/Perl_Golf_Apocalypse">Perl golf</a>. I&#8217;m talking about simple, readable, minimal code that gets the job done.</p>
<p><b>It&#8217;s story time</b></p>
<p>A couple years ago, I was sitting in a room with some great programmers. (By the way, one of the great things about working at AST is that you often find yourself sitting in a room with great programmers.) Management had asked them to solve an engineering problem. The problem seemed hopelessly complicated, and most of our engineering team had put it on the back burner because it was so unapproachable. Finally management forced the problem on us, and we all sat down in a conference room and brainstormed solutions. Ideas slowly began to emerge. After 30 minutes, the engineers had produced lots of complex ideas to solve the problem: client/server approaches, database-driven approaches, roll-your-own-Linux-distro approaches, and so on. All the ideas scared us. At that point, a light turned on. Ideas started getting simpler, and simpler, and by the end of the meeting we had whittled the solution down to something more elegant, a simple Python script that <a href="http://theclarkfamily.name/blog/">Byron</a> hacked out in a couple hours.</p>
<p>The point of the story is this: Great programmers produce simple solutions.</p>
<p>The converse of this point is that bad programmers produce huge, complicated, and expensive solutions.</p>
<p>It&#8217;s time for another story.</p>
<p>To protect the guilty, I won&#8217;t share any specifics. I&#8217;ve heard tell of a team that had produced a piece of software over the course of a few years. The software had, as usual, grown to be quite complex, and the engineering team had grown to a dozen people. The software was deployed at a few customer sites, and was reasonably successful. I talked to some of the users, and every time the story was the same: &#8220;This software is so complicated&#8221;. The users weren&#8217;t judgmental. I think they just assumed that the problem was hard to solve, so the software was hard to use, and equally hard to write. One of the most complicated parts of the software was its installation procedure. It required the user to run several scripts in a custom csh environment. The user had to become an expert in a lot of areas unrelated to the problem domain.  Customers approached the team and asked them to package the software in a standard installer format for Linux. The engineers dutifully estimated how much this would cost, and came back with an estimate of nearly &#8230; are you sitting down? &#8230; <b>a half million dollars</b>. Why so expensive you may ask? Their software had grown so complex and so hard to maintain, that a simple change like this would cost hundreds of thousands of dollars. Customers agreed (great customers, eh?), and the team went to work. After a few months, the job was so badly done, that the installer wasn&#8217;t &#8220;standard&#8221; at all, and it totally failed.</p>
<p>Why does this happen?</p>
<p>I don&#8217;t know for sure, but I think <a href="/blog/2009/05/05/design-patterns-easy-to-write-hard-to-recognize/">this blog post</a> might give a hint.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/05/22/if-i-had-more-time-i-would-have-written-less/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Patterns: Easy to Write, Hard to Recognize</title>
		<link>http://thesmithfam.org/blog/2009/05/05/design-patterns-easy-to-write-hard-to-recognize/</link>
		<comments>http://thesmithfam.org/blog/2009/05/05/design-patterns-easy-to-write-hard-to-recognize/#comments</comments>
		<pubDate>Wed, 06 May 2009 01:35:28 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=212</guid>
		<description><![CDATA[Have you made this classic programming mistake? You&#8217;re 2,000 lines into developing this awesome framework that is going to make your team&#8217;s life so much easier when you realize that you&#8217;ve just done it:
You just reinvented the wheel.
This happens because you are a programmer, and therefore you are lazy. You love to write code, but [...]]]></description>
			<content:encoded><![CDATA[<p>Have you made this classic programming mistake? You&#8217;re 2,000 lines into developing this awesome framework that is going to make your team&#8217;s life so much easier when you realize that you&#8217;ve just done it:</p>
<p><strong>You just reinvented the wheel.</strong></p>
<p>This happens because you are a programmer, and therefore you are lazy. You love to write code, but you hate reading it. Reading code is for computers, you tell yourself, and you are, after all, made of carbon not silicon, so there. Plus, you write Perl, so it&#8217;s basically impossible to read anyway. But back to design patterns&#8230;</p>
<p>Design patterns are great because they provide a common vocabulary that helps developers communicate complicated ideas with a few short words like &#8220;Observer&#8221; or &#8220;Singleton&#8221;. If you&#8217;ve ever read a book on design patterns, I bet the first thing you did afterwards was implement one in your current project. That&#8217;s what I did. If you&#8217;re thick like me, which you obviously are, because you&#8217;re reading this drivel (be honest with yourself), then you probably missed the main point of design patterns. The main point of design patterns isn&#8217;t to give you something to code up. They exist to help you recognize patterns in code that already exists so you can reuse it in your project. Sure, you&#8217;ll implement one once in a while, but you really ought to be <strong>using</strong> them more than you&#8217;re <strong>writing</strong> them.</p>
<p><strong>It&#8217;s story time</strong></p>
<p>I recently spent some time with a friend reviewing his software project. It was a Qt/C++ user interface project in its infancy. He&#8217;s a super smart guy, and a good programmer. He knows Qt pretty well, and he knows that one of the things that makes it great are its <b>signals</b> and <b>slots</b>. Signals and slots are awesome. They make it so you can easily interact with the Qt library with very little work. They tell you when a user clicked on a button or changed some text in a text box, and things like that. In a nutshell, they let your code &#8220;observe&#8221; the state of things. Back to my friend and his model/view. For my friend&#8217;s <strong>model</strong>, he implemented the observer design pattern. This required each of his classes to implement an Observer or an Observable interface. He used C++ vectors to store pointers to each Observer so he could notify them of when things changed, and wrote all the code to add and remove new Observers on each Observable object. He was careful not to leak memory, or hang on to deleted Observer instances in each Observable. Great, right?</p>
<p><strong>Head scratching time</strong></p>
<p>Yes, my friend reinvented the wheel. Qt already provides the observer design pattern. Qt calls them signals and slots. Yes, you can define your own signals and slots, and Qt manages all the &#8220;observer&#8221; stuff for you, and I guarantee Qt does it better than my friend&#8217;s code (less memory, faster, etc etc). So now my friend has <strong>two</strong> observer design pattern implementations in his code base, one from Qt and one he coded up himself. Which one do you think has fewer bugs? The one that&#8217;s been around for 10 years and used by thousands of people, or the one he hacked together in a few days at work? Oh, and by the way, Qt&#8217;s signal/slot system handles crossing thread boundaries too. I&#8217;m telling you, signals and slots are awesome.</p>
<p><strong>Why does this happen?</strong></p>
<p>The answer is chilling: Those who fail to read the documentation are doomed to reimplement it (apologies to Mr. Churchill). The next time you are reading an API documentation, try plucking out the design patterns, and boiling the library down to its essence. What does this library really resemble, at its heart? How could I describe this feature in 3 words or less? You may be surprised by what you see that has been there all along.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/05/05/design-patterns-easy-to-write-hard-to-recognize/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LDS General Conference Podcast Updated (April 2009)</title>
		<link>http://thesmithfam.org/blog/2009/04/19/lds-general-conference-podcast-updated-april-2009/</link>
		<comments>http://thesmithfam.org/blog/2009/04/19/lds-general-conference-podcast-updated-april-2009/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 13:20:36 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[LDS]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=208</guid>
		<description><![CDATA[I finally updated the LDS General Conference Podcast to include the April 2009 sessions. Sorry it took me so long. I just plumb forgot until now.
If you&#8217;re already subscribed, you don&#8217;t have to do anything. The new sessions will automagically download. 
For more info, check out the General Conference Podcast page.
Enjoy!
]]></description>
			<content:encoded><![CDATA[<p>I finally updated the LDS General Conference Podcast to include the April 2009 sessions. Sorry it took me so long. I just plumb forgot until now.</p>
<p>If you&#8217;re already subscribed, you don&#8217;t have to do anything. The new sessions will automagically download. </p>
<p>For more info, check out the <a href="/blog/lds-general-conference-podcast/">General Conference Podcast page</a>.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/04/19/lds-general-conference-podcast-updated-april-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bash bracket hacking</title>
		<link>http://thesmithfam.org/blog/2009/04/11/bash-bracket-hacking/</link>
		<comments>http://thesmithfam.org/blog/2009/04/11/bash-bracket-hacking/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 05:50:00 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=188</guid>
		<description><![CDATA[I am no shell scripting expert, but I have written a lot of bash code in my day. Most of my shell scripting know-how has come from trial-and-error and desperate googling. This has (slowly) taught me a few nifty tricks and some of the more interesting details of how bash actually &#8220;works&#8221; (for lack of [...]]]></description>
			<content:encoded><![CDATA[<p>I am no shell scripting expert, but I have written a lot of bash code in my day. Most of my shell scripting know-how has come from trial-and-error and desperate googling. This has (slowly) taught me a few nifty tricks and some of the more interesting details of how bash actually &#8220;works&#8221; (for lack of a better word). I&#8217;d like to share one small tidbit with you now.</p>
<p>The &#8220;<b>[</b>" program.</p>
<p>No, that's  not a mistake. There actually <b>is</b> a program on UNIX systems called "[", and it generally lives in /usr/bin. Don't believe me? Check out this <b>which</b> command:</p>
<blockquote><p><code># which [<br />
/usr/bin/[<br />
</code></p></blockquote>
<p>Isn't that odd? On some systems (namely Fedora-variants) the "[" program is actually a symbolic link ("symlink" among friends) to a program called "<b>test</b>":</p>
<blockquote><p><code># ls -l /usr/bin/[<br />
lrwxrwxrwx root    /usr/bin/[ -> test</code></p></blockquote>
<p>You see, every good UNIX-like OS ships with a handy utility called test (<tt>man 1 test</tt>). It's a simple program that takes input like "Is variable $foo greater than 42?", and it looks like this:</p>
<blockquote><p><code># foo=43<br />
# test $foo -gt 42<br />
# echo $?<br />
0<br />
# test $foo -lt 42<br />
# echo $?<br />
1</code></p></blockquote>
<p>It can do a whole slew of other comparisons too, including math, string comparisons, file operations (does file $foo exist?), and a bunch of other stuff (<tt>man 1 test</tt> for full details)</p>
<p>The "test" program gives output solely by its exit status (that's what $? stores after you run a program in bash). That way, you can use it in bash if statements, like this:</p>
<blockquote><p><code>foo=43<br />
if test $foo -gt 42; then<br />
&nbsp;&nbsp;    echo $foo is greater than 42<br />
else<br />
&nbsp;&nbsp;    echo $foo is NOT greater than 42<br />
fi</code></p></blockquote>
<p>It turns out that our good UNIX forebears hated typing, so they invented the "[" program, which does exactly the same thing, but it <b>looks</b> a heck of a lot like a C conditional when used in shell scripts, like this:</p>
<blockquote><p><code>foo=43<br />
if [ $foo -gt 42 ]; then<br />
&nbsp;&nbsp;    echo $foo is greater than 42<br />
else<br />
&nbsp;&nbsp;    echo $foo is NOT greater than 42<br />
fi</code></p></blockquote>
<p>The only difference between "test" and "[" is that "[" requires you to have a matching "]" as its last argument or it complains on stderr. Isn't that nifty? I think so. This explains why, by the way, you have to have spaces before and after the "[" and "]". It's because "[" is actually a program name and "]" is just a command line argument like any other argument.</p>
<p>Now get back to that shell script you were hacking.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/04/11/bash-bracket-hacking/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Free Yourself From Windows Vista</title>
		<link>http://thesmithfam.org/blog/2009/02/27/free-yourself-from-windows-vista/</link>
		<comments>http://thesmithfam.org/blog/2009/02/27/free-yourself-from-windows-vista/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 04:11:04 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=172</guid>
		<description><![CDATA[I have become the de-facto neighborhood tech support geek. Huh, you ask? Well, combine a pretty face with a bit of computer hackery know-how, and what do you expect?
During the course of regular Windows tech support adventures, I have accidentally observed an interesting trend ever since our friends in Redmond gave us Windows Vista. The [...]]]></description>
			<content:encoded><![CDATA[<p>I have become the de-facto neighborhood tech support geek. Huh, you ask? Well, combine a pretty face with a bit of computer hackery know-how, and what do you expect?</p>
<p>During the course of regular Windows tech support adventures, I have accidentally observed an interesting trend ever since our friends in Redmond gave us Windows Vista. The trend: Tech support calls are up &#8212; way up. Before Vista, I would go months without a call, and now I&#8217;m getting called constantly. Here are a couple gems from this week:</p>
<p><b>1. The infinite reboot</b></p>
<p>We all know we&#8217;re supposed to keep our computers up to date with the latest patches from Microsoft, right? If not, the boogey man will get you, and the terrorists will win the War. So we all dutifully download and install (automatically, of course) these beloved patches every month like it&#8217;s our patriotic duty. Well, this week Microsoft released a particularly good patch. This one causes your computer to reboot so it can finish applying the updates (a normal course, to be sure), but after the reboot, and before you can actually login to your computer, it reboots <b>again</b>. Then it repeats the process, reboot, apply the patch, fail, reboot, apply the patch, fail, and you get the picture. There is no solution that I could find, though I <b>did</b> find lots of forums full of irate users whose computers stopped working. The only solution was a complete system wipe and re-install from scratch. The cost: <b>about 8 hours.</b></p>
<p><b>2. &#8220;Easy&#8221; internet access</b></p>
<p>Jamie and I bought an iMac computer last week. It&#8217;s awesome. I brought it home, unboxed it, plugged it in, and it just worked. No configuration, no settings, no &#8220;cancel or allow?&#8221;, no headaches. It just worked. Internet worked, sound worked, movies worked, and I have about 75% fewer cords under my desk now.</p>
<p>On the other side of the coin, I was helping a friend setup their Comcast internet tonight in Windows Vista. I noticed that, out of the box, internet access is actually disabled (a &#8220;security&#8221; measure I&#8217;m sure since only Terrorists and Communists use the internet). But you can&#8217;t tell by looking at any settings in the control panel. It appears that it should be working. To make it work, you actually have to navigate to the control panel, then to &#8220;Network and sharing center&#8221; (yeah, I would have guess <b>that</b> meant &#8220;get me on the freaking internet&#8221;), then you have to <b>disable</b> the &#8220;Local Area Network Connection&#8221;, and then, and finally, you have to re-enable it. Some of this requires a right mouse click, some of it a double click, and some of a left mouse click. What a pain. Oh, and by the way, you get asked a couple times whether you want to &#8220;cancel or allow&#8221;, with a helpful warning that you should only &#8220;allow&#8221; if you trust the &#8220;executable&#8221; from &#8220;Unknown Publisher&#8221;, which of course happens to be the publisher that I trust the most!</p>
<p>I just don&#8217;t know how Microsoft expects non-programmers to figure out how to use their computers.</p>
<p>I have never struggled to use a computer so much. This really is the hardest computer I&#8217;ve ever used, and I&#8217;ve used some of the most arcane UNIX and Linux workstations imaginable (HP-UX anyone?).</p>
<p>So, seriously people, do yourself a favor and get a Mac. Save yourself the hours of pain and suffering setting up this piece of crap from Microsoft.</p>
<p>Oh, and don&#8217;t complain that Macs cost more than Windows PC&#8217;s because a PC is only cheaper if your time is worthless.</p>
<p><img src="/images/imac.jpg" /><br />
The hot iMac with the hotter Wife.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/02/27/free-yourself-from-windows-vista/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Best bash prompt. Ever.</title>
		<link>http://thesmithfam.org/blog/2009/01/06/best-bash-prompt-ever/</link>
		<comments>http://thesmithfam.org/blog/2009/01/06/best-bash-prompt-ever/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 00:22:37 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=136</guid>
		<description><![CDATA[I have the best bash prompt ever. It took a lot of hacking and googling, but here she is:

Notice that the smiley face and text colors change depending on the exit code of the last run command (red = failed, green = happy). This is handy, for example, after a big long build that has [...]]]></description>
			<content:encoded><![CDATA[<p>I have the best bash prompt ever. It took a lot of hacking and googling, but here she is:</p>
<p><img src="/images/bash-prompt.png" /></p>
<p>Notice that the smiley face and text colors change depending on the exit code of the last run command (red = failed, green = happy). This is handy, for example, after a big long build that has error messages buried in it, and the last line of output just isn&#8217;t that useful.</p>
<p>To make your prompt awesome, put this in your .bashrc and enjoy:</p>
<pre><textarea wrap="off" rows="25" cols="50">
BLACK="\[\033[0;30m\]"
DARK_GRAY="\[\033[1;30m\]"
LIGHT_GRAY="\[\033[0;37m\]"
BLUE="\[\033[0;34m\]"
LIGHT_BLUE="\[\033[1;34m\]"
GREEN="\[\033[0;32m\]"
LIGHT_GREEN="\[\033[1;32m\]"
CYAN="\[\033[0;36m\]"
LIGHT_CYAN="\[\033[1;36m\]"
RED="\[\033[0;31m\]"
LIGHT_RED="\[\033[1;31m\]"
PURPLE="\[\033[0;35m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
BROWN="\[\033[0;33m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
DEFAULT_COLOR="\[\033[00m\]"

export PS1="\`if [ \$? = 0 ];
    then
        echo -e '$GREEN--( $LIGHT_CYAN\u$YELLOW@$LIGHT_CYAN\h$GREEN )--( $YELLOW\w$GREEN )-- <img src='http://thesmithfam.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> \n--\$$DEFAULT_COLOR ';
    else
        echo -e '$LIGHT_RED--( $LIGHT_CYAN\u$YELLOW@$LIGHT_CYAN\h$LIGHT_RED )--( $YELLOW\w$LIGHT_RED )-- <img src='http://thesmithfam.org/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> \n--\$$DEFAULT_COLOR ';
    fi; \`"
</textarea></pre>
<p>Happy bashing!</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2009/01/06/best-bash-prompt-ever/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The Economy Stinks. We&#8217;re Hiring.</title>
		<link>http://thesmithfam.org/blog/2008/12/13/the-economy-stinks-were-hiring/</link>
		<comments>http://thesmithfam.org/blog/2008/12/13/the-economy-stinks-were-hiring/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 03:18:11 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Code and Cruft]]></category>

		<guid isPermaLink="false">http://thesmithfam.org/blog/?p=133</guid>
		<description><![CDATA[Taking a break from computer science and model aviation for the moment, I want to make sure my readership (both of you, not counting my mother) is aware that my company is currently hiring software developers. I know that many developers in the Salt Lake City area have recently found themselves on the job market. [...]]]></description>
			<content:encoded><![CDATA[<p>Taking a break from computer science and model aviation for the moment, I want to make sure my readership (both of you, not counting my mother) is aware that my company is currently hiring software developers. I know that many developers in the Salt Lake City area have recently found themselves on the job market. I also know that new job opportunities have slowed significantly. Although I take a more optimistic view than most, I readily admit that times are harder today for developers than they were one year ago. Despite the current state of the economy, my company is doing extraordinarily well. If you are looking for work, and you would enjoy working on a small team of engineers solving problems of national and global importance, then this may be the job for you.</p>
<p>At my company, we build the world&#8217;s most advanced signal processing systems. Developers here tend to get intimately involved in projects from the early idea stage all the way through delivery. You won&#8217;t be an insignificant cog in a massive corporate machine. Although we tend to have a small company feel, we have big company stability and benefits. Our Salt Lake City office of 60 people is actually a satellite office of our California-based headquarters, so we have all the best medical benefits afforded to larger companies, and yet we still maintain that small company feel: no office politics, no bureaucracy, no pigeon-holing, just pure engineering at its best. We have been very fortunate for the past couple years, and now we have more revenue coming in than we&#8217;ve ever had before.</p>
<p>As for experience and requirements, I won&#8217;t mention the specific technologies we work with since the only real job requirement is that you are smart and get things done. You&#8217;ll pick up the job-specific knowledge you need once you start working.</p>
<p>If this sounds good to you, feel free to email me your resume: dave@thesmithfam.org</p>
<p>I look forward to hearing from you.</p>
]]></content:encoded>
			<wfw:commentRss>http://thesmithfam.org/blog/2008/12/13/the-economy-stinks-were-hiring/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
