<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" version="2.0">
   <channel>
      <title>~Sterling</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=eKqIh3T83BGQKhZ_TqoASA</link>
      <pubDate>Sun, 08 Nov 2009 09:05:51 -0800</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TildeSterling" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
         <title>Bluga WebThumbs 1.0 for Drupal 6</title>
         <link>http://contentment.org/2009/11/bluga-webthumbs-10-for-drupal.html</link>
         <description>&lt;p&gt;If you use &lt;a rel="nofollow" target="_blank" href="http://drupal.org"&gt;Drupal&lt;/a&gt; and would like to automatically generate thumbnails of web sites, you might want to take a look at the Bluga WebThumbs &lt;a rel="nofollow" target="_blank" href="http://drupal.org/project/bluga"&gt;module&lt;/a&gt;. Once that module is installed on Drupal and you have given the module your &lt;a rel="nofollow" target="_blank" href="http://webthumb.bluga.net/home"&gt;Bluga WebThumb&lt;/a&gt; API key, you can then inject a PHP snippet like this into a node using the PHP filter or into a theme file:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;?php
print bluga_webthumb('http://contentment.org/');
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Now, when you view the page containing that snippet, you will see a thumbnail generated using the Bluga WebThumb service within a few seconds that shows that web site. The thumbnail is cached locally on your server.&lt;/p&gt; &lt;p&gt;You can further customize your thumbnail with many options. You can read the full &lt;a rel="nofollow" target="_blank" href="http://drupal.org/node/620684"&gt;documentation&lt;/a&gt; for the module at Drupal&amp;#8217;s web site as well. New features since March of last year also include a script for updating the thumbnail in place without requiring a page reload and a nicer looking (and CSS-styled) place holder, which is an improvement over the graphic previously used.&lt;/p&gt; &lt;p&gt;Last week, I was approached by the owner of &lt;a rel="nofollow" target="_blank" href="http://konigi.com"&gt;Konigi.com&lt;/a&gt; to do some Drupal work. He&amp;#8217;s a user of the Bluga WebThumbs module I wrote in March of last year and wanted to see it work with Drupal 6. I have finished the update and have made a full release of the Drupal 5 version of the module after making a few improvements and then ported the module to Drupal 6.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.674</guid>
         <pubDate>Tue, 03 Nov 2009 20:02:47 -0800</pubDate>
      </item>
      <item>
         <title>Google Wave is Nothing Special</title>
         <link>http://contentment.org/2009/10/google-wave-is-nothing-special.html</link>
         <description>&lt;p&gt;In the past, I&amp;#8217;ve done a fair bit of work on &lt;a rel="nofollow" target="_blank" href="http://jifty.org"&gt;Jifty&lt;/a&gt; with &lt;a rel="nofollow" target="_blank" href="http://www.fsck.com/"&gt;Jesse Vincent&lt;/a&gt; by way of my previous job. He had some &lt;a rel="nofollow" target="_blank" href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; invites and I begged one off of him. After waiting a week, it came through and splat. Google Wave is a wasteland of nothing. Playing with some posts to myself led to about 10 minutes of use and then I hung up.&lt;/p&gt; &lt;p&gt;A &lt;a rel="nofollow" target="_blank" href="http://nowthis.com/"&gt;colleague&lt;/a&gt; of mine, who (last I knew) does not have a Google Wave account had come across a LifeHacker &lt;a rel="nofollow" target="_blank" href="http://lifehacker.com/5372853/the-first-google-wave-search-you-must-know"&gt;post&lt;/a&gt; describe the &amp;#8220;with:public&amp;#8221; search that provides at least some content for Google Wave. However, that content is mostly just a dearth of &amp;#8220;What can I do?&amp;#8221; and &amp;#8220;Anybody else here from Canada?&amp;#8221; and &amp;#8220;What happens if I post porn?&amp;#8221; It was initially interesting, but I got about another 10 minutes and hung up again.&lt;/p&gt; &lt;p&gt;Okay, so there&amp;#8217;s not much to do, but it&amp;#8217;s brand spanking new. Thus, criticizing it now is like calling a bridge useless when the engineers have only just finished putting up the supports. There are couple things I&amp;#8217;d like to note, though.&lt;/p&gt; &lt;p&gt;First, there&amp;#8217;s not just a whole lot new here. Google Wave is merely a new combination of social networking, email, wiki, forums, chat, document and image sharing, and widgetry. If you&amp;#8217;ve used a Wiki, Twitter, IM, and Email before, you have a good idea what Google Wave is already. They&amp;#8217;ve just taken the next step and attempted to combine things in a way that will be challenging to scale, but I think Google is up to the task.&lt;/p&gt; &lt;p&gt;Second, that all said there is something I hope that can be achieved here, if not by Wave, by something like it. They consider Google Wave to be a reinvention of email. They have the idea that they might be able to replace email with it. Maybe. I think email has already been replaced by SMS, Twitter, and Facebook for many people. I end up using Facebook to send messages to folks much more often than Email these days and would probably use SMS if I weren&amp;#8217;t so cheap and had someone other than my wife that I communicated with regularly via cell phone. &lt;/p&gt; &lt;p&gt;Problem: Services like Twitter and Facebook have a very significant problem. They&amp;#8217;ve taken the Internet backwards by providing a single hosted service in the cloud. Email has an important advantage in that if my email provider has an outage, everyone else on the Internet is probably fine. If my email provider goes out of business or provides terrible service, I have the alternative to go somewhere else. Twitter and Facebook have competitors, but unless you can convince all your family and friends to move with you, you can&amp;#8217;t leave them unless you&amp;#8217;re willing to sever your ability to communicate with them.&lt;/p&gt; &lt;p&gt;Solution: Something like Google Wave or Twitter or a consortium of social networking sites needs to come up with a new decentralized mechanism for communicating between people. Whether that means you can switch services but they have hooks between one another to send messages and share friend lists or Google Wave provides some sort of decentralized platform for doing this independent of the social networking sites, something needs to happen here.&lt;/p&gt; &lt;p&gt;There are other dangers here to privacy and such that I haven&amp;#8217;t even touched on either. Something like Google Wave (assuming Google Wave can become decentralized like email) should happen if social networking is going to continue to develop. That&amp;#8217;s my thought anyway.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.673</guid>
         <pubDate>Thu, 15 Oct 2009 16:28:10 -0700</pubDate>
      </item>
      <item>
         <title>The Problem with Fiction</title>
         <link>http://andrew.sterling.hanenkamp.com/2009/09/the-problem-with-fiction.html</link>
         <description>&lt;p&gt;I&amp;#8217;m a pretty avid reader. I&amp;#8217;m a terribly slow reader, but I still manage to read between 5 and 10 pages from a novel each night before going to sleep. I usually read another 5 to 10 pages out loud to Terri before going to sleep. I also read lots of news, blogs, tech articles, articles from various evangelicals, fundamentalists, and reformed writers. According to my Google Reader statistics, I&amp;#8217;ve blown through about 2,400 headlines in the past 30 days with 63 of them listed as &amp;#8220;Shared&amp;#8221; which is a pretty good indication of how many of those entries I&amp;#8217;ve read carefully, so about 2 a day. I read at least one chapter out of the Bible to Gabe every night, usually one or two picture books to him before bed, and I&amp;#8217;m usually studying or searching scripture for something two or three times a day. And I haven&amp;#8217;t even covered the amount of reading I do for work with wiki pages, articles shared by coworkers, documentation needed to solve problems, new policies, important email, etc. Reading is pretty important to me.&lt;/p&gt; &lt;p&gt;I really love reading novels, though. I usually wish I could read way more than 10 or 20 pages a night. However, I have one major problem with novels and fiction in general. Movies and TV shows and plays and poetry and whatever else you might mention in the category of &amp;#8220;fiction&amp;#8221; all have this problem. The problem with fiction is that it&amp;#8217;s fictional. Profound, eh? Let&amp;#8217;s just talk about novels, though, knowing that the word &amp;#8220;novel&amp;#8221; could be replaced with any of these other forms of fiction.&lt;/p&gt; &lt;p&gt;What I mean by &amp;#8220;fiction has a problem with being fictional&amp;#8221; is this: the world in your fiction doesn&amp;#8217;t have to have anything to do with the real world. Given that I&amp;#8217;m often reading science fiction, it&amp;#8217;s really not supposed to. That said, fiction (and science fiction in particular) is almost always a work of exploration in the realm of morals, values, and human nature. What would the human condition be like if dinosaurs walked the earth? What would happen if aliens destroyed the planet? What would happen if people could perform magic? What would be the implication if we developed a truly thinking artificial intelligence? Many books have tackled these questions in various ways. At some point, for these books to be interesting, they must intersect non-fictional reality.&lt;/p&gt; &lt;p&gt;And therein is the problem. It is easy in fiction to present a version of humanity that does not exist. For example, imagine reading a book where a benevolent corporation rules humanity. The company is driven to generate wealth for the upper management, yet it serves all the people, no one is hungry, or sick, or unhappy. Unless there&amp;#8217;s some extra reason I should believe this would happen or something dark and sinister lying underneath it, why would you believe that would possible? Why should you? That scenario might make good satire or a setting for some dark dystopia or horror story, but is not believable as a setting for much else.&lt;/p&gt; &lt;p&gt;Similarly, when &lt;em&gt;Star Trek&lt;/em&gt; presents a world where mankind has moved past the sins of history: wars and famines and poverty and greed and all that; one must wonder which humanity Gene Roddenberry was talking about. Homo superior sounds about as believable to me as the last scenario involving the corporate oligarchy. Heinlein&amp;#8217;s &lt;em&gt;Stranger in a Strange Land&lt;/em&gt; or even &lt;em&gt;Starship Troopers&lt;/em&gt; (not the movie, which barely has any similarity with the book) are similarly unbelievable in his rendering of successful communistic and militaristic libertarian societies, respectively. &lt;/p&gt; &lt;p&gt;I&amp;#8217;m also a fan of Orson Scott Card, but the idea that humanity would unite so well under a common cause in &lt;em&gt;Ender&amp;#8217;s Game&lt;/em&gt; or that a human-built computer would really be successful as the conscience that prevents humanity from destroying itself in nuclear holocaust in the &lt;em&gt;Homecoming&lt;/em&gt; series stretches credibility with me. Humanity has not, since the fall of the Tower of Babel, ever united in that way. Having built enough computer programs, the idea of making one capable of being a god that wouldn&amp;#8217;t be an epic FAIL within in 6 months of being on it&amp;#8217;s own is pretty hilarious.&lt;/p&gt; &lt;p&gt;All of these stories have taken a simplistic view of a system that is basically impossible to understand in a few hundred pages of text. If we were to really consider the full complexity of common systems like how all the people within a cultural area interact and how two cultures near each other meld together into a greater culture (folks in Manhattan, versus folks in Lawrence and Manhattan both being in Kansans, for example), you find a system that is fundamentally beyond human comprehension. No brain is big enough to comprehend enough of the facts involved simultaneously to understand why people work together the way they do. We can only generalize in the most vague of terms. Only great hubris allows a person to say he truly understands basic reality in any meaningful way. It&amp;#8217;s not so much that there is no objective truth, but that without simplifying things down, we couldn&amp;#8217;t understand even a small segment of objective truth.&lt;/p&gt; &lt;p&gt;Going back to the stories: these are stories that I found entertaining, interesting, and even thought-provoking. Yet, each of them failed to hold true to humanity in some important way. I won&amp;#8217;t say I could do better because I know I couldn&amp;#8217;t or at least I know I couldn&amp;#8217;t on my better days. If I ever write a book, I&amp;#8217;ll have to be sure to include in the preface, &amp;#8220;I&amp;#8217;m going to start by saying, I got this wrong. Humans don&amp;#8217;t really work together this way, but they do in my head, mostly. I hate all the flaws in this book, but you have to stop editing the story sooner or later and may this be yet another monument demonstrating that human endeavors are imperfect and incomplete.&amp;#8221;&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:andrew.sterling.hanenkamp.com,2009://4.671</guid>
         <pubDate>Mon, 14 Sep 2009 18:31:17 -0700</pubDate>
      </item>
      <item>
         <title>Driving an Empty Bus or a Clown Car?</title>
         <link>http://contentment.org/2009/09/driving-an-empty-bus-or-a-clow.html</link>
         <description>&lt;p&gt;This morning I had an epiphany about a difference in project management style between the two major development jobs I&amp;#8217;ve held. One style was like driving an empty bus and the other was like riding in a clown car. I am going to examine both as anecdotes from my perspective and try to avoid grandiose analysis.&lt;/p&gt; &lt;h3&gt;The Empty Bus&lt;/h3&gt; &lt;p&gt;So, I start the job and the first thing the company does is hand me the keys to the bus. Actually, they dither on what kind of bus to give me for several months before getting me a suitable one and give me a loaner to drive in the meantime. However, once on the bus driving, I am pretty much on my own. I have a destination to reach that has been vaguely described on a scribbled piece of paper. The directions are unclear and no one in the company has been there before. They keep changing the directions. But I get to drive. That is fun.&lt;/p&gt; &lt;p&gt;Every now and then, I pick somebody from the company up, they make changes to the directions and then they get off again before I go very far. Every six months, everybody climbs on to the bus and sits in the very back. They do a lot of yelling while I park and then they take away my scribbled directions and give me new scribbles to follow and a new destination to reach. But I get to drive. That&amp;#8217;s usually fun.&lt;/p&gt; &lt;p&gt;All in all, I am asked to develop software with very little cooperation or direction. I am left on my own to make almost all the decisions. Even though I have weekly meetings with my manager, I am not really given much feedback on whether I&amp;#8217;m going the right way. He&amp;#8217;s not a developer, so he doesn&amp;#8217;t really know enough about what I do to give me useful feedback. My quarterly reviews aren&amp;#8217;t very cooperative or helpful, they are more about the manager wishing I would drive faster and make fewer mistakes (mutually exclusive goals when you think about it).&lt;/p&gt; &lt;p&gt;I nearly get into a wreck a couple times, but there&amp;#8217;s no one on the bus to help me out. Don&amp;#8217;t get me wrong, I&amp;#8217;m not an excellent driver. I&amp;#8217;m still learning, but some help should help things go faster in process, you&amp;#8217;d think. Usually, though, my directions are so unclear and difficult to follow that I am directed to get into wrecks. This is not actually all that fun as time goes on.&lt;/p&gt; &lt;h3&gt;The Clown Car&lt;/h3&gt; &lt;p&gt;Clown cars are funny. They drive around in circles and then the doors pop open and an absurd number of hilarious characters hop out of the little car. This job is not quite like this. It&amp;#8217;s actually more like a really crowded minivan, like the trip I took the other day with my wife, son, dad, mom, brother, sister, and her boyfriend, all crammed into our little Pontiac Montana. But now, imagine, that all of these people have a stake in where the van goes and have a slightly role and different idea about how to go about getting there. Now, we&amp;#8217;ve got a good analogy. Clown cars are fun, though.&lt;/p&gt; &lt;p&gt;The CEO&amp;#8217;s seat is next to mine and he gets in and out of the van whenever he feels the need. He&amp;#8217;s a busy man: lots of vans to help. Usually, he gets in right before we wreck or near the major turns to make sure we drive carefully at those point and turn the right direction. Directly behind me sits an analyst whose job it is to navigate. He tells me where to go and annotates those instructions pretty regularly. Beside him sits another analyst whose job it is to talk to the customer and figure out what they want. He then tells the first analyst and me where we need to think about going next. I get to drive, though, they keep reaching from the back for the wheel and the pedals. That&amp;#8217;s annoying, but still fun.&lt;/p&gt; &lt;p&gt;Behind the analysts sit a whole team of project managers, executives, sales people and between them and between the front seats sit a bunch of other engineers. Sometimes the other engineers help drive, make suggestions, and they often critique or commend my driving. There are a lot of people in this minivan, sometimes there&amp;#8217;s a lot of yelling about what to do next. All the activity does make for quite a bit of fun, even if it gets a bit distracting at times.&lt;/p&gt; &lt;p&gt;I get to drive. As I mentioned, sometimes the analysts and engineers have their hand on the wheel and help push the pedals for me. This is pretty fun too, unlike the car though, this actually gives us a lot more control. We seem to be getting places in a much more controlled way, though we do have to control our speed much more carefully. It might take us longer, but the drive is fun along the way.&lt;/p&gt; &lt;p&gt;Software development in this style takes away some of my freedom as a coder. That&amp;#8217;s a bummer in some ways, not as much fun. I like control. Yet, it also lets me focus on my strengths while others worry about talking to customers, making sure we have a plan that does what the customer wants, and while the constant feedback makes it hard to see the big picture, I usually have a lot of warning before I drive off the road or get into a wreck. Overall, this is more fun.&lt;/p&gt; &lt;p&gt;So far, I prefer the &amp;#8220;clown car&amp;#8221;/stuffed minivan to the empty bus. It&amp;#8217;s less bipolar and more slow, steady, and directed.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.670</guid>
         <pubDate>Thu, 10 Sep 2009 19:44:30 -0700</pubDate>
      </item>
      <item>
         <title>Are You My Neighbor?</title>
         <link>http://andrew.sterling.hanenkamp.com/2009/08/are-you-my-neighbor.html</link>
         <description>&lt;blockquote&gt;&lt;p&gt;And behold, a lawyer stood up to put him [Jesus] to the test, saying, &amp;#8220;Teacher, what shall I do to inherit eternal life?&amp;#8221; He said to him, &amp;#8220;What is written in the Law? How do you read it?&amp;#8221; And he answered, &amp;#8220;You shall love the Lord your God with all your heart and with all your soul and with all your strength and with all your mind, and your neighbor as yourself.&amp;#8221; And he said to him, &amp;#8220;You have answered correctly; do this, and you will live.&amp;#8221;&lt;/p&gt; &lt;p&gt;But he, desiring to justify himself, said to Jesus, &amp;#8220;And who is my neighbor?&amp;#8221; Jesus replied, &amp;#8220;A man was going down from Jerusalem to Jericho, and he fell among robbers, who stripped him and beat him and departed, leaving him half dead. Now by chance a priest was going down that road, and when he saw him he passed by on the other side. So likewise a Levite, when he came to the place and saw him, passed by on the other side. But a Samaritan, as he journeyed, came to where he was, and when he saw him, he had compassion. He went to him and bound up his wounds, pouring on oil and wine. Then he set him on his own animal and brought him to an inn and took care of him. And the next day he took out two denarii and gave them to the innkeeper, saying, &amp;#8216;Take care of him, and whatever more you spend, I will repay you when I come back.&amp;#8217; Which of these three, do you think, proved to be neighbor to the man who fell among the robbers?&amp;#8221; He said, &amp;#8220;The one who showed him mercy.&amp;#8221; And Jesus said to him, &amp;#8220;You go, and do likewise.&amp;#8221; &lt;br /&gt; &amp;#8212; Luke 10:25-37&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;That is the Parable of the Good Samaritan. This story is interesting on a number levels. First of all, it clearly outlines the prejudices held by society&amp;#8217;s upper classes, those in charge of religious practice and local government. During this time, Israel was a Roman territory, so the national and regional government was of Rome. However, the local government was theocratic and generally provided to the Jews through the temple and the synagogue. More interestingly, is how Jesus provides a story that goes against tradition, challenges this prejudice, and promotes a difficult model to emulate. I&amp;#8217;m going to describe this and then a couple ways this story is misused.&lt;/p&gt; &lt;p&gt;To start, let&amp;#8217;s examine the characters here.&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Lawyer.&lt;/strong&gt; By &amp;#8220;lawyer&amp;#8221; the passage doesn&amp;#8217;t mean quite what we&amp;#8217;d think of as a lawyer today. This was a scribe. A person educated in the Law of God. The questions he presents are similar to other inquiries. It is likely, since his profession is mentioned, that he was representing the religious leaders in the area. (Luke 18:18-21; Matthew 19:16-22; John 3:1-15)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jesus Christ.&lt;/strong&gt; Our Lord and Savior. He&amp;#8217;s being challenged to answer a question the lawyer believes is hard, but Jesus turns the question back on him in some very telling ways.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robbers.&lt;/strong&gt; Not all that important except that they beat and robbed the victim in the story.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Man.&lt;/strong&gt; We know nothing of this man except that he was traveling on the road between Jerusalem to Jericho, which is a somewhat dangerous road about 17 miles long. According to &lt;em&gt;The MarArthur Bible Commentary&lt;/em&gt; it was &amp;#8220;notorious for being beset with thieves and danger.&amp;#8221;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Priest.&lt;/strong&gt; The priests were direct descendants of Aaron, who was the brother of Moses. These were responsible for the details of temple worship, responsible sacrificing animals and grain and such for various reasons. The priests were a special class of individuals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Levite.&lt;/strong&gt; Aaron and Moses were both descendants from a man named Levi, who was the son of Israel. A Levite would be a person in the same tribe as the priests, but a different clan. Levites were generally responsible for other religious tasks, such as managing the temple treasury, guarding the entrances to the temple, and other services across the country.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Samaritan.&lt;/strong&gt; Samaritans were hated and despised by Israelites. (John 8:48) They mixed worship of Yahweh with idol worship (2 Kings 17:41) and were really the descendants of people resettled there when the king of Assyria conquered Israel a few centuries earlier. (2 Kings 17:24) In general, they had few, if any, dealings with Jews. (John 4:9)First&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;If you think about it from the perspective of the lawyer: a Samaritan is a descendant of a people who lived on your ancestor&amp;#8217;s land after they had been conquered by a foreign king. It might not matter greatly to you if they were just as forcibly resettled as your ancestors were when they were taken away to Assyria and Babylon because they were living in the land promised to you and your ancestors by God. It might not have been easy for the lawyer to agree with Jesus in the end that the Samaritan was obviously the good neighbor here. In fact, since he doesn&amp;#8217;t answer directly, but says, &amp;#8220;the one who&amp;#8230;&amp;#8221; it looks very much like he didn&amp;#8217;t want to say, &amp;#8220;The Samaritan.&amp;#8221;&lt;/p&gt; &lt;p&gt;Okay, let&amp;#8217;s summarize. A man is beaten and left for dead. Two members of the religious and political upper class walk by without helping him. A member of a despised group comes and helps the man out, nurses him to health, and even pays for his stay in an inn with no hope of repayment. The Samaritan&amp;#8217;s not even in the right part of the country, so he&amp;#8217;s not in a good position himself, but he helps anyway.&lt;/p&gt; &lt;p&gt;This is proving to be a really peculiar story. But then the real kicker is that Jesus doesn&amp;#8217;t even answer the lawyer&amp;#8217;s question! The lawyer asked, &amp;#8220;Who is my neighbor?&amp;#8221; So, we read the story, get right up to verse 36, &amp;#8220;Which of these three, do you think, proved to be a neighbor to the man who fell among the robbers?&amp;#8221; Prior to reading that, the obvious answer to the lawyer&amp;#8217;s question is, &amp;#8220;the man who was robbed&amp;#8221; is the neighbor he asked about. The Samaritan just looks like color to shame the lawyer, but that&amp;#8217;s not the point Jesus makes.&lt;/p&gt; &lt;p&gt;Rather, Jesus asks that question, &amp;#8220;Which of these three, do you think, proved to be &lt;strong&gt;a neighbor to the man who fell among the robbers?&lt;/strong&gt;&amp;#8221; Jesus&amp;#8217;s question is the opposite of the lawyer&amp;#8217;s. Not who should I serve, but who was the one who served? It&amp;#8217;s a very poignant challenge. It states that a Jew should emulate, of all people, a lousy Samaritan.&lt;/p&gt; &lt;p&gt;So, what do we learn? Lot&amp;#8217;s of things. A true follower of God&amp;#8217;s Kingdom is one like this Samaritan. His background is questionable, but his actions are righteous. We all sin, but once we have been redeemed by Jesus Christ, we should seek to serve others in need, without regard to what that means to ourselves. This is hard to practice. It is obviously much easier to behave like the priest and the Levite.&lt;/p&gt; &lt;p&gt;But, that&amp;#8217;s not all. This service is very, very personal and extremely generous. The Samaritan didn&amp;#8217;t just notify the next town that a Jew was on the road needing help, he didn&amp;#8217;t just pick him up and help him to the next village, he didn&amp;#8217;t just pass him a few coins for the inn. This man &amp;#8220;had compassion.&amp;#8221; He, personally, cleaned and treated the man&amp;#8217;s wounds. He &amp;#8220;brought him to an inn and took care of him.&amp;#8221; He stayed the night with the man to make sure he was alright and then, before traveling on, payed the innkeeper two denarii, which was 2 day&amp;#8217;s wages. Think about how much you earn in two days. Would you give that kind of money to a complete stranger? But he didn&amp;#8217;t stop there, &amp;#8220;Take care of him, and whatever more you spend, I will repay you when I come back.&amp;#8221; This is like giving them his credit card and saying, &amp;#8220;Just charge that for whatever he needs.&amp;#8221;&lt;/p&gt; &lt;p&gt;Going back to what I said before now, following Christ&amp;#8217;s suggestion, &amp;#8220;You go, and do likewise,&amp;#8221; is a very hefty proposition. Serving others in need with such generosity is very difficult. I&amp;#8217;d say it&amp;#8217;s pretty nearly impossible. I can&amp;#8217;t imagine there are many people who come close.&lt;/p&gt; &lt;p&gt;Now, my final point. I hear this parable cheapened and distorted far too often and it grates on my soul. Here are a couple things I hear the term &amp;#8220;Good Samaritan&amp;#8221; used to describe, which water down the meaning in ways that bother me:&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;Good Samaritan Law. It does not strike me as particularly ethical to force ethics on people by law. In any case, it takes a beautiful portrait of what the Samaritan does voluntarily and turns it into an obligation. I say that cheapens this beautiful portrait Christ painted.That&amp;#8217;s bothersome.&lt;/li&gt;
