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

<channel>
	<title>honest.knave</title>
	<atom:link href="http://honestknave.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://honestknave.com</link>
	<description>this statement is false</description>
	<pubDate>Mon, 06 Oct 2008 05:46:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>My first HDR</title>
		<link>http://honestknave.com/2008/10/06/my-first-hdr/</link>
		<comments>http://honestknave.com/2008/10/06/my-first-hdr/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 04:35:02 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[photography]]></category>

		<category><![CDATA[tips and tricks]]></category>

		<guid isPermaLink="false">http://honestknave.com/?p=71</guid>
		<description><![CDATA[
East Greenwich, RI at dawn
This is a composite created from three source images: one exposed for the sky, one exposed for detail in the shadows, and one in-between.  The composite image retains color information from all areas of the image.  Pretty cool, huh?
There is also a ridonkulously big version of the image.  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2008/10/eg_hdr_lg.jpg"><img class="left" src="/wp-content/uploads/2008/10/eg_hdr_tn.jpg" width="500" height="275" /></a><br />
<small>East Greenwich, RI at dawn</small></p>
<p>This is a composite created from three source images: one exposed for the sky, one exposed for detail in the shadows, and one in-between.  The composite image retains color information from all areas of the image.  Pretty cool, huh?</p>
<p>There is also a <a href="/wp-content/uploads/2008/10/eg_hdr.jpg">ridonkulously big</a> version of the image.  For the curious, I used the tutorial from <a href="http://www.instructables.com/id/HDR-photos-with-the-GIMP/">Instructables</a> (intended for Gimp users).</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/10/06/my-first-hdr/feed/</wfw:commentRss>
		</item>
		<item>
		<title>YouTube: Usability nightmare</title>
		<link>http://honestknave.com/2008/09/07/youtube-usability-nightmare/</link>
		<comments>http://honestknave.com/2008/09/07/youtube-usability-nightmare/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 14:22:26 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[musings]]></category>

		<guid isPermaLink="false">http://honestknave.com/?p=70</guid>
		<description><![CDATA[Lately, I&#8217;ve been wondering what the hell Google has been doing with YouTube since they bought it.  The site is awful; I always forget how to use the simplest features.  Example: Where is the link to my favorites?  Oh, right, it&#8217;s hidden under the Account popup menu (which I always notice after [...]]]></description>
			<content:encoded><![CDATA[<p>Lately, I&#8217;ve been wondering what the hell Google has been doing with YouTube since they bought it.  The site is awful; I always forget how to use the simplest features.  Example: Where is the link to my favorites?  Oh, right, it&#8217;s hidden under the Account popup menu (which I always notice <i>after</i> I&#8217;ve already clicked Account, a downside of those stupid hover-over Javascript menus).  To be fair, favorites is also at the very bottom of the page, in a tiny little footer, <i>and</i> it&#8217;s in a box I just noticed for the first time today titled &#8220;About Your Videos&#8221;.  (I wouldn&#8217;t think to look there for my favorites, personally &mdash; they&#8217;re not <i>my</i> videos.)</p>
<p>The comment system is particularly painful.  Now, given the quality of <a href="http://xkcd.com/202/">discourse on YouTube</a>, it&#8217;s perhaps of debatable importance that the comment system is horrific to use.  On the other hand, perhaps the system is to blame for the poor discussions it fosters.</p>
<p>Example: A couple days ago I was watching M.I.A.&#8217;s music video, <a href="http://www.youtube.com/watch?v=7sei-eEjy4g">Paper Planes</a>, and I noticed a comment where someone asked what song she sampled for the beat.  Trying to be helpful, I clicked the Reply link for that particular comment, and answered, &#8220;The Clash - Straight to Hell&#8221;.  YouTube helpfully took my comment out of context, and placed it at the top of the comment stream, instead of below the question it answered.  (Why it did this, I have no idea.  It seems like sometimes replies will be in context, other times they&#8217;re treated like normal non-reply comments, and placed at the top.)</p>
<p>Great, now I posted a pretty useless comment, in light of the new placement.  It makes no sense as a standalone comment.  I notice shortly later that my comment has been given a thumbs down but another user.  (Which makes sense, given how little it contributes out of context.)  A couple days later, I have this in my inbox, from a miffed M.I.A. fan:</p>
<blockquote><p>wow seriously&#8230;.Name a god damn band that hasn&#8217;t used a melody or beat from a different song and her representatives must have paid shitloads to use it&#8230;.dont talk its a very good song not a rip off</p></blockquote>
<p>YouTube set me up to fail in this instance, and then subjected me to abuse, primarily by having a terrible user interface.  Their user experience is <i>so</i> bad that it is actually causing its users pain, in the sense that being sent an angry reply like that is hurtful.  Sure, I can laugh it off as a misunderstanding, but, for what it&#8217;s worth, it aggravated me enough to write this entry.</p>
<p>But of course, that&#8217;s only one problem.  In fact, that barely scratches the surface of the mountain of flaws is YouTube.  I could detail a lot more problems, but as it turns out, <a href="http://www.masternewmedia.org/interface_design_and_navigation/usability/Youtube-usability-and-user-experience-evaluation-key-success-factors-20071125.htm">someone else already has</a>, and did a far more thorough job than I could have.  If it wasn&#8217;t such a damn useful site, I could just, you know, stop going there.</p>
<p>So Google, what&#8217;s up?  You&#8217;re known for being the king of simple, usable applications.  When are you going to fix this insanely popular, but badly broken service?</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/09/07/youtube-usability-nightmare/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What&#8217;s so great about Python?</title>
		<link>http://honestknave.com/2008/07/13/whats-so-great-about-dynamic-languages/</link>
		<comments>http://honestknave.com/2008/07/13/whats-so-great-about-dynamic-languages/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 23:44:16 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[musings]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://honestknave.com/?p=67</guid>
		<description><![CDATA[In my last entry, I talked about closed-minded attitudes about new (or just unfamiliar) programming styles.  I&#8217;ve been thinking a lot about why Python &#8212; or any other dynamic language &#8212; is more powerful than a more rigid, statically typed language.  For the purposes of this article, I consider C++ rigid, even though [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://honestknave.com/2008/07/09/abre-los-ojos/">last entry</a>, I talked about closed-minded attitudes about new (or just unfamiliar) programming styles.  I&#8217;ve been thinking a lot about why Python &mdash; or any other dynamic language &mdash; is more powerful than a more rigid, statically typed language.  For the purposes of this article, I consider C++ rigid, even though it supports some dynamic typing facilities.</p>
<p>At first glance, it seems like you are actually losing something good when you switch to a dynamic language.  You lose compile-time type checking, which is a useful way of detecting errors before ever running the program.  In a dynamic language, the compiler (if there is one) doesn&#8217;t know the types of any objects until runtime, so it cannot verify the validity of the operations performed on them until execution time.  As a beginner in the language, this can be surprising and frustrating.  For example, your program may work normally until you hit one less-used branch of the code, and it bombs out with a TypeError.<br />
<span id="more-67"></span><br />
I&#8217;ve had a couple realizations about this.  The first is this: If you properly tested your code, there would be almost no paths of code that you haven&#8217;t dynamically explored.  Ideally, there shouldn&#8217;t be <i>any</i> lines of code that you haven&#8217;t executed via your testing.  In practice, however, there are always edge cases that are hard to reproduce.  But this is the second prong of the testing realization: dynamic languages make it ridiculously easy to create <a href="http://en.wikipedia.org/wiki/Mock_object">mock objects</a> to simulate an environment for the tested object.</p>
<p>The other realization is that all of these errors are presented as exceptions, which you can handle yourself at runtime.  This means that, if one of your untested paths has a type error in it, you can handle the error gracefully and keep your application running.  Since <a href="/2008/05/22/if-it-isnt-tested-its-broken/">untested code is broken</a> anyway, it seems to me like you&#8217;re not losing very much, if anything, by going dynamic.  Finally, tools are evolving that will perform static analysis on dynamic programs and look for the types of errors a compiler would catch (and more).  One example of this is <a href="http://www.logilab.org/857">PyLint</a>.</p>
<p><img src="/wp-content/uploads/2008/07/what_the_duck.jpg" height="138" width="150" class="left" />In return for having a little less type safety, dynamic typing gives you a pretty powerful new tool in your programming arsenal.  Last week, I wrote a Python module that generates a callback API for our C++ application, involving, ironically, the generation of several redundant type declarations, function prototypes, and a bunch of glue to connect the API to a set of function pointers.  (Why this was needed is another story.)</p>
<p>The Python module reads in an XML description of the API and generates all of the redundant C++ code.  One of the more interesting parts was that much of the client code itself is generated by a C++ application.  This meant that my Python objects had to be able write themselves to a file directly, but also write to a C-style quoted string, that could be included by the C++ generator.  I solved this in about 5 minutes by writing a <code>QuotedWriter</code> object, that just wrapped a file object (or anything with a <code>write</code> method), and wrapped the given text in quotes.</p>
<pre name="code" class="python">

class QuotedWriter:
    &quot;&quot;&quot;
    A wrapper around the file class (or any class that has a similar
    write method) that writes text in C-style quoted strings.
    &quot;&quot;&quot;

    def __init__(self, fp):
        &quot;&quot;&quot;Create a new writer using the specified file object.&quot;&quot;&quot;
        self.fp = fp
        self.buffer = &quot;&quot;

    def write(self, text):
        &quot;&quot;&quot;
        Quote the text and write it to the destination file object.
        Note: Nothing is written until a newline is seen.
        &quot;&quot;&quot;
        self.buffer += text
        if &quot;\n&quot; in text:
            lines = self.buffer.split(&quot;\n&quot;)
            for i in range(0, len(lines)-1):
                line = lines[i].replace(&quot;\\&quot;, &quot;\\\\&quot;)
                line = lines[i].replace(&#8217;&quot;&#8217;, &#8216;\&quot;&#8217;)
                self.fp.write(&#8217;    &quot;&#8217; + line + &#8216;\\n&quot;\n&#8217;)
            self.buffer = lines[len(lines)-1]
</pre>
<p>As an aside, I could have easily <a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252151">delegated</a> all other methods to the <code>fp</code> object, but it wasn&#8217;t needed for my simple module.  The above code was sufficient.  It also escapes quotes and backslashes, and ends each line in the string with a newline, so the generated code looks just as pretty as the generator itself. <img src='http://honestknave.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Thanks to the power of <a href="http://en.wikipedia.org/wiki/Duck_typing">duck typing</a>, I could give my Python objects a normal File object, or a QuotedWriter object, and they wouldn&#8217;t know the difference.  They can happily generate their code in either format, and it only took a few minutes.  </p>
<p>For the C++ guys (and gals) reading this, just imagine subclassing std::ostream to accomplish the same thing.  I just tried, for the purposes of this post, and gave up after 15 minutes, because it still wasn&#8217;t working right.  (For the record, here&#8217;s <a href="/wp-content/uploads/2008/07/writer.cc">the code.</a>)  It segfaults somewhere in the standard library code, before my <code>write</code> function is ever called.  There are obviously nuances to subclassing std::ostream, and I have little desire to dig deeper.  Here&#8217;s <a href="http://www.codeguru.com/forum/showthread.php?t=407540">another guy</a> who tried; check out the complexity of the response given by SuperKoko in that thread.</p>
<p>The notion of the <i>power</i> of a programming language is rather vague.  When you get used to working in a low level language, it&#8217;s easy to think that&#8217;s all the power you need.  I&#8217;ve had the title, &#8220;What&#8217;s so great about Python?&#8221;, sitting on my whiteboard for a while now.  I think the simplicity and flexibility of dynamic typing is part of the answer to that question.</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/07/13/whats-so-great-about-dynamic-languages/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Abre los ojos</title>
		<link>http://honestknave.com/2008/07/09/abre-los-ojos/</link>
		<comments>http://honestknave.com/2008/07/09/abre-los-ojos/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 12:35:08 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[musings]]></category>

		<guid isPermaLink="false">http://honestknave.com/?p=64</guid>
		<description><![CDATA[&#8230; or, Stop being so myopic, and I&#8217;ll stop calling you code monkeys.
First, a quote from the famously eloquent Donald Rumsfeld:
&#8220;There are known knowns. These are things we know that we know. There are known unknowns. That is to say, there are things that we know we don&#8217;t know. But there are also unknown unknowns. [...]]]></description>
			<content:encoded><![CDATA[<p>&hellip; or, Stop being so myopic, and I&#8217;ll stop calling you code monkeys.</p>
<p>First, a quote from the famously eloquent Donald Rumsfeld:</p>
<blockquote><p>&ldquo;There are known knowns. These are things we know that we know. There are known unknowns. That is to say, there are things that we know we don&#8217;t know. But there are also unknown unknowns. There are things we don&#8217;t know we don&#8217;t know.&rdquo;</p></blockquote>
<p>There&#8217;s a real problem among programmers.  (Well, there are several, but we&#8217;ll stick to just one for now, okay?)  We know they&#8217;re cocky, but this is generally regarded as a <a href="http://c2.com/cgi/wiki?LazinessImpatienceHubris">strength</a>.  However, it plays badly with the next fact, care of Rummy: they don&#8217;t know what they don&#8217;t know.  There are unknown unknowns.</p>
<p>The thing is, there is a sequence of events that plays out through your entire life as a coder.  It goes something like this:</p>
<ol>
<li>Look at the <i>pure crap</i> you wrote a couple years ago.</li>
<li>Realize how much you&#8217;ve improved since then.</li>
<li>Think, &ldquo;Wow, I&#8217;m a top notch programmer <i>now</i>.&rdquo;</li>
<li>In a couple years, repeat step 1.</li>
</ol>
<p><span id="more-64"></span>So, a year after you learned C++ in college, you thought you were on top of your game.  You knew how to manage your memory (and dammit, you liked it that way), you created pure virtual interfaces, you&#8217;ve internalized Design Patterns and invented a couple of your own.  And, because you&#8217;re cocky, you figure those Java guys are just dumb because they need a crutch like garbage collection.</p>
<p>Fortunately, programmers have one more quality beyond hubris and laziness: they also get bored easily.  After C++ starts to get pretty mundane, you think maybe I&#8217;ll broaden my horizons and write a Java program.  So you learn the basics, and you decide to write a small utility you&#8217;ve been wanting for a while now.    You figure it&#8217;s probably a two-week job, and start on it one Saturday morning.  The next day, you realize, &ldquo;Wait&hellip; I&#8217;m done?&rdquo;</p>
<p>Suddenly, you notice the <i>vast</i> set of standard libraries.  The garbage collection doesn&#8217;t seem so lame, now.  The realization dawns on you, &ldquo;Well, I guess most of the stuff I write isn&#8217;t really performance-critical&#8230;&rdquo;  After a little more research, you dig around and find out, to your surprise, that garbage collection is actually getting to be faster than hand-written memory management.  And with every iteration, it gets better (some real-time JVMs have an O(1) collector).  Not to mention that it&#8217;s not <i>nearly</i> as error-prone as managing allocation by hand.</p>
<p>The average person, at this point, will often admit, &ldquo;Hmm, maybe I was wrong about garbage collection.&rdquo;  (Truthfully, some people never get this far.)  But typically, this doesn&#8217;t lead to any major epiphanies, and the same person will cling to all the other ego-validating beliefs about everything else, including those pesky unknown unknowns.  Something that would have taken the old, C++ aficionado <i>weeks</I> is accomplished in a day; this ought to blow your little mind.</p>
<p>Unfortunately, like that pizza and mountain dew (or is it curry and lattés these days?), clinging to old beliefs activates those pleasure centers in your brain.  Eventually, you encounter one of those new, dynamic languages like Python, and snort, &ldquo;Sure, it&#8217;s good for a little script here and there, but no one writes <i>real</i> programs in a <i>scripting</i> language!&rdquo;</p>
<p><a href="http://xkcd.com/353/"><img class="right" src="/wp-content/uploads/2008/07/python.png" width="330" height="135" /></a>I&#8217;ll skip the part where you learn Python (or Ruby, or whatever) and start loving it.  By now, it&#8217;s predictable, right?  Well, here&#8217;s the real kicker: for the past <i>half a century</i>, while you were just pecking at the walls of your little object-oriented eggshell, the Lisp and Scheme guys have quietly been producing more and more interesting projects using weird things like closures, first class functions, and macros.</p>
<p>Programmers are people who specialize at seeing the general pattern behind a few concrete instances of something.  Well, here&#8217;s a general pattern I think a lot of them are missing.  I&#8217;m personally not very fluent in functional languages (yet), but I refuse to believe that, just because I&#8217;ve survived without many of the functional concepts so far, that they&#8217;re not awesome.  At some point, a software developer needs to realize that there are bounds to one&#8217;s knowledge, and they are the bars of a cage that keep one from doing something amazing.</p>
<p>Hmm, what&#8217;s this Clojure thing all about&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/07/09/abre-los-ojos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kubuntu 8.04 Hardy Heron update notes</title>
		<link>http://honestknave.com/2008/06/01/kubuntu-804-hardy-heron-update-notes/</link>
		<comments>http://honestknave.com/2008/06/01/kubuntu-804-hardy-heron-update-notes/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 07:04:00 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[linux]]></category>

		<category><![CDATA[tips and tricks]]></category>

		<guid isPermaLink="false">http://honestknave.com/2008/06/01/kubuntu-804-hardy-heron-update-notes/</guid>
		<description><![CDATA[I figured I&#8217;d document for posterity some of the issues I had with my Kubuntu 7.10 &#8594; 8.04 update.  I approach all major updates with trepidation, and as usual, it was justified.
First of all, the updater application worked well.  I had to expand the window to show the terminal when it updated OpenVPN, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="left" src="http://honestknave.com/wp-content/uploads/2008/06/hardyheron.jpg" width="150" height="222" alt="Hardy Heron" />I figured I&#8217;d document for posterity some of the issues I had with my Kubuntu 7.10 &rarr; 8.04 update.  I approach all major updates with trepidation, and as usual, it was justified.</p>
<p>First of all, the updater application worked well.  I had to expand the window to show the terminal when it updated OpenVPN, which would hang waiting for me to enter my username and password.  (This actually happened twice).  Also, it is occasionally interactive, asking you to look at changes it wants to make to certain config files.  This is a good thing, but it would be nice to have all the questions come at the beginning or the end, so the update can be unattended (since it takes several hours).<span id="more-56"></span><br />
<h3>System doesn&#8217;t boot</h3>
<p>The moment of truth: I allow the updater to restart my computer.  Grub appears momentarily, then it tries to start the 2.6.24 kernel.  Kubuntu&#8217;s splash screen appears and the progress bar pulses back and forth, seemingly forever.  I give up after seeing no HDD activity, and reboot the machine via the keyboard.  I switch back to kernel 2.6.22, and the system boots, but has some issues with nVidia&#8217;s driver and X.org.</p>
<p>Ignoring these for the moment, I disable the boot splash screen and the quiet boot options in my /boot/grub/menu.lst, and reboot.  The kernel outputs a bunch of messages like:</p>
<pre>
ata3: failed to IDENTIFY
ata3: failed to recover some devices
</pre>
<p>It retries this several times, and then dumps me to a busybox shell.  So far, I&#8217;m not impressed with this update.  Ubuntu is supposed to be the OS that anyone can use, and it&#8217;s taking an awful lot of my Linux experience to figure this out.  After googling the messages, I find <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/190492">this bug report</a>, which turns out to be the problem.  The solution is to add the option &#8220;pci=nomsi&#8221; to my boot parameters.  I readily admit I have no idea what this does, but it fixed my problem.  The 2.6.24 kernel now boots cleanly.</p>
<h3>Files overwritten</h3>
<p>Even though the updater was kind enough to ask my permission to update some files, there were a couple cases where allowing it seemed like the right idea.  I allowed it to update my php.ini and my xorg.conf files.  It screwed them both up.  So I had to fix my modelines for my display (detected native resolution of 1792&#215;1344 on my 1920&#215;1200 monitor&#8230; wtf?), and fix my php.ini to get my wiki working again.</p>
<h3>Firefox 3.0 Beta</h3>
<p>Apparently, they decided to ship a beta version of Firefox with this new release.  It&#8217;s sort of logical from the point of view that this is an LTS release (long-term support), which means the Ubuntu crew will support this release for the next three years.  They don&#8217;t want to be supporting Firefox 2 for that long, and that makes sense.  However, as an end user, I specifically held off on Firefox 3 because it&#8217;s still beta.  Even Firefox 2 still feels like a beta product, with its memory usage pattern and frequent locking up on pages with Flash or heavy Javascript use.  Now I&#8217;m an FF 3 beta user, let&#8217;s hope that goes well.</p>
<p><b>Update June 23, 2008:</b> Firefox 3.0 eventually came out officially.  Well, it&#8217;s driving me nuts.  The flash plugin dies five or six times a day, requiring me to restart the browser.  Also, the UI locks up during heavy disk activity (like when I&#8217;ve got a big compile job going at the same time), and freezes for 5 to 10 seconds at a time.  Sometimes, it never wakes up.  Today, I&#8217;d finally had enough ,and installed the &#8220;firefox-2&#8243; package, and I&#8217;m happy again.  I can&#8217;t wait for a nice, small WebKit browser.</p>
<h3>Tracker</h3>
<p>After the update, my system seemed slower than usual, especially launching applications from a cold start.  <code>top</code> reveals a process called trackerd as the culprit.  Tracker is some kind of filesystem indexing program, to optimize searches.  It seems like it&#8217;s a Gnome product, so it really shouldn&#8217;t be running on my KDE system.  Well, after the update, sure enough, trackerd is running, and consuming a ridiculous amount of resources.</p>
<p>Trackerd was steadily using 15 to 25% of my CPU, and as far as I can tell, a much higher percentage of my hard drive bandwidth.  Killing it from the command line sped up my desktop, but it rises from the dead shortly thereafter, hogging my resources all over again.  Googling turned out to be not very helpful, but I ultimately figured out how to disable it:  run gnome-control-center from the command line, under &#8220;Other&#8221; open &#8220;Searching and Indexing&#8221;, and in there, you can disable the indexing service.  It seems to be gone for good now; we&#8217;ll see.</p>
<h3>GTK glitch</h3>
<p>For some reason, checkboxes and radio buttons in GTK applications (such as Firefox) don&#8217;t show their state when focused.  This means you click a checkbox, and it doesn&#8217;t appear checked until you click somewhere else.  Terrible.  I fixed this by opening the KDE System Settings &rarr; Appearance &rarr; GTK Styles and Fonts, and changing to &#8220;Use another style&#8221;.  Several of them appear to work fine, and I settled on &#8220;Glossy&#8221; as a moderately attractive style.  Ubuntu has <a href="https://bugs.launchpad.net/ubuntu/+source/gtk-qt-engine/+bug/223055">an open bug</a> for this issue.</p>
<h3>Crappy fonts</h3>
<p>A lot of the text I&#8217;m seeing now looks worse than it used to.  I&#8217;ve never been an expert in the Linux font area, so I don&#8217;t know what changed.  But the default anti-aliasing looks super fuzzy:</p>
<p><img src="/wp-content/uploads/2008/06/ubuntu_text_aa.png" alt="Antialiased text" width="302" height="126" /></p>
<p>I tried disabling anti-aliasing, and it looks even worse:</p>
<p><img src="/wp-content/uploads/2008/06/ubuntu_text_noaa.png" alt="Normal text (no antialiasing)" width="302" height="125" /></p>
<p>Not all fonts look this bad, but all of them seem to look at least slightly worse after the update. Check out the kerning in &#8220;Select which&#8221;, great stuff. This is the kind of thing that tempts me to get a Mac.</p>
<p><b>Update:</b> Found <a href="http://reddit.com/info/6hfhn/comments/">this reddit thread</a> (total coincidence that I was using reddit as my example) via the Ubuntu forums, and his solution fixes my sans-serif fonts in Firefox.  After much trial and error, I also substituted &#8220;DejaVu Serif&#8221; for &#8220;Liberation Serif&#8221;, and my serif fonts look much sharper. This is how reddit looks now, with the sans-serif fix:</p>
<p><img src="http://honestknave.com/wp-content/uploads/2008/06/ubuntu_text_newmap.png" width="302" height="122" alt="New font map" /></p>
<h3>RAID rebuilding</h3>
<p>For some reason, as I write this, my RAID arrays are currently rebuilding.  All four, in sequence.  This could be due to the boot issue where the ata3 and ata4 devices weren&#8217;t detected, so it was perceived as a RAID drive failure.  I&#8217;m not experiencing any data loss or stability issues as a result, but it does affect HDD performance.  The arrays appear to be in good shape.</p>
<h3>Conclusion</h3>
<p>Make sure you have a day to waste when you upgrade to hardy.  I suspect a lot of my issues are due to KDE being a second-class citizen in the Ubuntu world.  There also seems to be the mindset that Ubuntu absolutely has to release every April and October, regardless of the amount of testing it has received.</p>
<p>I give a lot of credit to the Ubuntu team for keeping this great OS going, but the bottom line is it&#8217;s still Linux, and it&#8217;s still a maintenance nightmare.</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/06/01/kubuntu-804-hardy-heron-update-notes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>If it isn&#8217;t tested, it&#8217;s broken</title>
		<link>http://honestknave.com/2008/05/22/if-it-isnt-tested-its-broken/</link>
		<comments>http://honestknave.com/2008/05/22/if-it-isnt-tested-its-broken/#comments</comments>
		<pubDate>Thu, 22 May 2008 05:48:27 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[automation]]></category>

		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://honestknave.com/2008/05/22/if-it-isnt-tested-its-broken/</guid>
		<description><![CDATA[From the this-should-be-obvious-by-now dept.:  I recently added an integration test suite to our codebase, which gives us the ability to write some tests that were impossible when we only had unit and system test suites.  Once it was stable, I added it to our nightly build process, so it would be tested every [...]]]></description>
			<content:encoded><![CDATA[<p>From the this-should-be-obvious-by-now dept.:  I recently added an integration test suite to our codebase, which gives us the ability to write some tests that were impossible when we only had unit and system test suites.  Once it was stable, I added it to our nightly build process, so it would be tested every night.</p>
<p>I updated our Linux build machine with the new nightly build script.  At the same time, I was configuring our new, faster Windows build machine to replace our old, pokey one.  Since the old Windows machine is expected to be rendered obsolete, I didn&#8217;t bother installing the new build script on it.  So Windows just continued running the normal build, unit tests, and system tests.  We knew the integration tests worked on Windows anyway, because we ran them by hand just recently (right?).</p>
<p>This Sunday, about a week later, the new Windows machine came online.  I installed all the prerequisites (which only took a few hours, because we have an awesome wiki full of HOWTOs), connected it to our network, and installed the updated build script.  By now, you know what happened next: I ran the build script, and everything worked <i>except</i> the integration tests.  The code checked out, compiled, unit tested, and system tested just fine.  But the <i>one</i> thing that wasn&#8217;t tested <i>nightly</i> &mdash; the integration test suite on Windows &mdash; was broken.</p>
<p>Our strategy of automating everything continues to pay dividends.  And it shows what happens when you don&#8217;t.  If you aren&#8217;t able to regularly test your software in some kind of automated fashion, <i>it is broken</i>.  You just don&#8217;t know it yet.</p>
<p><small><i>Title is a quote attributed to Bruce Eckel.</i></small></p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/05/22/if-it-isnt-tested-its-broken/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Software for fun and profit</title>
		<link>http://honestknave.com/2008/05/21/software-for-fun-and-profit/</link>
		<comments>http://honestknave.com/2008/05/21/software-for-fun-and-profit/#comments</comments>
		<pubDate>Wed, 21 May 2008 05:25:42 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[in the wild]]></category>

		<guid isPermaLink="false">http://honestknave.com/2008/05/21/software-for-fun-and-profit/</guid>
		<description><![CDATA[An interesting series of articles is developing at codingthewheel.com:

How I Built a Working Poker Bot, Part 1
How I Built a Working Online Poker Bot, Part 2: Interlude

It&#8217;s reminiscent of the days when IBM proved the power of computer software by facing off against chess grandmaster Gary Kasparov.  Kind of exciting in that sense.  [...]]]></description>
			<content:encoded><![CDATA[<p>An interesting series of articles is developing at codingthewheel.com:</p>
<ul>
<li><a href="http://www.codingthewheel.com/archives/how-i-built-a-working-poker-bot">How I Built a Working Poker Bot, Part 1</a></li>
<li><a href="http://www.codingthewheel.com/archives/how-i-built-a-working-online-poker-bot-2">How I Built a Working Online Poker Bot, Part 2: Interlude</a></li>
</ul>
<p>It&#8217;s reminiscent of the days when IBM proved the power of computer software by facing off against chess grandmaster Gary Kasparov.  Kind of exciting in that sense.  According to the author, their artificial intelligence isn&#8217;t better than the best poker players&#8230; yet.</p>
<p>I&#8217;ve personally written one program that plays an online flash game, by screen scraping and mouse pointer movement.  It didn&#8217;t require any AI component, and it was purely for fun; no profit motive.  Needless to say, this is intriguing; of course, I know I&#8217;m supposed to use my powers for good. <img src='http://honestknave.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><b>Website note:</b> I&#8217;m opening up comments generally.  I noticed Wordpress gives me a neat summary of recent activity, so I can delete spam pretty easily.</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/05/21/software-for-fun-and-profit/feed/</wfw:commentRss>
		</item>
		<item>
		<title>2012 anyone?</title>
		<link>http://honestknave.com/2008/05/18/2012-anyone/</link>
		<comments>http://honestknave.com/2008/05/18/2012-anyone/#comments</comments>
		<pubDate>Sun, 18 May 2008 07:36:19 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[consciousness]]></category>

		<guid isPermaLink="false">http://honestknave.com/2008/05/18/2012-anyone/</guid>
		<description><![CDATA[Some things have been weighing on me for a while.  Chief among them, how out of balance my culture is, myself included, with the world around it.  There are warning signs going off all around us, but I still feel like I&#8217;m going completely against the grain whenever I try to take heed.
&#8220;Whenever [...]]]></description>
			<content:encoded><![CDATA[<p>Some things have been weighing on me for a while.  Chief among them, how <a href="http://en.wikipedia.org/wiki/Koyaanisqatsi">out of balance</a> my culture is, myself included, with the world around it.  There are warning signs going off all around us, but I still feel like I&#8217;m going completely against the grain whenever I try to take heed.</p>
<blockquote><p>&#8220;Whenever I see an adult on a bicycle, I have hope for the human race.&#8221;  &mdash; H. G. Wells</p></blockquote>
<p>For example: In my continuing efforts to be more environmentally conscious, less oil-dependent, healthier, and a bit more frugal, I&#8217;ve taken to bicycling to nearby destinations whenever possible.  In many places in the world, this is the easy and obvious solution; after all, the bicycle is the most efficient known form of transportation.  But things are different in the land of <a href="http://en.wikipedia.org/wiki/Urban_sprawl">sprawl</a>.  In a country that, for the last 50 years, has designed its spaces around cars, attempting to use anything else can be a harrowing experience.  Not only that, but many seem to <a href="http://www.bicyclinglife.com/EffectiveAdvocacy/Marginalization.htm">take offense</a> at bicyclists, shouting profanities or honking as they drive by.  Whether they&#8217;re completely ignorant or just living in our familiar state of cognitive dissonance, who knows.<span id="more-52"></span></p>
<p>The writing&#8217;s been on the wall for as long as anyone&#8217;s been willing to look.  Oil production has probably peaked in the last year or two, and will soon begin a series of declines, each worst than the last.  The environment is changing in ways that no one completely understands, but most agree is for the worse.  The suburban way of life is going to fade out, an anomalous period of history fostered by the era of cheap energy and insufficient foresight.</p>
<p>Yet, I&#8217;m still not sure how I&#8217;ll ever manage to live in a way that <i>is</I> balanced with nature.  Riding bikes, switching to fluorescent lights, reusing grocery bags, even changing my diet; they seem like token gestures rather than true improvements.  If everyone lived like me, we&#8217;d still need the resources of <a href="http://ecofoot.org/">multiple planets</a> to fulfill the demand.  Not only that, but what I consider modest behavior changes, many still consider extreme!  Doing anything other than throwing money at a problem is practically unamerican.  Almost existentially, I begin to question the point of modifying my behavior in a culture that still chugs <a href="http://www.triplepundit.com/pages/askpablo-exotic-bottled-water-002401.php">bottled</a> <a href="http://www.youtube.com/watch?v=zyOZ51NP7CY">water</a> like, well, water.  How am I supposed to care when my actions are regarded with disdain by the culture I&#8217;m purporting to help?</p>
<p>No matter what I do, things are going to change in my lifetime in ways I can&#8217;t anticipate.  With news of <a href="http://www.treehugger.com/files/2008/04/rationing-comes-to-america.php">food rationing</a> and <a href="http://www.treehugger.com/files/2008/03/drought-around-world-atlanta-perspective.php">droughts</a>, and the knowledge that we use 10 calories of hydrocarbon energy for every calorie of food we produce (not including transport or cooking), energy scarcity may be the least of our worries.  The next wars may be fought not over oil, but clean water and arable land.  But today, we misguidedly continue to repurpose farms as fuel supplies, converting <i>food</i> into ethanol while billions starve.</p>
<p>Here&#8217;s a fantastic talk (approx 20 min) by James Howard Kunstler, &#8220;The Tragedy of Suburbia&#8221; (ironically sponsored by BMW):</p>
<p align="center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="432" height="285" id="VE_Player" align="middle"><param name="movie" value="http://static.videoegg.com/ted/flash/loader.swf"><PARAM NAME="FlashVars" VALUE="bgColor=FFFFFF&#038;file=http://static.videoegg.com/ted/movies/JAMESHOWARDKUNSTLER-2004_high.flv&#038;autoPlay=false&#038;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&#038;forcePlay=false&#038;logo=&#038;allowFullscreen=true"><param name="quality" value="high"><param name="allowScriptAccess" value="always"><param name="bgcolor" value="#FFFFFF"><param name="scale" value="noscale"><param name="wmode" value="window"><embed src="http://static.videoegg.com/ted/flash/loader.swf" FlashVars="bgColor=FFFFFF&#038;file=http://static.videoegg.com/ted/movies/JAMESHOWARDKUNSTLER-2004_high.flv&#038;autoPlay=false&#038;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&#038;forcePlay=false&#038;logo=&#038;allowFullscreen=true" quality="high" allowScriptAccess="always" bgcolor="#FFFFFF" scale="noscale" wmode="window" width="432" height="285" name="VE_Player" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></object></p>
<p>Some worthwhile documentaries on the topic:</p>
<ul>
<li><a href="http://www.endofsuburbia.com/">The End of Suburbia</a></li>
<li><a href="http://www.whatawaytogomovie.com/">What a Way to Go</a></li>
</ul>
<p>There are no quick fixes, and the difficult fixes that should&#8217;ve begun years ago haven&#8217;t yet.  These topics always leave me feeling uneasy, never able to come completely to grips with reality.  As we continue down the irrational path of consuming the planet that gave us life, I wonder, how do you come to terms with this?  Consciously or not, we know that the world isn&#8217;t going to bear the strain much longer.  It probably explains the hopes pinned on a Rapture-event, an ascension to a higher plane of existence.  Because what else do you do, when you&#8217;ve burned up all you have?</p>
<p>Comments are open on this entry, if anyone has any thoughts to share.</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/05/18/2012-anyone/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Liberated from the Left Brain</title>
		<link>http://honestknave.com/2008/03/15/liberated-from-the-left-brain/</link>
		<comments>http://honestknave.com/2008/03/15/liberated-from-the-left-brain/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 16:10:47 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[consciousness]]></category>

		<guid isPermaLink="false">http://honestknave.com/2008/03/15/liberated-from-the-left-brain/</guid>
		<description><![CDATA[Neuroscientist Jill Bolte Taylor describes the surprisingly moving experience of having a stroke in the left hemisphere of her brain.  Highly recommended 18-minute talk.

Via TED Blog
]]></description>
			<content:encoded><![CDATA[<p>Neuroscientist Jill Bolte Taylor describes the surprisingly moving experience of having a stroke in the left hemisphere of her brain.  Highly recommended 18-minute talk.</p>
<p align="center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="432" height="285" id="VE_Player" align="middle"><param name="movie" value="http://static.videoegg.com/ted2/flash/loader.swf"><PARAM NAME="FlashVars" VALUE="bgColor=FFFFFF&#038;file=http://static.videoegg.com/ted/movies/JILLTAYLOR-2008_high.flv&#038;autoPlay=false&#038;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&#038;forcePlay=false&#038;logo=&#038;allowFullscreen=true"><param name="quality" value="high"><param name="allowScriptAccess" value="always"><param name="bgcolor" value="#FFFFFF"><param name="scale" value="noscale"><param name="wmode" value="window"><embed src="http://static.videoegg.com/ted2/flash/loader.swf" FlashVars="bgColor=FFFFFF&#038;file=http://static.videoegg.com/ted/movies/JILLTAYLOR-2008_high.flv&#038;autoPlay=false&#038;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&#038;forcePlay=false&#038;logo=&#038;allowFullscreen=true" quality="high" allowScriptAccess="always" bgcolor="#FFFFFF" scale="noscale" wmode="window" width="432" height="285" name="VE_Player" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></object></p>
<div style="font-size: smaller; font-color: #808080">Via <a href="http://blog.ted.com/">TED Blog</a></div>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/03/15/liberated-from-the-left-brain/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Digital Photography Basics: Dynamic Range (part 2)</title>
		<link>http://honestknave.com/2008/03/10/digital-photography-basics-dynamic-range-part-2/</link>
		<comments>http://honestknave.com/2008/03/10/digital-photography-basics-dynamic-range-part-2/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 09:05:14 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[photography]]></category>

		<guid isPermaLink="false">http://honestknave.com/2008/03/10/digital-photography-basics-dynamic-range-part-2/</guid>
		<description><![CDATA[
This article is part of a series.

Hopefully you have a pretty good idea of what is meant by the term dynamic range now.  Let&#8217;s get a little more hands-on.
Histograms


Figure 1: An extremely simple histogram.

First, you need to know how to read your image&#8217;s histogram.  A histogram is a 2-dimensional graph of the frequency [...]]]></description>
			<content:encoded><![CDATA[<div style="font-size: smaller; font-style: italic">
<p>This article is part of a <a href="/series/digital-photography-basics/">series.</a></p>
</div>
<p>Hopefully you have a pretty good idea of what is meant by the term <i>dynamic range</i> now.  Let&#8217;s get a little more hands-on.</p>
<h4>Histograms</h4>
<div class="figureright">
<img src="/wp-content/uploads/2008/03/simple_histogram.gif" alt="Simple Histogram" width="273" height="238" /></p>
<p><b>Figure 1:</b> An extremely simple histogram.</p>
</div>
<p>First, you need to know how to read your image&#8217;s histogram.  A histogram is a 2-dimensional graph of the <i>frequency</i> a particular value occurred.  Remember our 8-bit cameras, with a grid full of pixels whose values could be anywhere from zero to 255?  Now it&#8217;s time to start inspecting those values.<span id="more-40"></span></p>
<p>Imagine a really crappy black &amp; white camera with only a 2-bit range, capable of storing values between zero (black) and three (white).  If you took an image with this camera, it would look remarkably like something from the old GameBoy, having only four shades of gray to display.  The histogram for that photo might look something like the example to the right.</p>
<p>The histogram displays the number of pixels in the image with each value.  So maybe 50 pixels had the value zero, completely black.  Then about 25 pixels were a dark gray (value=1), about 75 pixels were light gray (value=2), and maybe 90 pixels were white (value=3).  This gives you a sense of what information a histogram is <i>technically</i> conveying, on a very simple level, but we&#8217;ll need a better example to start learning how to use histograms to improve our photos.</p>
<div class="figure">
<img src="/wp-content/uploads/2008/03/real_histogram.jpg" alt="Real Histogram Example" width="526" height="158" /></p>
<p><b>Figure 2:</b> A real world histogram.</p>
</div>
<p>In most cameras and photo editing packages, histograms look more like the one displayed in Figure 2.  First of all, there are no numbers or indications of scale.  Second, the range of values is <i>much</i> larger than the one above, so the graph looks more like a curve than a bar graph.  As a further complication, all three colors &mdash; red, green, and blue &mdash; are represented on the same graph.  Confused yet?</p>
<div class="tip">
<p><b>Tip:</b> Here&#8217;s how you can see the histogram for <i>your</i> image:</p>
<p style="margin-left: 0.5em">Photoshop: On the main menu, select Window &raquo; Histogram.</p>
<p style="margin-left: 0.5em">Gimp: Right click on the image, select Colors &raquo; Info &raquo; Histogram.</p>
</div>
<p>So what is this histogram telling us?  It seems that the majority of the pixels are bunched up at the low end of the range, meaning the majority of the picture is composed of darker pixels (including a whole lot of completely black ones).  There are a moderate amount of middle range pixels, and then essentially zero bright values.  (The lighthouse is definitely overexposed, but it&#8217;s such a small amount of pixels that you don&#8217;t even see the blip on the far right end of the histogram.)</p>
<p>Spend a minute reading this histogram and comparing it to the image it was derived from (at the left).  Do this again when you start working with your own images &mdash; pull up the histogram and spend a minute studying it.  Get comfortable with what the histogram is telling you, that experience will help you take better pictures in the future.</p>
<p>Note that in an RGB histogram like the one in Figure 2, the colors overlap.  You will eventually get familiar with how colors add together, but for now, just know that red + green = yellow, blue + green = cyan, and blue + red = magenta.  Areas where all three colors are combined would be white in the image, but for some reason, Gimp decided to use black in the histogram.  On cameras that provide a histogram, the background is usually black, so all three colors add up to white, as you&#8217;d expect.</p>
<h4>Setting black- and white-points</h4>
<p>In the previous post, we talked about how the camera&#8217;s dynamic range can be too small to fit all the detail into an image.  This is particularly common with a high contrast scene, such as the sunny day example.  Well, just as often, the range is sufficiently big to capture everything.  This happens in situations where you have lower contrast, and your subject(s) are lit relatively evenly.</p>
<p>In this case, you&#8217;ll often find that the entire range of brightness fits into your camera&#8217;s range, and the histogram shows this in the example below.  The top half shows the image as the camera recorded it, and the corresponding histogram.  Reading the histogram tells us that the darkest part of the image has a value <i>above zero</i>, and the brightest part of the image is <i>well below maximum</i>.  The result is a flat, grayish image, as in the top half of FIgure 3.</p>
<div class="figure">
<img src="/wp-content/uploads/2008/03/levels_example.jpg" alt="Levels Example" width="521" height="400" /></p>
<p><b>Figure 3:</b> Image before and after levels adjustment.</p>
</div>
<p>Now you might be tempted to find some kind of &#8220;contrast&#8221; knob, like you were fixing the picture on a TV.  Both Photoshop and Gimp give you a contrast/brightness tool, and you probably found that already when you were trying to fix your flat images in the past.  The problem is the contrast tools don&#8217;t give you any sense of what you&#8217;re doing to the values in the image.  You don&#8217;t know when you&#8217;ve reached the point of clipping in either direction.  You also don&#8217;t know if you&#8217;re still far from that point.  You can achieve decent results, but they&#8217;ll almost always be less than optimal.</p>
<p>The correct tool to use for this job is the Levels adjustment.  The bottom half of Figure 3 shows the image after I&#8217;ve adjusted the levels, setting true black- and white-points.  You can see that the corresponding histogram has been stretched to fill the entire range of values now, so that the darkest points in the image are truly black, and the brightest points of the image are at the maximum brightness in the image.</p>
<p>The effect is dramatic, and truly brings life back into what was a pretty stale image.  In fact, this is generally the <i>first</i> thing I do to any image I plan on developing.  Note that you don&#8217;t always want to bring the bright end of the spectrum up, it depends on the subject and your goals.  But setting a black-point is pretty much universally useful.</p>
<p>To set black- and white-points in your images:</p>
<p>In Photoshop, under the Image &raquo; Adjustments submenu, you have several options.  You can try Auto Levels, Auto Contrast, and Auto Color, to see if they produce the results you&#8217;re looking for.  These are the easiest options, but give you the least control.  Auto Constrast, in this case, gives basically the result I was looking for.  The other options affected the colors too much for my taste, so that the sky lost the reddish hues.</p>
<p>Alternatively, you can select Image &raquo; Adjustments &raquo; Levels (or hit CTRL-L), and adjust the levels by hand.  Then follow the instructions below for Gimp, as the Photoshop levels dialog behaves almost identically.</p>
<div class="figureleft">
<img src="/wp-content/uploads/2008/03/gimp_levels.png" alt="Gimp Levels" width="369" height="153" /></p>
<p><b>Figure 4:</b> Adjusting levels in Gimp</p>
</div>
<p>In Gimp, right click on your image, and select Colors &raquo; Levels.  In the dialog that appears, slide the two arrows circled in Figure 4 until they frame the range of values in the histogram.  I&#8217;ve marked the locations I used in this example with red arrows.  As long as Preview is checked, you can watch the image change as you adjust the black- and white-points.  You can also toggle the Preview checkbox to see how much you&#8217;ve changed the image from the original.</p>
<p>After you click Ok, the colors in your image will be scaled to the new range you specified.  Values lower than or equal to the left arrow will be completely black, and values equal to or higher than the right arrow will be at their maximum brightness.  All the values in between will be scaled proportionally.</p>
<p>Getting to know how the dynamic range affects your pictures is an important step in producing better photographs.  As you get more comfortable with histograms, you&#8217;ll be able to produce better pictures simply using the histogram display on your digital camera.  Additionally, when you get the pictures home, you can create a more pleasing range of values using the &#8220;levels&#8221; capability of your image editing software.</p>
]]></content:encoded>
			<wfw:commentRss>http://honestknave.com/2008/03/10/digital-photography-basics-dynamic-range-part-2/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