&lt;li&gt;Social action. Social action typically implies some sort of detached service, not personal service, at least not for most people. For example, there&amp;#8217;s an organization in town (I used to fix their computers) called Kansas Guardianship Program. Their purpose is to help guardians who help people unable to care for themselves pay for the care they give. It&amp;#8217;s more complicated than that, but that&amp;#8217;s the gist. To call this kind of social action a Good Samaritan program cheapens the story of the Good Samaritan. One of these guardians might be comparable to the Good Samaritan, but a program of social workers who coordinate with these folks and deliver checks are not Good Samaritans. I&amp;#8217;m not making any comment regarding KGP, itself, by the way. Just noting that calling them Good Samaritans for doing this would be an exaggeration of what they do professionally and/or a cheapening of the story.&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;If you want to use the above terms, fine, but realize it&amp;#8217;s a misuse. &lt;/p&gt; &lt;p&gt;The real point, however, is that we should each be humbled by this story and realize how we&amp;#8217;ve failed to serve others personally when opportunities have presented themselves. We should keep our eyes peeled for the people in need we run across and give of ourselves sacrificially. This isn&amp;#8217;t a parable about serving others in the abstract, but of giving up that which is valuable to serve others directly and personally.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:andrew.sterling.hanenkamp.com,2009://4.669</guid>
         <pubDate>Tue, 25 Aug 2009 21:22:57 -0700</pubDate>
      </item>
      <item>
         <title>Be Careful What Government You Wish For</title>
         <link>http://andrew.sterling.hanenkamp.com/2009/08/be-careful-what-government-you.html</link>
         <description>&lt;blockquote&gt;&lt;p&gt;So Samuel told all the words of the Lord to the people who were asking for a king from him. He said, &amp;#8220;These will be the ways of the king who will reign over you: he will take your sons and appoint them to his chariots and to be his horsemen and to run before his chariots. And he will appoint for himself commanders of thousands and commanders of fifties, and some to plow his ground and to reap his harvest, and to make his implements of war and the equipment of his chariots. He will take your daughters to be perfumers and cooks and bakers. He will take the best of your fields and vineyards and olive orchards and give them to his servants. He will take the tenth of your grain and of your vineyards and give it to his officers and to his servants. He will take your male servants and female servants and the best of your young men and your donkeys, and put them to his work. He will take the tenth of your flocks, and you shall be his slaves. And in that day you will cry out because of your king whom you have chosen for yourselves, but the Lord will not answer you in that day. &amp;#8212; 1 Samuel 8:10-18&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;Someone asked me this week why I am &amp;#8220;terrified&amp;#8221; of government. &amp;#8220;Terrified&amp;#8221; is certainly too strong a word, but I&amp;#8217;d certainly say I&amp;#8217;m cautious and wary of government. This passage in 1 Samuel does a marvelous job of explaining why. &lt;/p&gt; &lt;p&gt;For those who may not know, the nation of Israel escaped from the tyranny of Pharaoh and conquered Canaan (modern day Israel) before 1200 BC. The settled the Promised Land at this time and took as their own, as the land God had promised their forefathers. For the following 200 years, the nation of Israel lived in what we&amp;#8217;d probably call anarchy today. You can read about this period in your Bible by reading the Book of Judges. &lt;/p&gt; &lt;p&gt;Essentially, Israel was divided up into sections by tribe. During this time, they existed primarily as city-states, where each major city had elders that handled local government and exerted influence over the nearby land and villages. The tribes of Israel warred against one another from time to time, but were mostly allied with one another. Yet, they had no central authority, at least nothing we&amp;#8217;d recognize as such today. During times of crisis, God would raise up a &amp;#8220;judge&amp;#8221; who took leadership over Israel and resolved the crisis. Samson is probably the most infamous of these judges and Samuel the most famous.&lt;/p&gt; &lt;p&gt;After living under this system for a couple hundred years (longer if you look back to the times of Joshua and Moses), the Israelites had had enough. They demanded that God give them a king. Samuel, who was also a prophet, had been judge over Israel shortly before this time and had appointed his sons Joel and Abijah to be judges. Though Samuel had been just, his sons were not and took bribes. (1 Samuel 7) &lt;/p&gt; &lt;p&gt;At this time, the people began demanding a king. &amp;#8220;Then all the elders of Israel gathered together and came to Samuel at Ramah and said to him, &amp;#8216;Behold, you are old and your sons do not walk in your ways. Now appoint for us a king to judge us like all the nations.&amp;#8217;&amp;#8221; (1 Samuel 8:4-5) We see that a king was something different from a judge in that what a judge was differs from what the other nations called a king. You can read above to see what many of those differences amounted to, but the gist is that under the judges, the people were closer to the Kingdom of God. (1 Samuel 10:7) A judge merely adjudicates and provides a relatively weak leadership role. More of a consul than a Caesar. A king is permanent, comes with the trappings of royalty, adds bureaucracy, industry, and taxes, and has absolute authority.&lt;/p&gt; &lt;p&gt;When we read on, we find out that this desire displeased not only Samuel, but God. &amp;#8220;But the thing displeased Samuel when they said, &amp;#8216;Give us a king to judge us.&amp;#8217; And Samuel prayed to the Lord. And the Lord said to Samuel, &amp;#8216;Obey the voice of the people in all that they say to you, for they have not rejected you, but they have rejected me from being king over them. According to all the deeds that they have done, from the day I brought them up out of Egypt even to this day, forsaking me and serving other gods, so they are also doing to you. Now then, obey their voice; only you shall solemnly warn them and show them the ways of the king who shall reign over them.&amp;#8217;&amp;#8221; (1 Samuel 8:6-9) What follows this paragraph in scripture is the warning given at the top of this post.&lt;/p&gt; &lt;p&gt;Clearly, a king is not what God wanted for his nation, but as God so often does, he lets people have what they want. Not only that, he gives &amp;#8220;them up to dishonorable passions.&amp;#8221; (Romans 1:26-27)&lt;/p&gt; &lt;p&gt;What does that have to do with today? Everything. While we lack a king over us, our government is still based upon the same kind of sovereignty that kings have. Previously, such sovereignty was philosophically derived from the Divine Right of Kings or simply who possessed the most power in force. &lt;/p&gt; &lt;p&gt;Our government is philosophically based upon the Inalienable Rights of people who use their liberties to choose leaders and, in a sense, our ownership of weapons to provide the force necessary to keep powerful people in check. The Divine Right has transfered from a patriarchal monarchy to the wisdom or folly of the people. We have the awesome responsibility of choosing the people who stand in authority over us. Once they have authority, they can do all the things threatened in 1 Samuel 8:10ff, even make us slaves. We have the brute force option open to us, but, fortunately, we have been and remain very, very reluctant to apply that force.&lt;/p&gt; &lt;p&gt;George Washington put it well in 1797, &amp;#8220;Government is not reason. It is not eloquence. Government is force; like fire it is a dangerous servant&amp;#8212;and a fearful master.&amp;#8221; I would not want to do without some form of government. Yet, I prefer to keep that government in a small box, like the gas fire that warms my house in winter. &lt;/p&gt; &lt;p&gt;The government we have has astonishing authority, authority that the nation&amp;#8217;s founders warned us against. Samuel warns Israel against the use of this authority and we should heed that warning. We have sacrificed liberty in the name of safety. We have sacrificed happiness in exchange for license. We have sacrificed life for convenience. Soon, I fear, we shall exchange health in the name of compassion.&lt;/p&gt; &lt;p&gt;Were my hope resting upon men and government, I would certainly be terrified. (Proverbs 1:20-33) However, I could only be terrified if I had no hope for myself and my children. &amp;#8220;The Lord is my light and my salvation; whom shall I fear? The Lord is the stronghold of my life; of whom shall I be afraid?&amp;#8221; (Psalm 27:1)&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:andrew.sterling.hanenkamp.com,2009://4.668</guid>
         <pubDate>Sat, 22 Aug 2009 12:50:39 -0700</pubDate>
      </item>
      <item>
         <title>Mario AI Competition and Perl</title>
         <link>http://contentment.org/2009/08/mario-ai-competition-and-perl.html</link>
         <description>&lt;p&gt;Last week, a coworker let me know about this. It&amp;#8217;s been on Slashdot and such, but I&amp;#8217;m a little behind on my feeds. For some reason, the competition intrigued me so I&amp;#8217;ve put together a set of Perl classes that will allow agents written in Perl to control the Mario AI simulator using the server agent. I considered trying Java, but I started and quickly remembered why I hate Java, so I quit that and wrote this up over the weekend instead. You can fork it and give it a look here.&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://github.com/zostay/AI-Mario/tree/master"&gt;http://github.com/zostay/AI-Mario/tree/master&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;It includes a very stupid and blind robot for testing at this point. However, it is able to get through most levels I&amp;#8217;ve tried on difficulty 0 (though, not many on any higher difficulty). Once you install that and fetch the latest JAR file from the Mario AI competition site:&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://github.com/zostay/AI-Mario/tree/master"&gt;http://groups.google.com/group/mariocompetition/files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;You can then run an agent via:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;java -jar iMario.jar -server on
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;to start the server, then:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;cd AI-Mario
bin/agent.pl
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This will run the blind Perl agent (named &lt;code&gt;AI::Mario::Agent::Simple&lt;/code&gt;) on the same level over and over. A more interesting run might be:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;bin/agent.pl --config AI::Mario::Config::Random -o level_difficulty=2
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This will run the same agent through a random series of levels (restarting each time the agent wins or loses) and sets the level difficulty to 2&amp;#8212;which means, the simple agent nearly always loses.&lt;/p&gt; &lt;p&gt;The system is built with Modern Perl (i.e. Moose) and uses POE and POE::Declarative to talk to the Mario AI server agent. You can implement new configuration (to customize how options are set at the start of each run) and agent and set them to run using the arguments available on the CLI.&lt;/p&gt; &lt;p&gt;To write an agent, for example, you just need to create a class that does the &lt;code&gt;AI::Mario::Agent&lt;/code&gt; role and implements the required methods.&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;&lt;strong&gt;name&lt;/strong&gt;: should return the agent name to be sent to the server agent as greetings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reset&lt;/strong&gt;: a method called to reset the agent when a simulation is about to start&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;update&lt;/strong&gt;: a method called during each frame, given an observation object (see &lt;code&gt;AI::Mario::Observation&lt;/code&gt;) and should set the &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;duck&lt;/code&gt;, &lt;code&gt;jump&lt;/code&gt;, and &lt;code&gt;run&lt;/code&gt; controls appropriately to keep moving.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fitness&lt;/strong&gt;: this is called at the end of the simulation with a fitness report to tell the agent how well it did (see &lt;code&gt;AI::Mario::Fitness&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Then, you can run your agent via:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;bin/agent.pl --agent MyAgentClass -p foo=1
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;where you can pass a series of parameters to the agent constructor using the &lt;code&gt;-p&lt;/code&gt; option.&lt;/p&gt; &lt;p&gt;I plan to add a bit more to it, but the interface is mostly set.&lt;/p&gt; &lt;p&gt;I&amp;#8217;m not even sure they&amp;#8217;ll accept a Perl submission, but it seems to be implied by the instructions on the site. I&amp;#8217;ve asked to be sure. If I can confirm that, I&amp;#8217;ll also add a &lt;code&gt;Makefile.PL&lt;/code&gt; and such so that the solution can be packaged with all the required libraries to make it run.&lt;/p&gt; &lt;p&gt;I still haven&amp;#8217;t decided whether or not to enter or just goof around, but whatever. :)&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Julian already replied. Yes, Perl submissions would be accepted. I&amp;#8217;ll definitely try to add a submission script which will help build all the requirements to submit.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.667</guid>
         <pubDate>Mon, 17 Aug 2009 07:15:30 -0700</pubDate>
      </item>
      <item>
         <title>Goofing Around with HTML 5 Canvas</title>
         <link>http://contentment.org/2009/08/goofing-around-with-html-5-can.html</link>
         <description>&lt;p&gt;I was goofing around with HTML 5 canvas for giggles this week. The canvas allows you to draw using JavaScript to a section of the page. HTML 5 defines a &amp;#8220;2d&amp;#8221; context, which allows you to draw lines, polygons, images, boxes, etc. You can style your stroke, fill, and shadow, etc. It&amp;#8217;s pretty easy to goof around with. Oh, and if you&amp;#8217;re using Internet Explorer, these won&amp;#8217;t work. You&amp;#8217;re out of luck because Microsoft is too cool for canvas.&lt;/p&gt; &lt;h3&gt;Box Fractal Renderer&lt;/h3&gt; &lt;p&gt;First, I built a box fractal renderer, which are my favorite things to doodle on graph paper.&lt;/p&gt; &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Fractal Coastline&lt;/h3&gt; &lt;p&gt;Then, I played some more with fractals and eventually ended up with this fractal coastline builder. Each view of this will be a little different. Some look more like coastlines than others.&lt;/p&gt; &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Anyway, just some random goofing off I thought I&amp;#8217;d share.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.666</guid>
         <pubDate>Fri, 07 Aug 2009 21:53:04 -0700</pubDate>
      </item>
      <item>
         <title>Time Estimation Sucks</title>
         <link>http://contentment.org/2009/07/time-estimation-sucks.html</link>
         <description>&lt;p&gt;From the perspective of myself, a software developer, time estimation always sucks. I believe I&amp;#8217;m working in an environment which has a better view of time estimation than those I&amp;#8217;ve worked in before, but we still do it and I think that it&amp;#8217;s sucking is inherent. I&amp;#8217;ll explain why in a minute.&lt;/p&gt; &lt;p&gt;However, I want to say that time estimation is probably essential for project managers, product managers, executives, sales, and the like. For them, perhaps they can provide a barometer giving them a good indication of where things will be in the future. However, I don&amp;#8217;t speak for any of them, I&amp;#8217;m speaking from the selfish position in which I stand (as we all do and would admit when we&amp;#8217;re being honest).&lt;/p&gt; &lt;h3&gt;Time Estimates are Guesses&lt;/h3&gt; &lt;p&gt;A time estimate is, by definition, going to be inaccurate. Until someone finds a prophet willing to use his gift for mundane predictions like, &amp;#8220;How long will this new feature take to implement?&amp;#8221; Or, &amp;#8220;What&amp;#8217;s the timeline on this fix?&amp;#8221; The answer will be wrong. &lt;/p&gt; &lt;p&gt;To a person without the training it may seem like a software developer works magic and comes up with solutions, but that&amp;#8217;s not the case. She&amp;#8217;s merely working through developing an explicit set of directions, logic, and math to allow the computer to do something. However, the complexity of a problem is rarely well-known until you try to work through it. Thus, you don&amp;#8217;t know what problems you are going to run into.&lt;/p&gt; &lt;p&gt;This is further complicated by the fact that you have to work within some framework including programming language, available libraries, code already in built up, customer expectations, code maintainability, solution flexibility, etc. A software developer often has to make decisions and compromises along the way and it&amp;#8217;s not always clear what the ramifications of each of these decisions will have.&lt;/p&gt; &lt;h3&gt;Implied Margin of Error&lt;/h3&gt; &lt;p&gt;All time estimates include an implied, but rarely recorded or even knowable, margin of error. When I estimate the time it will take to do something, I will often say something like, &amp;#8220;Well, since I just did a very similar process in importing that fail for client X, it will take about 2/3rd&amp;#8217;s as much time to do it for client Y since I&amp;#8217;m familiar with the code and added some pieces there to make doing this task easier.&amp;#8221; I&amp;#8217;m implying a narrow margin of error.&lt;/p&gt; &lt;p&gt;On the other hand, I might say, &amp;#8220;Well, the code in that part of the application was not well future-proofed and this will build on there. I may have to do some refactorings, so I&amp;#8217;d say we&amp;#8217;re looking at 2 days, plus or minus a week.&amp;#8221; I&amp;#8217;m even stating it here, the large margin error.&lt;/p&gt; &lt;p&gt;Yet, what if the first task turns out to take 5 times as long as I said, does that mean my margin of error was wrong or does that mean I was operating on incomplete information? &lt;/p&gt; &lt;p&gt;When a meteorologist says, &amp;#8220;50%&amp;#8221; chance of rain, is he wrong when it rains on your house? Or when it doesn&amp;#8217;t? No, it was just an estimate, which is a statistical entity that cannot be analyzed on those terms as a data point. Only after you have a collection of data points that shows that when the meteorologist suggested 50% chance of rain, it actually rained 60% of the time. Then, he&amp;#8217;s been wrong (and even in this analysis, you have to be careful about data bias and all the other statistical issues your analysis may contain).&lt;/p&gt; &lt;h3&gt;Large Estimates&lt;/h3&gt; &lt;p&gt;Getting into the actual business case, we find that making a large time estimate on something will get you into trouble when you make the estimate. &lt;/p&gt; &lt;p&gt;I recall a case when I suggested I was starting on something during the last week of December after Christmas. I broke the task down into all the steps I would have to do to complete the task and concluded that an reasonable estimate of time would be the end of the second week of February. I told this to the executive in charge of the product and he said, &amp;#8220;We&amp;#8217;d really like to be able to tell the clients the start of the third week in January.&amp;#8221; I said, &amp;#8220;No. I don&amp;#8217;t think that&amp;#8217;s reasonable.&amp;#8221; He said, &amp;#8220;We&amp;#8217;d really like to be able to tell the clients the start of the third week in January.&amp;#8221; In other words, &amp;#8220;I don&amp;#8217;t care what your estimate is, this is the estimate we&amp;#8217;ll use.&amp;#8221; My response, &amp;#8220;I will give you something at that time, but it won&amp;#8217;t be finished.&amp;#8221; &lt;/p&gt; &lt;p&gt;In this case, it actually took all the way through April to get it done, largely because the project ended up having twice as many features as originally spec&amp;#8217;d.&lt;/p&gt; &lt;p&gt;As a software developer, I am strongly motivated to report short estimates to avoid pressure from above. Sometimes, however, a long estimate is the only one that will work, but I always expect to be criticized if I give a long estimate on something.&lt;/p&gt; &lt;h3&gt;Short Estimates&lt;/h3&gt; &lt;p&gt;If I end up giving an estimate for a project that actually takes me 2 to 5 times as long to complete, then I&amp;#8217;m in big trouble. These are the times when executives yell at people. Directors and project leads ask you what lessons you&amp;#8217;ve learned, and if someone really gets upset, you have weekly phone calls with someone in HR listening in.&lt;/p&gt; &lt;p&gt;So here&amp;#8217;s where making a long estimate for a short task seems like a good idea. But then, what happened in the last section? There&amp;#8217;s no win in this game.&lt;/p&gt; &lt;h3&gt;Accurate Estimates&lt;/h3&gt; &lt;p&gt;So what happens when you get it dead on? Do you get a big promotion, cigars and cognac with the executives, and a fat bonus? Nope. You just plod on. You might get such if you made a long estimate, got away with it, and then delivered way early, but that might just mean you&amp;#8217;re a good con-artist, not necessarily good at estimating your time.&lt;/p&gt; &lt;h3&gt;What&amp;#8217;s the Answer?&lt;/h3&gt; &lt;p&gt;I don&amp;#8217;t have one for managers. That&amp;#8217;s not my problem, but managing my managers is. So, here&amp;#8217;s the solution (at least what seems to work best for me at this point):&lt;/p&gt; &lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Communicate frequently with the bosses.&lt;/strong&gt; Anyone you know to be a stakeholder in your project should get something from you often enough to keep them in the loop, but not so often they get annoyed. Hard to balance, but in generally you ought to be talking to your supervisor at least once every day, your project/product managers should get information at least twice a week and as much as once every day, and executives should get direct feedback from you once a week if they have a stake.&lt;/p&gt; &lt;p&gt;And if you find out something is really critical to someone, update them as often as your supervisor. If it&amp;#8217;s an emergency or something critical to a sales pitch being made tomorrow, send out an update at every stopping point. &lt;/p&gt; &lt;p&gt;Regular status reports help managers feel in control and you want them to feel in control. If they feel out of control, expect them to blame you for not telling them what was going on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make your guesses as good as you can.&lt;/strong&gt; On complex tasks, break the task down as far as you can ahead of time and estimate each piece. Give yourself an explicit margin of error and percentage of accuracy you&amp;#8217;d place on that margin. Sum up the time estimates and margins and use that to present you estimate. Take some time to do this well, don&amp;#8217;t rush and spend more time considering the harder to estimate parts.&lt;/p&gt; &lt;p&gt;When you give your estimate, you might share some or all of this with your supervisor (depending on how well you think he&amp;#8217;ll be able to cope with the information). Don&amp;#8217;t give this to anyone else, but use this information to determine how to talk about it when reporting on your estimate. Use vague, fuzzy language for parts you aren&amp;#8217;t sure about and use concise, direct language on the parts you are pretty sure about.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stand by your estimate.&lt;/strong&gt; If your boss says, &amp;#8220;Unacceptable,&amp;#8221; or doubts you, listen to them and explain more about your estimate. Especially if you&amp;#8217;ve worked through the time it will take in details, wavering in a moment of doubt is probably not going to serve you or anyone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be flexible.&lt;/strong&gt; If the bosses need a shorter estimate for some reason or even expected a longer one, use that to your advantage. If you&amp;#8217;ve done your homework and got it with you, perhaps you can negotiate parts of the spec away that aren&amp;#8217;t as critical in order to cut down on time. Or perhaps there are things you can iron out a little better and get working really well in the time you have. Or perhaps you can use that opportunity at the tail end to get better testing and quality in place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Meekness wins when all else fails.&lt;/strong&gt; Never ever burn your bridges. When it hits the fan because you prove to be the woeful prophet you are, stand by your mistake, but stay calm. Be humble. You might have a really good idea what went wrong, but your bosses are pointing at something else. Point that out, but don&amp;#8217;t beat them with it if they disagree.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt; &lt;p&gt;Other than that, be you. I work really hard to never blame someone for a mistake, even if they made it. I do not tell on fellow employees when they aren&amp;#8217;t doing their job. However, I try to make it a point to point out excellence in my fellows whenever I can. I don&amp;#8217;t feel like it&amp;#8217;s my job to do management (which, in my mind, means correcting and rebuking employees when they fail at something), but pointing out excellence and success is everyone&amp;#8217;s business. If I really appreciate something a fellow developer has done or someone on the business side writing a really great spec, I try to make it a point to say so in conversation. Unfortunately, being the loner that I am, I don&amp;#8217;t think I notice these things as often as I could.&lt;/p&gt; &lt;p&gt;Time estimation sucks, but it&amp;#8217;s pretty much inevitable. The key is understanding why it sucks and how to deal with that.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.664</guid>
         <pubDate>Tue, 28 Jul 2009 18:43:22 -0700</pubDate>
      </item>
      <item>
         <title>Weight Loss, My Way</title>
         <link>http://contentment.org/2009/06/weight-loss-my-way.html</link>
         <description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; &lt;em&gt;IANAD: I AM NOT A DOCTOR. Please consult one prior to engaging in any attempt at weight loss. I provide no recommendation you do things my way and take no responsibility for your health.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Disclaimer 2:&lt;/strong&gt; &lt;em&gt;I am not affiliated with, have never given money to, and have no relationship at all with the &lt;strong&gt;Unnamed Diet System&lt;/strong&gt; I have based my diet plan upon. I do not recommend for or against their system, I am just sharing the fact that I my own variation of it and have had success.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Since my birthday this year, I&amp;#8217;ve been working to lose a little extra weight. I now weigh around what I did when I was in high school and am still losing. I did this to show solidarity with my wife who wanted to lose a bit, but I needed to do this for myself as well.&lt;/p&gt; &lt;p&gt;Wanting to lose weight presented a few problems for me. First, I can not stand to do what somebody else tells me to do. My wife calls that being &amp;#8220;obstinate-defiant.&amp;#8221; Depending on my mood I usually either say I&amp;#8217;m just selfish or I have a built-in distrust of the crowd. In any case, it was clear that unless I could tweak my plan a bit, I wasn&amp;#8217;t going to be be happy with it. I&amp;#8217;ve ended up tweaking less than I thought I would, but I still can, so there.&lt;/p&gt; &lt;p&gt;My next problem is that I refuse to do cruel or unusual dieting. I&amp;#8217;m not going in for any fad or diet that drastically changes things. I&amp;#8217;m not giving up cookies or eating grapefruit or doing Adkins. Regardless of what science there is or is not backing these things up, anything that changes what I eat is going to make me grumpy. I &lt;em&gt;love&lt;/em&gt; food and there is no shame in that. The shame comes in consistently eating more than I need. I also find the idea of using a pill or surgery repulsive (no offense to those who do such, I won&amp;#8217;t). For me, this process is about developing self-control, which means I need to learn to do it and my wife provides enough accountability to that end.&lt;/p&gt; &lt;p&gt;While metabolism and other factors adjust a person&amp;#8217;s dietary needs, failure to consume enough calories to maintain a person&amp;#8217;s current weight will cause a reduction. (Unless, which I suppose is possible, a person&amp;#8217;s body is somehow capable of storing fat, but incapable of using it. I don&amp;#8217;t know if any such disease exists, but I don&amp;#8217;t have it if it does, so it&amp;#8217;s not my problem.) Therefore, my diet plan would have to be something as mundane as journaling what I eat.&lt;/p&gt; &lt;p&gt;Which brings up my next problem, counting calories is too easy and not really addressing the full magnitude of the problem. Because not only should I eat less, but I should encourage myself to eat healthier. The system ought to take other factors into account.&lt;/p&gt; &lt;p&gt;My final problem is that whatever it is I do must be something I can do on a computer. I sit in front of one for around 8-12 hours per day. I can set my computer to remind of things, I can share things between myself and my wife to provide accountability on my computer, and while I like writing down notes, particularly when I&amp;#8217;m brainstorming, I really don&amp;#8217;t want to do all the math we&amp;#8217;re talking about in my head all the time. It&amp;#8217;s too tedious.&lt;/p&gt; &lt;p&gt;Fortunately, my wife &lt;a rel="nofollow" target="_blank" href="http://terri.hanenkamp.com/ww/"&gt;previously&lt;/a&gt; went on and successfully completed a plan using &lt;strong&gt;Unnamed Diet System&lt;/strong&gt; for which you may have seen ads. This system met all my basic requirements. Yet, other than they way they count points, they don&amp;#8217;t provide any value to me, at least none I would pay for. Fortunately, everything I needed was published at various places on the Internet and I built myself a Google Docs spreadsheet to do it.&lt;/p&gt; &lt;p&gt;I provide a link to a version of it here for anyone interested in weight loss on similar terms. &lt;em&gt;Go re-read the disclaimers again now.&lt;/em&gt; I&amp;#8217;ll wait&amp;#8230; Done? Okay, I don&amp;#8217;t recommend this plan to you, but if you find the spreadsheet useful, great. I&amp;#8217;m providing it under a &lt;a rel="nofollow" target="_blank" href="http://creativecommons.org/licenses/by/3.0/us/"&gt;Creative Commons 3.0&lt;/a&gt; license. &lt;/p&gt; &lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://spreadsheets.google.com/ccc?key=rEBiFNc8PjWLNtjKepbm00g"&gt;Food Points Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;If you have a Google account, you can create a copy of the spreadsheet to use it or you can download it in another format to use with Excel or OpenOffice (I think, haven&amp;#8217;t tried that).&lt;/p&gt; &lt;p&gt;To use it, I first scroll right until I fill in some information about myself. This sets up the basic tolerances for my diet plan based upon sex, age, current weight, height, daily activity, etc. Then scroll back left and log my consumption. Under each meal, the wide column is for a description of the item eaten and the narrow for recording the points. Once I have &amp;#8220;0&amp;#8221; points left for the day, I stop eating. The spreadsheet does have a weekly allowance of extra points that I can use as well to indulge in something or just allow me to consume all the points for a day without worrying about going over by a couple. I use all the points I have for a day unless I&amp;#8217;m really not hungry. This is not a starvation diet, so I try to use up as many of my daily points as possible. I do not worry too much about using or not using the weekly points. I often consume most of them.&lt;/p&gt; &lt;p&gt;The formula for calculating this points is simple, but elegant in that it encourages me to get more fiber and avoid fatty foods, while consuming fewer calories than I need to maintain my weight:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;Points = Calories / 50 + Fat (g) / 12 + MIN(Fiber (g) / 5, 1)
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;I&amp;#8217;ve been told that &lt;strong&gt;Unnamed Diet System&lt;/strong&gt; actually divides Fiber by 4, but whatever. I have embedded a couple calculators in the spreadsheet for the times when I&amp;#8217;m too lazy to do the math in my head.&lt;/p&gt; &lt;p&gt;I weigh myself once a week to track my progress (on a separate spreadsheet).Every 10 pounds, I adjust the chart to the right since the spreadsheet gives one less point per day for each 10 pounds I lose. I also copy the spreadsheet (actually, Terri manages this part) each week and blank it out to use the next week.&lt;/p&gt; &lt;p&gt;Eventually, I should reach my goal weight (I haven&amp;#8217;t really decided what that is). When that happens, I&amp;#8217;ll need to adjust the spreadsheet to deal with maintenance. When that happens, I will give myself more points until my weight stabilizes. I plan to continue recording points for the foreseeable future this way.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.662</guid>
         <pubDate>Thu, 25 Jun 2009 10:24:04 -0700</pubDate>
      </item>
      <item>
         <title>Wascally Perl Operators</title>
         <link>http://contentment.org/2009/06/wascally-perl-operators.html</link>
         <description>&lt;p&gt;I just finished writing a test that discovered I&amp;#8217;d made a rather dumb and (upon looking back) rather obvious mistake in a return value in &lt;a rel="nofollow" target="_blank" href="http://qublog.net"&gt;this Perl application&lt;/a&gt; I&amp;#8217;m working on. The mistake involves a certain errant combination of &lt;code&gt;return&lt;/code&gt; and &lt;code&gt;and&lt;/code&gt; must be dealt with carefully.&lt;/p&gt; &lt;p&gt;The particular bit of code looks something like this:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sub blah { return $foo and $bar;
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;For those who don&amp;#8217;t know Perl intimately, Perl has two &amp;#8220;and&amp;#8221; operators. One named &amp;#8220;and&amp;#8221; and the other named &amp;#8220;&amp;amp;&amp;amp;&amp;#8221; like C. These are not strict synonyms. They are both shortcut operators, but the &amp;#8220;&amp;amp;&amp;amp;&amp;#8221; and the &amp;#8220;and&amp;#8221; sit at very different places in the operator precedent order. In Perl &amp;#8220;&amp;amp;&amp;amp;&amp;#8221; has a relatively high precedent and &amp;#8220;and&amp;#8221; is very, very low.&lt;/p&gt; &lt;p&gt;Back to the problem: this return was returning true when &lt;code&gt;$foo&lt;/code&gt; was true and &lt;code&gt;$bar&lt;/code&gt; was false. After rereading this line I smacked my forehead and said, &amp;#8220;Duh!&amp;#8221; The problem is that &amp;#8220;return&amp;#8221; actually has a higher operator precedent than &amp;#8220;and&amp;#8221; so this is how Perl would break it out if it showed the AST with parenthesis:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sub blah { (return $foo) and ($bar);
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This means the code immediately return &lt;code&gt;$foo&lt;/code&gt; in all circumstances. I might as well have just written:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sub blah { return $foo;
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;The solution, then, is to either use the &amp;#8220;&amp;amp;&amp;amp;&amp;#8221; operator:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sub blah { return $foo &amp;amp;&amp;amp; $bar;
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Or use explicit parenthesis:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sub blah { return ($foo and $bar);
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Or don&amp;#8217;t use the &amp;#8220;return&amp;#8221; operator (since subroutines in Perl always return the value of the last expression executed):&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sub blah { $foo and $bar;
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.660</guid>
         <pubDate>Tue, 02 Jun 2009 20:34:13 -0700</pubDate>
      </item>
      <item>
         <title>Converting from iTunes to Banshee</title>
         <link>http://contentment.org/2009/05/converting-from-itunes-to-bans.html</link>
         <description>&lt;p&gt;This past week I purchased for myself a mini laptop. I wanted something nice and portable that I could use for personal use on trips and do hobby projects on. This thing is great. I got Ubuntu installed and started playing around since it&amp;#8217;s been a couple years since I had a Linux desktop, and even then I usually had a Mac OS X laptop I used with it. As such, when it came to copy over my music and such, I needed to convert to a new music player. I&amp;#8217;ve settled on &lt;a rel="nofollow" target="_blank" href="http://banshee-project.org/"&gt;Banshee&lt;/a&gt; for the moment.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; There&amp;#8217;s no import tool out there to go from iTunes to the current version of Banshee. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; However, the process turned out to be not so hard for me. Here&amp;#8217;s what I did:&lt;/p&gt; &lt;ol&gt;
&lt;li&gt;Copied the iTunes music folder from my Mac to the music folder on my new laptop.&lt;/li&gt;
&lt;li&gt;Started up Banshee and used Media &amp;gt; Import Media&amp;#8230; to tell Banshee where to find all the files and let it do it&amp;#8217;s thing.&lt;/li&gt;
&lt;li&gt;Went back into iTunes on my old machine and used File &amp;gt; Library &amp;gt; Export Library&amp;#8230; to generate a &lt;code&gt;Library.xml&lt;/code&gt; file, which I copied to the new laptop&lt;/li&gt;
&lt;li&gt;Ran a Perl script I wrote to pull out the play lists, song play counts, last play date, and ratings and push them into the Banshee database&lt;/li&gt;
&lt;/ol&gt; &lt;p&gt;Fortunately the &lt;code&gt;Library.xml&lt;/code&gt; file output by iTunes is in a standard format that is pretty easy to understand. Also, Banshee keeps much of the information about your music and such in a SQLite database. So, I could very easily automatically copy over all the ratings and other information I&amp;#8217;ve been assembling for the past several years.&lt;/p&gt; &lt;p&gt;Here&amp;#8217;s the conversion script, &lt;code&gt;itunes-to-banshee.pl&lt;/code&gt; that I wrote for download:&lt;/p&gt; &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-file" style="display:inline;"&gt;&lt;a rel="nofollow" target="_blank" href="http://contentment.org/files/itunes-to-banshee.pl"&gt;Download itunes-to-banshee.pl&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Update (thanks to Rolo):&lt;/strong&gt; You will need to install a few dependencies as well. On Debian or Ubuntu, this is done by installing:&lt;/p&gt; &lt;ul&gt;
&lt;li&gt;libdatetime-perl &lt;/li&gt;
&lt;li&gt;libdatetime-format-iso8601-perl &lt;/li&gt;
&lt;li&gt;libclass-dbi-sqlite-perl&lt;/li&gt;
&lt;li&gt;libxml-twig-perl&lt;/li&gt;
&lt;li&gt;libmime-base64-perl&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;This can be done from Synaptics or by running this on the command-line:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;sudo apt-get install libdatetime-perl libdatetime-format-iso8601-perl &amp;#92; libclass-dbi-sqlite-perl libxml-twig-perl libmime-base64-perl
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Once Banshee has finished adding your song files to its music library, close Banshee. Make a backup copy of &lt;code&gt;banshee.db&lt;/code&gt; to somewhere in case something goes wrong (which can be found at &lt;code&gt;~/.config/banshee-1/banshee.db&lt;/code&gt;). Then run:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;perl itunes-to-banshee.pl Library.xml ~/.config/banshee-1/banshee.db
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This may take a few minutes, depending on how many songs you have. It might show you some warnings if your &lt;code&gt;Library.xml&lt;/code&gt; is weird (remember I wrote this just for me). It may also tell you if it can&amp;#8217;t find some songs in Banshee that it found in your &lt;code&gt;Library.xml&lt;/code&gt;. (It did for me because I&amp;#8217;d deleted some songs from the disk and iTunes never figured it out.)&lt;/p&gt; &lt;p&gt;Once it finishes, start Banshee back up and it should have the play lists, ratings, play counts, and last played date set for all the songs that had such information in iTunes.&lt;/p&gt; &lt;p&gt;There are a couple things you might want to know about how the program works. First, it does not touch smart play lists. I don&amp;#8217;t know and don&amp;#8217;t particularly care how to read the smart playlist configuration from iTunes. I was able to recreate the smart play lists I had in a few minutes.&lt;/p&gt; &lt;p&gt;Second, the import script uses the song title and song file size to match songs from the iTunes library in the Banshee library. This is probably safe since I&amp;#8217;ve never seen two CDs with the same songs on them end up being the same size, but it&amp;#8217;s theoretically possible it could be a problem.&lt;/p&gt; &lt;p&gt;Third, if you have duplicates in your library, this script will only change one of them. I&amp;#8217;d recommend weeding those out first.&lt;/p&gt; &lt;p&gt;I&amp;#8217;m not interested in maintaining the script, but I&amp;#8217;ll answer questions about it. If you ask really nicely and I&amp;#8217;m in a good mood and the change you want is very small, I might be willing to make it, but that&amp;#8217;s a lot of &amp;#8220;ifs&amp;#8221; to line up.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.659</guid>
         <pubDate>Fri, 22 May 2009 16:12:40 -0700</pubDate>
      </item>
      <item>
         <title>The Best Way to Add Icons</title>
         <link>http://contentment.org/2009/05/the-best-way-to-add-icons.html</link>
         <description>&lt;p&gt;With my work on &lt;a rel="nofollow" target="_blank" href="http://qublog.net"&gt;qublog.net&lt;/a&gt; continuing to progress toward hosting this service on the qublog.net web site. I&amp;#8217;ve been using the &lt;a rel="nofollow" target="_blank" href="http://www.famfamfam.com/lab/icons/silk/"&gt;silk icon set&lt;/a&gt; for the icons, but recently decided to switch over to the &lt;a rel="nofollow" target="_blank" href="http://www.pinvoke.com/"&gt;fugue icons&lt;/a&gt;. In the process, I rethought how I added icons to the system, which I subsequently chose to try on some work things as well. There&amp;#8217;s no magic here, nothing to patent (at least I hope not), but it&amp;#8217;s worked pretty well, so I&amp;#8217;ll share. I suppose this might not be &amp;#8220;The Best Way&amp;#8221;, but it&amp;#8217;s certainly now &amp;#8220;My Best Way.&amp;#8221;&lt;/p&gt; &lt;p&gt;First, these icons are all being added without IMG-tags. This keeps my content less cluttered and allows me to very quickly switch icons if I change my mind later just be changing my stylesheet. Typically, these are added to buttons, links, and spans like so:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;span class="icon o-time"&amp;gt;12:44 PM&amp;lt;/span&amp;gt;
&amp;lt;a class="icon v-add o-task"&amp;gt;Create Task&amp;lt;/a&amp;gt;
&amp;lt;input type="submit" class="icon v-save o-time" name="op" value="Save"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;The first class &amp;#8220;icon&amp;#8221; performs the work of making sure the icon itself is attached to the element properly. This looks like:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;.icon { padding-left: 18px; background-repeat: no-repeat; background-position: 1px 1px; min-height: 18px;
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This basically makes sure that my 16 pixel icon has 1 pixel of space around it and makes sure the element is at least tall enough not to cut anything off.&lt;/p&gt; &lt;p&gt;Then, the icon itself is chosen by examining the other associated classes. I&amp;#8217;ve divided the classes into nouns (with an &amp;#8220;o-&amp;#8221; prefix), adjectives (with an &amp;#8220;a-&amp;#8221; prefix), verbs (with a &amp;#8220;v-&amp;#8221; prefix), and adverbs (with a &amp;#8220;r-&amp;#8221; prefix). I define these classes within the style sheet in that order so that adjectives will override nouns, verbs override both nouns and adjectives, and adverbs will override everything. So, now my style sheet looks something like this:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;.o-task { background-image: url(ticket.png) }
.o-time { background-image: url(clock.png) } .a-group { background-image: url(folder.png) }
.o-task.a-project { background-image: url(briefcase.png) } .v-add { background-image: url(plus.png) }
.v-add.o-task { background-image: url(ticket__plus.png) }
.v-add.o-task.a-project { background-image: url(briefcase__plus.png) }
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;By setting up the style sheet this way, a regular task reference shows up with a ticket icon. However, a project (which is a kind of task in Qublog) shows up as a briefcase. In case I need a generic add link, I can use a lone plus sign, but if I want a specific add link for tasks I can have a ticket with a plus sign. Finally, I can add a new project with a briefcase with a plus sign.&lt;/p&gt; &lt;p&gt;Later, if I want to modify the icons used, I can do so by just adding another class or something. It&amp;#8217;s pretty flexible and if I make sure and include enough information on every link, span, or button that might have icon, I can make my icons more or less particular later just be adding a line or two to my style sheet. (For example, if my icon set lacked a briefcase with a plus next to it and then added one or I created one, then I could add that last rule later and rely on the ticket with a plus sign in the meantime.)&lt;/p&gt; &lt;p&gt;Some final varations I also use are things like having the icon only and ignoring the text itself:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;.icon.only { display: inline-block; overflow: hidden; white-space: nowrap; width: 0;
}
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Now I can add the &amp;#8220;only&amp;#8221; class to my spans and links and the text becomes hidden. I combine this with a jQuery code similar to this:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;jQuery(document).ready(function() { jQuery('.icon.only').each(function(){ jQuery(this).attr('title', jQuery(this).text()); });
});
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This causes the text of the element itself to show up as a tooltip when you hover your mouse over the icon. Generally speaking, though, I usually try to do this on the server side when I use the &amp;#8220;icon only&amp;#8221; classes.&lt;/p&gt; &lt;p&gt;I have a few other &amp;#8220;icon&amp;#8221; class variants for changing the position of the icon, dealing with small 9-pixel icons, and making sure buttons and specific other things look good with the icons, but I&amp;#8217;ll leave these as exercises for the reader.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.657</guid>
         <pubDate>Wed, 13 May 2009 16:00:00 -0700</pubDate>
      </item>
      <item>
         <title>When Science Becomes Faith</title>
         <link>http://andrew.sterling.hanenkamp.com/2009/03/when-science-becomes-faith.html</link>
         <description>&lt;p&gt;There are a lot of folks out there who claim they have no religion or that they are atheists or agnostics, but many of them are lying. I&amp;#8217;ve found science to be the single most potent false religion of our day and the irony is that most of the followers believe they&amp;#8217;ve somehow avoided being a part of organized religion. I&amp;#8217;m not here to criticize these folks. You are welcome to pursue any belief system you want. I believe quite strongly in free will, but I do want to point out the difference between the pursuit of scientific knowledge and the pursuit of scientific faith.&lt;/p&gt; &lt;p&gt;Science is the search for useful systems of prediction. In science, you do something 100 times and try to figure out what is common between all the times. Can you predict what will happen on the 101st time based upon what has already happened? This is science. Newton&amp;#8217;s science helps us understand what will happen when we throw a basketball or shoot a canon ball: Where will it land? How can I make it go farther? How can I make it go higher? Science helps us find common factors in observed phenomena. This is science as a search for knowledge.&lt;/p&gt; &lt;p&gt;Faith comes in when you decide science can take you one step further, to truth. Truth is what you look for when you try to find meaning to this senselessly unfair life. You have entered the realm of religion when you start trying to fit things together to answer the question: Why? &lt;/p&gt; &lt;p&gt;Science doesn&amp;#8217;t do this on it&amp;#8217;s own, at least as long as it remains an objective search for predicting the outcomes of experiments or finding likely correlations in those observations. When you start trying to say that science shows us why the world works and has meaning, you&amp;#8217;ve created a sacred cow out of science. Now it is your religion. You&amp;#8217;ve taken it out of the world of mathematics and logic and statistics and moved it into a world of philosophy, religion, and faith.&lt;/p&gt; &lt;p&gt;Sometimes when I read scientific literature, I am pleased to read about how useful a theory is at correlating and explaining the relationships of things. Other times, I&amp;#8217;m disappointed to read how a theory shows us why the universe works. Scientific writing that gives species or rocks or the universe a motive, as if they were gods, is really troublesome. Just because a canon ball fired into the air follows a parabolic trajectory doesn&amp;#8217;t mean that the &lt;var&gt;y&lt;/var&gt;=&lt;var&gt;a&lt;/var&gt;&lt;var&gt;x&lt;/var&gt;&lt;sup&gt;2&lt;/sup&gt; is how it works, it just means that the equation happens predict the trajectory.&lt;/p&gt; &lt;p&gt;If you want to believe in science as providing meaning to the universe, feel free. However, realize that you are engaging in a form of faith rather than purely scientific pursuit. Criticizing me for disagreeing with your perception of truth because your truth is based on science and mine is not, is no less dogmatic than my Christian beliefs. Science and religious belief are not orthogonal, but they are not directly correlated either.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:andrew.sterling.hanenkamp.com,2009://4.655</guid>
         <pubDate>Fri, 13 Mar 2009 19:06:20 -0700</pubDate>
      </item>
      <item>
         <title>Mutator Defaults: The Wrong Way</title>
         <link>http://contentment.org/2009/03/mutator-defaults-the-wrong-way.html</link>
         <description>&lt;p&gt;I&amp;#8217;m messing around with Drupal again for a church web site. The task I&amp;#8217;m working with at the moment is trying to make it so that the breadcrumb is based upon a menu other than than that Navigation menu (which is the normal way content breadcrumbs are set in Drupal). Long story short, we&amp;#8217;ve chosen to make the Primary Links the site map rather than the more typical Navigation menu.&lt;/p&gt; &lt;p&gt;The technique that really ought to work is this:&lt;/p&gt; &lt;pre&gt;
menu_set_active_menu_name('primary-links');
$breadcrumb = menu_get_active_trail();
drupal_set_breadcrumb($breadcrumb);
&lt;/pre&gt; &lt;p&gt;That&amp;#8217;s simple enough, but it doesn&amp;#8217;t work. At least, it doesn&amp;#8217;t work unless it gets called at some point very early in the request life cycle. After some digging through the &lt;a rel="nofollow" target="_blank" href="http://api.drupal.org/"&gt;Drupal API&lt;/a&gt;, I found that &lt;code&gt;menu_get_active_trail()&lt;/code&gt; is actually defined like this:&lt;/p&gt; &lt;pre&gt;
function menu_get_active_trail() { return menu_set_active_trail();
}
&lt;/pre&gt; &lt;p&gt;I vaguely remembered this from a year ago when I was last mucking with Drupal. This is a pretty common Drupal idiom. It&amp;#8217;s basically the Drupal developer&amp;#8217;s way of using the mutator (i.e., &lt;code&gt;menu_set_active_trail()&lt;/code&gt;) simultaneously as a accessor and default setting. That&amp;#8217;s fine. However, when you look into &lt;code&gt;menu_set_active_trail()&lt;/code&gt; I found something wrong. The code looks like this (minus some code that I don&amp;#8217;t want to spew here):&lt;/p&gt; &lt;pre&gt;
function menu_set_active_trail($new_trail = NULL) { static $trail; if (isset($new_trail)) { $trail = $new_trail; } elseif (!isset($trail)) { // LOTS OF CODE HERE TO CONFIGURE THE DEFAULT // BASED UPON THE OUTPUT OF menu_get_active_menu_name() } return $trail;
}
&lt;/pre&gt; &lt;p&gt;Do you see the problem? If you happen to set the value returned by &lt;code&gt;menu_get_active_menu_name()&lt;/code&gt; (via &lt;code&gt;menu_set_active_menu_name()&lt;/code&gt;) in time, you can get it to setup your breadcrumb using some fairly smart code that does the right thing for you. &lt;/p&gt; &lt;p&gt;However, if you don&amp;#8217;t set it before the first call to &lt;code&gt;menu_set_active_trail()&lt;/code&gt;, you can &lt;strong&gt;never&lt;/strong&gt; run that helpful default code ever again. There&amp;#8217;s no way to unset &lt;code&gt;$trail&lt;/code&gt; because &lt;code&gt;$new_trail&lt;/code&gt; is ignored if it is unset. There&amp;#8217;s no way to execute the default code without unsetting &lt;code&gt;$trail&lt;/code&gt; since it&amp;#8217;s all within this single function.&lt;/p&gt; &lt;p&gt;Bah! The correct solution is to move the default code into a separate method so that it can be called separately later and reused.&lt;/p&gt; &lt;p&gt;My work-around will probably be to install the &lt;a rel="nofollow" target="_blank" href="http://drupal.org/project/menu_breadcrumb"&gt;Menu Breadcrumb&lt;/a&gt; module. I&amp;#8217;m trying to keep the number of modules installed on this particular site very low, so I was hoping to avoid it. Yet, installing a module is going to work out better than me reinventing the wheel with a module of my own, in this case. It&amp;#8217;s these little frustrations that drove me away from Drupal in my personal site. I&amp;#8217;m probably being too picky and hypocritical, but whatever.&lt;/p&gt; &lt;p&gt;Cheers.&lt;/p&gt;</description>
         <author>Andrew Sterling Hanenkamp</author>
         <guid isPermaLink="false">tag:contentment.org,2009://3.653</guid>
         <pubDate>Mon, 02 Mar 2009 19:35:20 -0800</pubDate>
      </item>
   </channel>
</rss><!-- fe13.pipes.sp1.yahoo.com uncompressed/chunked Sun Nov  8 09:05:49 PST 2009 -->
