<?xml version='1.0' ?>
<rss version='2.0'>
  <channel>
    <title>Mark Damon Hughes</title>
    <link>http://kuoi.com/~kamikaze/
</link>
    <description>Mark Damon Hughes</description>
    <language>en-us</language>
    <ttl>720</ttl>
    <image>
      <title>Mark Damon Hughes</title>
      <link>http://kuoi.com/~kamikaze/
</link>
      <url>http://kuoi.com/~kamikaze/people/mark2002sm.png</url>
    </image>
    <item>
      <category>Mac</category>
      <title>Upcoming iPhone apps</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=198
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=198
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Over the next weekend, I should be able to get two more iPhone utilities packaged up and out.</p>

<ul>
<li>A programmer's RPN calculator, with base 10 and 16, a full set of binary operations, basic trig operations, history, and memory, and more coming. I was worried Apple would stomp on me with their Calculator's sideways "scientific" mode, but it turns out to not have RPN, and anyway, they don't have the functions I and other programmers need.</li>

<li>An RPG dice roller.</li>

</ul>

<p>Then I can get back to work on my big iPhone RPG. Stay tuned!</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 10 Jul 2008 09:10:52 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>iPhone App Store is up! Castles is released!</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=197
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=197
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>The <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/storeFront">iPhone App Store</a> is open now, and my first game for the iPhone is out:</p>
<h2><a href="http://markdamonhughes.com/Castles/">Castles</a></h2>
<p><i>(<a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284968463&mt=8">direct link to the app store</a>)</i></p>

<p>However, the categorization still leaves a lot to be desired, since only 15 games show up in the App Store tool (but 199 Entertainment items!?), and Castles isn't one of them!</p>

<p>Anyway, I'm still really excited! Come buy Castles! It's an insanely addictive little wargame.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 10 Jul 2008 07:37:13 -0700</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>Yahoo Spam, I mean, Mail</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=196
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=196
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I wanted to sign up for <a href="http://www.zathras.de/angelweb/home.htm">Uli Kusterer</a>'s <a href="http://tech.groups.yahoo.com/group/mac-gui-dev/">mac-gui-dev</a> mailing list.</p>

<p>I have an old Yahoo!&reg; account, but I plan to get rid of it because it's a giant spam bucket. So I make a new one. Here begins my tale of woe.</p>

<p>I pick my standard trashcan account for the "alternate address", and go immediately to the marketing page and turn OFF all the dozen+ junk mail lists Yahoo!&reg; sign you up for when you create an account.</p>

<p>I join the group, that works fine. Now I try to add a new list-collecting address at one of my sites as another alternate address. And the form just silently fails. Nothing happens.</p>

<p>I submit a problem report, and frankly at this point I don't expect anything to happen, I expect they'll just ignore it and continue fucking up like the bunch of <a href="http://www.dict.org/bin/Dict?Form=Dict2&Database=*&Query=yahoo">yahoos</a> that they are at Yahoo!&reg;.</p>

<p>So for now, I need to use Yahoo!&reg;'s mail reader. When I get into the web-email client, I don't see my inbox. First, I get assaulted with a bunch of modal dialogs pointing out the features I didn't ask for, didn't want, and have fuck-all to do with my email. Underneath them is a page full of ads and news links and every damn thing except email. There's no way to turn this off and go straight to the inbox.</p>

<p>Then when I manage to fight my way to the inbox, I get assaulted by a giant red blinking "YOU ARE ALREADY A WINNER" circa-1996 banner ad. Who the fuck is stupid enough to click on one of those? Are they just trawling for lonely, confused old pensioners and stealing their money? Yahoo!&reg; helps con artists steal money from your gramma. This is a fact.</p>

<p>Every single step of this process is filled with hate. I'm not going to be favorably inclined to anyone stupid enough to advertise there, I'm going to despise them and buy from their competitor. Almost every part of the site is hideous and bad.</p>

<p>I'm clearly spoiled by Google's nearly perfect Zen design. It's mellow, simple. Plain text, no garish colors, no blinking, no image ads. They focus on the content you want, with some other stuff off to the side you can look at if you want. Even the customized, art-themed <a href="http://www.google.com/ig">iGoogle</a> page is an order of magnitude simpler than the Yahoo home page, and it's entirely optional.</p>

<p>Yahoo!&reg; is no damn good at anything. They <a href="http://en.wikipedia.org/wiki/Yahoo!#Work_in_the_People.27s_Republic_of_China">betray their customers to the Chinese dictatorship to be imprisoned and tortured</a>, they <a href="http://en.wikipedia.org/wiki/Yahoo!#Adware_and_Spyware">spam and infect PCs with viruses</a>, and they can't even get something as simple as webmail right. Yahoo!&reg;, please die.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sat, 05 Jul 2008 10:49:21 -0700</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>Firefox 3 gives us the Evil Eye</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=195
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=195
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>The Firefox 3 release is out, and... it's awful. I suppose Linux and Windows users don't notice this, they probably think it's great, because they have no taste. To a Mac user, it's repulsive and dysfunctional.</p>

<ol>

<li>I will give them this: it's a proper DMG without an installer, just drag the Firefox.app into your Applications folder, or wherever you want it. This concludes the positive items of this "review".</li>

<li>Even launching FF3 sucks: FF icon appears and bounces, then vanishes from the Dock, then a new FF icon appears and bounces, and after a second bounce it comes up. Ah. Upon further experimentation, it seems that if you switch between FF versions, it does this. Since I'm a web developer by day, I'm going to be going through this a lot. HATE.</li>

<li>The obvious first thing about the window is the <a href="http://kuoi.com/~kamikaze/images/evileye.jpg"><img src="http://kuoi.com/~kamikaze/images/evileye2.png" width="40" height="32" align="center" alt="O_o" />"Evil Eye" back/forward buttons</a>, which are just creepy. Make it stop leering at me! HATE.</li>

<li>Unlike a real Mac app, right-clicking on these buttons doesn't give you the customize toolar menu. It just does nothing, if you don't have a history. Clicking on other buttons does work. HATE. When you find the customize panel, you can use small icons, and the buttons look less insane.</li>

<li>Dragging the gray gradient "metal" parts of the interface on any modern Mac app will drag the entire window. This works in all of Apple's apps, and most 3rd-party Mac apps. It's a free behavior in metal apps created with Xcode. However, this isn't a real Mac app, it's an empty window painted entirely by Firefox. So dragging the window around doesn't work when you expect it to. It has a smoothed single menu bar/toolbar look, but only the Apple-controlled menu bar actually lets you drag. HATE.</li>

<li>Right-clicking on text to look something up in Dictionary or Spotlight doesn't work right. None of my Services menu options work; in particular, I use BBEdit's "New Window with Selection" and Mail's "Send Selection" items several times an hour. These features don't work, because Mozilla aren't using the real Mac text components, and didn't bother to finish the OS integration. HATE.</li>

<li>In Safari, Cmd-1 through Cmd-9 activate the first 9 toolbar bookmarks, presumably the ones you use the most. I use that constantly (I have them labelled 1 gmail, 2 Twitter, 3 GNews, etc.)...  There's no equivalent in Firefox. HATE.</li>

<li>The form controls are grossly broken and wrong on the Mac. They look like crap, and don't behave like real Mac controls. HATE.</li>

<li>I don't even want to get too far into performance. On a Flash-heavy, JS-heavy site, FF is currently using 97% CPU, Safari 37%. Both around 120MB RAM. Haven't done any long-term performance/memory testing, but I would expect Safari to continue being massively faster while using less CPU power. Speed isn't just in a number-cruncher's interest, it's a key part of making an app responsive. Every new release of Apple software is <i>faster</i> than the previous, while every new release of Mozilla software is <b>slower</b>. HATE.</li>

<li>[update 2008-06-20] Dragging a bookmark out of the bookmark bar doesn't destroy it in a puff of smoke, like dragging things out of the Dock, or Safari's bookmark bar, or any toolbar in Mac OS X. HATE.</li>

</ol>

<p>The whole thing is typical of everything Mozilla does. Left to themselves, they make ugly, unusable trash. If the users complain enough (like about not matching the Leopard light bg/dark fg theme), they can copy how something looks, but they're utterly incompetent at copying how it <b>works</b>, and the only user testing they do is with autistic Linux nerds. We already knew this, of course. Look at <a href="https://bugzilla.mozilla.org/">Bugzilla</a>, and you'll quickly discover that user experience is job 65535.</p>

<p>Sadly, I have to test my work on Firefox before release, though I use Safari for most of my work. I would never survive using Firefox as my real browser now.</p>

<p>I wasn't this negative about previous versions. I used to LIKE Firefox. It was probably just as bad as the current version, but that was before Safari showed us how a browser could not suck.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 19 Jun 2008 14:41:31 -0700</pubDate>
    </item>
      
    <item>
      <category>Roleplaying</category>
      <title>Planet Stories</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=194
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=194
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Yesterday morning, I ordered everything <a href="http://paizo.com/">Paizo</a>'s <a href="http://paizo.com/planetStories">Planet Stories</a> had that I didn't (I've long since read every Michael Moorcock and Robert E. Howard story). They arrived this morning (DAMN fast shipping, but of course we're in the same city):</p>

<ul>
<li>Gary Gygax: Anubis Murders, Samarkand Solution</li>
<li>C.L. Moore: Black God's Kiss, Northwest of Earth</li>
<li>Henry Kuttner: Elak of Atlantis</li>
<li>Leigh Brackett: Secret of Sinharat</li>
</ul>

<p>Yeah, some good old-fashioned swords &amp; sorcery (and swords &amp; planet) stories!</p>

<p>The upcoming Planet Stories novels look great, too, and <a href="http://paizo.com/paizo/messageboards/paizoPublishing/planetStories/general/requests&page=4">publisher Erik Mona has a great list of pulp authors he wants to add</a>.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 04 Jun 2008 17:29:06 -0700</pubDate>
    </item>
      
    <item>
      <category>Roleplaying</category>
      <title>Swords and Sorcery</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=193
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=193
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I've been working on my new tabletop RPG, both for use as a real tabletop game, and as the background and game system for my iPhone game. The plan is for the story to begin on the iPhone, and then provide a jumping-off point for tabletop play. I also have some online gaming tools I've been working on to make it easier for gaming groups to play even if far apart. Think of it as a whole party of webcam players from <a href="http://nodwick.humor.gamespy.com/ffn/index.php">Full Frontal Nerdity</a>.
</p>

<p>The game's name is <a href="http://kuoi.com/~kamikaze/Torchbearer/" target="_blank"><b>Torchbearer</b></a>, implying both the lowly henchman who creeps along behind the hero holding a torch so the hero can fight something terrible in the dark, and Prometheus, carrying fire down from the gods to humanity and paying terribly for his mercy and heroism.
</p>

<p>(if you're reading this in a feed, click More for the rest of the post)</p>
        <p><a href='http://kuoi.com/~kamikaze/read.php?id=193'>more...</a></p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 01 May 2008 05:36:24 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>iPhone vs. the Mobile World</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=192
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=192
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I've made some good progress on my iPhone game, and I've been thinking about how it compares to previous mobile platforms.</p>

<p>I've done mobile development with C on Palm, Java on a couple of J2ME devices, and now Objective-C/Cocoa on iPhone.</p>

<p>Mobile development is about limitations. Mobile devices have incredibly limited memory, often 64K RAM (yes, kilobytes, just like the Atari 800, Apple ][, and Commodeodor-64 (sorry, old habits die hard). They have incredibly limited CPU power; rarely more than 100MHz CPUs, often not even true 32-bit CPUs. The screen size itself isn't that bad; I was quite happy on my 320x192 (monochrome) or 160x192 (4-color) Atari 800. But that was on a 15+" TV screen, not a 2" phone LCD.</p>

<p>The iPhone's specs are significantly higher than those: a 300MHz CPU, 64MB user application space, and nigh-unlimited storage in a real filesystem (albeit a sandboxed filesystem), as well as real SQLlite databases. The screen is relatively huge: 320x480, with 256K colors, and 160DPI (nearly print quality). I'm not particularly enamored of the on-screen keyboard, or lack of a stylus for precision touch, but it's still a good device.</p>

<p>PalmOS was kind of awful even back in the '90s. 16-bit memory space, paging data in and out, a totally weird and alien non-file-based filesystem, and a flaky set of tools (anyone who liked CodeWarrior was insane). Every OS release broke most of the apps, often in data-destroying ways. Not a happy place. But the GUI was fantastically easy to program for, and the devices just worked right. If only Palm hadn't gone into a coma for the last decade, they could still be #1.</p>

<p>J2ME is actually kind of okay. Java's GUI support is pretty lame, but the language is nearly as efficient as native code, especially in the form used by mobiles. If you don't make gigantic trees of objects, and pay attention to memory use, you can make interesting stuff in 64K or 128K. The problem is that almost every phone is slightly incompatibility with the standard.</p>

<p><a href="http://code.google.com/android/">Android</a> has some chance of doing well with their approach, which is to use Java to compile to "native" code (actually an intermediate bytecode that gets compiled to native later), and provide common APIs which hopefully will be implemented the same way everywhere. Hope. That's the word, because there's no real Android phones yet, and the demos have not shown attractive work. Android's OS is pretty weird, and pretty awkward to use. A lot depends on whether any of the phone vendors can do something attractive and useful with it, and they don't have a good track record of making pleasant devices.</p>

<p>A few people have suggested using Python, Ruby, .NET, and other scripting languages on mobile, which is so ludicrous I can hardly believe my eyes when I see it. I'm a gigantic fan of using Python for system scripting, but its speed and memory consumption are abominable, there are few GUI libraries worth using on any platform, and none appropriate to a mobile device. Python's a totally inappropriate choice for mobile. Ruby's performance is significantly worse than Python's. .NET is tied to Wince devices, which are one of the worst failures ever in the mobile space.</p>

<p>So compared to all that, the iPhone's been the only one that isn't awful. It does require learning Objective-C and Cocoa, which are daunting to the uninitiated, but any halfway-competent Mac developer can learn the Touch API quickly.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 28 Apr 2008 16:14:25 -0700</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>Shell + Whitespace = FAIL</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=191
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=191
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>The old Unix and MS-DOS filesystems expected that all filenames would consist only of letters (lowercase on Unix, uppercase on MS-DOS), underscores, dashes,  periods, and digits (everything else was dangerous SOMEWHERE). So you could get away with tools requiring space-delimited filenames. This is still enshrined in the way we encode URLs: <code>http://example.com/Hey, check this out!.txt</code> becomes <code> http://example.com/Hey%2C%20check%20this%20out%21.txt</code> Ugh.</p>

<p>Nobody uses such a limited set of characters in their filenames anymore, except hardcore Linux nerds. So when they have to interact with real files, named with spaces and parens and all sorts of punctuation, it's a catastrophe. The Unix shells are, essentially, useless for dealing with this world.</p>

<p>If you want to rename all files in subdirs, you could try using find:</p>
<pre>
find . -name "*.foo" -exec mv {} `basename {} .foo`.bar
</pre>

<p>This fails when you hit spaces. Try interpolating quotes... And names containing quotes fail. It's an unsolvable problem. You can pipe it through 'xargs' and 'read' and try to put it together, but it'll never be more than a spit-and-baling-wire solution.</p>

<p>The sane solution is to use a real language to process the files, like Python. <a href="http://kuoi.com/~kamikaze/Python/code/changeExt.py">changeExt.py</a> is an example of this:</p>

<pre>
#!/usr/bin/env python

import os, sys

where = sys.argv[1]
fromext = sys.argv[2]
if not fromext.startswith("."): fromext = "."+fromext
toext = sys.argv[3]
if not toext.startswith("."): toext = "."+toext

for (root, subdirs, names) in os.walk(where):
	for name in [x for x in names if x.endswith(fromext)]:
		newname = name[0:-len(fromext)] + toext
		print os.path.join(root, name), "-&gt;", newname
		os.rename(os.path.join(root, name), os.path.join(root, newname))
</pre>

<p>There's more boilerplate to set it up, but it's correct, and can be easily modified for a different task, or generalized to call any function with eval.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sat, 26 Apr 2008 15:33:45 -0700</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>Don Knuth is Wrong, Alas</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=190
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=190
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://www.informit.com/articles/article.aspx?p=1193856">InformIT interview with Donald E. Knuth</a></p>

<p>I'm astounded, disappointed, and frankly repelled by much of what he says. This is almost tragic: I pretty much learned my serious computer science skills from <a href="http://sunburn.stanford.edu/~knuth/">Don Knuth's</a> <a href="http://www-cs-faculty.stanford.edu/~knuth/taocp.html">The Art of Computer Programming</a>. They're extraordinarily difficult books to read and work through, but they're very rewarding in teaching algorithm design and optimization. The beta versions of the new editions have been interesting, and the MMIX virtual machine was much more relevant to modern hardware. So imagine my surprise here:</p>

<blockquote><p>
<p><b><cite>Knuth:</cite></b></p>
the idea of immediate compilation and "unit tests" appeals to me only rarely, when I’m feeling my way in a totally unknown environment and need feedback about what works and what doesn’t. Otherwise, lots of time is wasted on activities that I simply never need to perform or even think about. Nothing needs to be "mocked up."
</p></blockquote>

<p>I'm not <b>entirely</b> a test-first, test-driven developer. Graphics and interaction make up most of my code, which isn't productive to unit test (QA testing, later, yes). But by and large, and especially when building any algorithm and back-end logic, the tests are the proof that I've actually done what I thought, that there are no typos, and that it runs in something less than geological time.</p>

<p>While some smaller segments of algorithms can be proven mathematically, most code cannot, and the larger interactions absolutely cannot. So you're left with testing the edge cases and most common cases. Unit testing is the only way to isolate those tests from the rest of your app; QA testing just shows that the app looks correct, unit tests show that each part is still working correctly.</p>

<blockquote><p>
<p><b><cite>Knuth:</cite></b></p>
Still, I hate to duck your questions even though I also hate to offend other people’s sensibilities—given that software methodology has always been akin to religion. With the caveat that there’s no reason anybody should care about the opinions of a computer scientist/mathematician like me regarding software development, let me just say that almost everything I’ve ever heard associated with the term "extreme programming" sounds like exactly the wrong way to go...with one exception. The exception is the idea of working in teams and reading each other’s code. That idea is crucial, and it might even mask out all the terrible aspects of extreme programming that alarm me.</p>

<p>I also must confess to a strong bias against the fashion for reusable code. To me, "re-editable code" is much, much better than an untouchable black box or toolkit. I could go on and on about this. If you’re totally convinced that reusable code is wonderful, I probably won’t be able to sway you anyway, but you’ll never convince me that reusable code isn’t mostly a menace.</p>
</p></blockquote>

<p>Yow. <a href="http://extremeprogramming.org/">Extreme Programming</a>'s main practices are just good software engineering practices (<i>GSEP hereafter</i>) pushed to the logical conclusion. Unit testing is GSEP, so all code where practical is written test-first, then implemented. Code review is GSEP, so all code is written in pairs, constantly reviewed. Regular check-in to source control is GSEP, so code is only written in short sessions and committed. If you can't check in, you throw it out and try again at a smaller task. Regularly integrating all code in the repository is GSEP, so you set up a build machine to immediately get all checked-in code, build it, and run the unit tests, with a prominent alert if the repository has broken code, and nobody does any more checkins until the build is fixed.</p>

<p>These are all provably 100% improvements in software engineering. The name "extreme programming" might be a bit silly, but it's actually the most serious set of practices I know of. For a single developer, some of them can slide without harm, and some teams might consider them to be more overhead than they're comfortable with, but they're as real as gravity, the heliocentric model of the solar system, and evolution. These are facts. It is nonsensical and religious to dispute them. I'm really appalled.</p>

<p>The notion that reusable code is a <b>menace</b>, that libraries of well-tested, carefully-designed tools do not lift you up and make you more powerful, is so alien and dysfunctional I don't know how to even communicate with that.</p>

<p>And now for the real horrorshow:</p>

<blockquote>
<p><b><cite>Knuth:</cite></b></p>
<p>I might as well flame a bit about my personal unhappiness with the current trend toward multicore architecture. To me, it looks more or less like the hardware designers have run out of ideas, and that they’re trying to pass the blame for the future demise of Moore’s Law to the software writers by giving us machines that work faster only on a few key benchmarks! I won’t be surprised at all if the whole multithreading idea turns out to be a flop, worse than the "Titanium" approach that was supposed to be so terrific—until it turned out that the wished-for compilers were basically impossible to write.</p>
<p>Let me put it this way: During the past 50 years, I’ve written well over a thousand programs, many of which have substantial size. I can’t think of even five of those programs that would have been enhanced noticeably by parallelism or multithreading. Surely, for example, multiple processors are no help to TeX.[1]</p>
<p>How many programmers do you know who are enthusiastic about these promised machines of the future? I hear almost nothing but grief from software people, although the hardware folks in our department assure me that I’m wrong.</p>
</blockquote>

<p>Actually, most of the good programmers are pretty enthusiastic about multithreading. If you perform a long operation in response to a user event, a single-threaded application will block (and on the Mac, give you the spinning beach ball of death: <img src="http://kuoi.com/~kamikaze/images/spinner.gif" width="32" height="32" alt="@" align="middle" />). A multithreaded application can respond to the event, fire off a task to work on it, and return to the user; this is a gigantic leap forward in usability.</p>

<p>The OS/2 user interface guidelines required that you react to an event within 0.1 seconds. Not surprisingly, OS/2 had fantastically good threading support for its time. Threading is hard with most older languages and APIs, but modern languages and frameworks make it approachable: Java has had quite good threading and tools for years, ever since Doug Lea's <a href="http://g.oswego.edu/dl/cpj/">Concurrent Programming in Java</a>, now the <a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html">java.util.concurrent</a> libraries. Objective-C/Cocoa has <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/Introduction/chapter_1_section_1.html">NSOperation</a>. Functional languages are better at multithreading, like <a href="http://www.haskell.org/">Haskell</a>, <a href="http://www.scala-lang.org/">Scala</a>, and <a href="http://www.opendylan.org/">Dylan</a>, and these languages are growing in popularity. One of the few major problems with <a href="http://python.org/">Python</a> is that the "Global Interpreter Lock" prevents true multithreading, which cripples its long-term performance. Python was never meant to be a <b>fast</b> language, but every generation of chips is going to make it fall exponentially further behind until the GIL is removed.</p>

<blockquote>
<p><b><cite>Knuth:</cite></b></p>
<p>I know that important applications for parallelism exist—rendering graphics, breaking codes, scanning images, simulating physical and biological processes, etc. But all these applications require dedicated code and special-purpose techniques, which will need to be changed substantially every few years.</p>
<p>Even if I knew enough about such methods to write about them in TAOCP, my time would be largely wasted, because soon there would be little reason for anybody to read those parts. (Similarly, when I prepare the third edition of Volume 3 I plan to rip out much of the material about how to sort on magnetic tapes. That stuff was once one of the hottest topics in the whole software field, but now it largely wastes paper when the book is printed.)</p>
<p>The machine I use today has dual processors. I get to use them both only when I’m running two independent jobs at the same time; that’s nice, but it happens only a few minutes every week. If I had four processors, or eight, or more, I still wouldn’t be any better off, considering the kind of work I do—even though I’m using my computer almost every day during most of the day. So why should I be so happy about the future that hardware vendors promise? They think a magic bullet will come along to make multicores speed up my kind of work; I think it’s a pipe dream. (No—that’s the wrong metaphor! "Pipelines" actually work for me, but threads don’t. Maybe the word I want is "bubble.")</p>
</blockquote>

<p>This is entirely backwards. The kind of work Knuth is doing is reaching irrelevancy, because it depends on having a single super-fast monolithic computing core, like an old-fashioned mainframe. But we don't have those anymore. We have a network or cloud of computing systems, and we push work out to a bunch of them, collect results when they get done, and make them fault-tolerant. <a href="http://setiathome.berkeley.edu/">SETI@home</a> is impossible on a monolithic computer, but a cloud of cheap, simple computers is chewing away on it all the time.</p>

<p>This isn't the future of computing, it's the present. Single-processor systems are archaic, and cannot scale much further. We can get almost infinite scaling by parallelism, following the model of the best computers around: the human brain. There is no core CPU in the brain, it's just a bunch of tiny, almost useless processor nodes chatting with their neighbors along weighted connections.</p>

<blockquote>
<p><b><cite>Knuth:</cite></b></p>
<p>I currently use Ubuntu Linux, on a standalone laptop—it has no Internet connection. I occasionally carry flash memory drives between this machine and the Macs that I use for network surfing and graphics; but I trust my family jewels only to Linux.</p>
<p>[...]</p>
<p>From the opposite point of view, I do grant that web browsing probably will get better with multicores. I’ve been talking about my technical work, however, not recreation.</p>
</blockquote>

<p>This is perhaps the most weird and alien part. The Web is not "recreation" only; it sure can be, like any other medium, but it was designed for publishing scientific papers, and it's primary uses are news and business; and, sure, communications and porn and games, so it's really covering all of human life. Like most technical people, I now spend most of my day on the Web, or using Web-related services like Twitter.</p>

<p>I apologize in advance for the following unpleasant comparison with Professor Knuth (who, while obviously out of touch now, has produced good work in the past), but I must note that <a href="http://lwn.net/Articles/262570/">Filthy Communist Richard Stallman does not have Internet access or surf the Web</a>. Is this just generational? I can't think of a lot of older computer scientists online; maybe our culture scares them and they're unable to filter the entertainment parts from the business parts? <a href="http://www.esquire.com/features/what-ive-learned/vint-cerf-0508">Vint Cerf</a> is still adapting and surviving in the real world. Maybe it's just 50 years of insular University life that makes you fear change and reality.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sat, 26 Apr 2008 12:41:53 -0700</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>Firefox: This update will make you angrier online.</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=189
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=189
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://kuoi.com/~kamikaze/read.php?topic=Web&id=188">Yet again</a>, Firefox silently installs a new update.</p>

<p>There's an option in Preferences, under Advanced, under Update, past the <a href="http://www.planetclaire.org/quote9.html">"Beware of Leopard" sign</a>, to "Ask me what I want to do", or "Automatically download and install the update".</p>

<p>Guess which one the "open organization" that opposes pre-checked boxes in updaters uses? Yeah, it pre-checks updates to everything, and automatically installs them.</p>

<p>Mozilla Corporation, congratulations. YOU SUCK.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 23 Apr 2008 12:37:58 -0700</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>Apple's Software Update for Windows iTunes and Safari</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=188
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=188
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>You know, I used to like Firefox. That was a long time ago, though.</p>

<p>As <a href="http://www.theangrydrunk.com/2008/04/18/oh-for-the-love-of-god/">The Angry Drunk</a> (a fine and decent bloke indeed) says:</p>
<blockquote><p>
Again, the take home message here is that Windows users are so fucking confused by a checkbox that they can’t be trusted with the horrible responsibility of installing a browser.
</p></blockquote>

<p>Dear Mozilla Corporation:</p>

<p>When Firefox stops insisting that it be the default browser;
<br />When Firefox stops updating every damn day;
<br />When Firefox stops auto-installing the <strike>USELESS PARASITIC SHIT-TICK CRASH REPORTER! FUCKING DIE DIE DIE YOU AWFUL CLINGY PIECE OF SHIT!</strike>, er, Crash Reporter;
<br />When you are not just a <a href="http://weblogs.mozillazine.org/asa/archives/2008/04/good_for_apple.html">whiny shill for Mozilla Corporation</a>, scared that you're going to lose your millions of dollars of Google funding;
<br />Then you will have a leg to stand on to whine about Apple installers.</p>

<p>Go blow yourself.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sun, 20 Apr 2008 11:28:38 -0700</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>Ted Neward Goes Back to Vietnam</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=187
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=187
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://blogs.tedneward.com/2008/04/16/Do+You+Fall+Prey+To+Technical+Folk+Etymology.aspx" rel="nofollow">Internet Blowhard Ted Neward</a> has done yet another of his pompous "technology X is like Vietnam! Or Auschwitz! It's BAD, man!" rants. I wouldn't even waste my time, but...  this is wrong far beyond his usual levels of narcissistic ignorance.</p>

<p>The short version, if you ignore his masturbation at the altar of Microsoft, and his characterization of software engineers as superstitious cargo-cultists who are incapable of rationally evaluating technologies (clearly, he looks in the mirror too much), is that Domain-Specific Languages and Functional Programming, because they're "popular" this year, are just an instinctive reaction, and there's probably nothing to them.</p>

<p><a href="http://en.wikipedia.org/wiki/Domain_Specific_Language">Domain-Specific Languages</a>, aka <a href="http://c2.com/cgi/wiki?LittleLanguage">Little Languages</a>, have been around and heavily used for nearly 40 years on Unix, and to some extent before that. They're not some newfangled solution to a temporary pain, they're a long-term, well-proven strategy for making your expression be as close as possible to the domain space, rather than trying to force-fit a domain into your language-du-jour. And yes, I say that as someone who's written at least 20 DSLs in the last 20 years, and made customers very happy with them.</p>

<p><a href="http://en.wikipedia.org/wiki/Functional_programming">Functional programming</a> is over 50 years old (Lisp is semantically an extremely powerful language, it's just syntactically unreadable; most other FPs are much more readable). For the tasks it's well-suited for, it's extremely useful; for some other tasks, especially interaction, it's not. Very few people would claim it's a silver bullet for all tasks, but only a fool rejects it entirely where it solves a problem better.</p>

<p>Ted Neward is that fool.</p>

<p>[I would have merely posted this as a comment on his blog, but his comment form wasn't working. I expect that Neward wrote it himself, since it's in ASPX.]</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 16 Apr 2008 10:55:11 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>History Meme: the Shell is History</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=186
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=186
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>There's a <a href="http://www.google.com/searchq=%22history+meme%22">history meme</a> going around the blogotubes, where you run the Unix command:</p>

<pre>history|awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn|head</pre>

<p>This reports the top 10 most-used commands in your shell history. Which, for heavy shell users, is pretty revealing about their work habits.</p>

<p>But... I barely use the shell at all anymore. I have always auto-wiped my history when I log out (<i>You: "Mark, are you paranoid?" Me: "Why do you want to know? Who are you working for?"</i>), so I can't show stats, but all I ever run from shell now is "open" (opens a file/folder in Finder, and mostly I use Spotlight instead now), sometimes "touch" or "mkdir -p", because creating empty files and chains of folders is easier that way; maybe I should write an AppleScript app to do those tasks.</p>

<p>From 1988 to 2003-ish, I was a Unix nerd, I lived almost entirely in the shell. <a href="http://vim.org/">Vim</a> was the only editor I needed, <a href="http://ant.apache.org/">ant</a> my only build environment, and I would touch the mouse only if I was web-surfing or using a paint program (actually, I mostly used Opera with keyboard controls).</p>

<p>I now see that that was archaic and extremely limited. It's easier to use <b>good</b> graphical tools (which excludes anything on Linux or Windows), and BBEdit, Eclipse, Xcode, Preview, and the Finder (even as flawed as it is) blow away all the simplistic tools I was using. If I need to glue several things together, I have <a href="http://www.apple.com/applescript/">AppleScript</a>; all Unix shells can do is combine in/out pipes of plain text from programs that have no user interaction, while AppleScript gives you real data structures and the ability to control a running application.</p>

<p>I don't need the primitive "<a href="http://memory-alpha.org/en/wiki/Stone_knives_and_bearskins">stone knives and bearskins</a>" environment of a shell that much anymore.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 16 Apr 2008 07:02:37 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>Non-Blocking User Interface</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=185
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=185
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Spent the weekend working on my Secret Mac OS X Game (as opposed to my Secret iPhone Game, which is further along but I can't make more progress until Apple sends me a developer key), and I came to a little choice in user interface design that made me appreciate how the Mac is different from other platforms.</p>

<p>In this game, you can edit sprites by selecting them, and a dialog comes up, you change its properties, and put it away.</p>

<p>In Java or any other GUI I've used in the last 25+ years of writing graphical apps, I would make a modal dialog that blocked the main thread until it was disposed of, with a bunch of fields, and nothing would change until the user clicked OK. At that point, the object is changed, and you go back. This is easy to write in either AWT or Swing; it might be 10 lines of code, where the alternative would be many hundreds of lines.</p>

<p>At first I started to do that here. But it felt wrong. It didn't feel like how any other Mac app works.</p>

<p>So now, I save the old values before presenting the editor, and let you change values immediately, and there's a Cancel button to revert to the old values. If you just select something else or close the editor panel, your values are saved. It just removes that one step of hitting OK, but it makes an enormous difference to feeling like it's easy to edit a sprite. And it turns out in Cocoa that that's not noticeably harder to code than the obtrusive Java-like way.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sun, 13 Apr 2008 19:57:36 -0700</pubDate>
    </item>
      
    <item>
      <category>Religion</category>
      <title>Fitna</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=184
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=184
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Watch <a href="http://video.google.com/videoplay?docid=3369102968312745410" target="_blank">Fitna</a>, by Geert Wilders. It's just 15 minutes of quotes from the Quran, footage of Muslims preaching their hatred, and the evil consequences.</p>

<p><a href="http://blog.wired.com/underwire/2008/03/dutch-film-fitn.html" target="_blank">LiveLeaks has removed their copy of the film after receiving death threats from Muslims.</a> Google and YouTube, so far, have had more courage.</p>

<p>This is a response, of sorts, to <a href="http://video.google.com/videoplay?docid=-7106648073888697427&q=submission" target="_blank">Submission</a>, by <a href="http://en.wikipedia.org/wiki/Theo_van_Gogh_%28film_director%29" target="_blank">Theo van Gogh</a> and <a href="http://en.wikipedia.org/wiki/Ayaan_Hirsi_Ali" target="_blank">Ayaan Hirsi Ali</a>. For the "crime" of making this film, Muslims murdered van Gogh, and have driven Ali into hiding. The note left on van Gogh's mutilated body threatened to destroy Hirsi Ali, Holland, and America (apparently our "Great Satan" powers extend to making Dutch people make movies...)</p>

<p>There's a joke I wish I could laugh at, but I can't, because it's true:</p>

<blockquote><p>
<i>"Islam is a religion of peace, and we will torture and murder anyone who says it isn't!"</i>
</p></blockquote>

<p>This isn't <b>just</b> Islam, it's all religions. Islam is just the most pernicious one today.</p>

<p>I have nothing but contempt for the notion of invisible sky pixies. Anyone who believes in that nonsense is delusional, but so long as they remain harmless I don't really care if they talk to imaginary friends. But religions, especially cults that worship death like Christianity and Islam, are another matter. When a religion claims you will somehow survive death and be given a happy eternal existence for bringing death to others (whether it's called "Jihad" or "Crusade"), and causes people to systematically carry out a program of hate and terror, killing everyone who happened to be listed in a book dictated by an illiterate drunkard and schizophrenic in the dark ages, they are the enemies of civilization, and of all life.</p>

<p>For over 15 centuries, Christianity was the enemy of civilization, <a href="http://en.wikipedia.org/wiki/Tomás_de_Torquemada" target="_blank">torturing and murdering people</a> for <a href="http://en.wikipedia.org/wiki/Cathars" target="_blank">having a slightly different theology</a>, or <a href="http://en.wikipedia.org/wiki/Giordano_Bruno" target="_blank">saying that the Earth orbits the Sun</a>, or <a href="http://en.wikipedia.org/wiki/Joan_of_Arc" target="_blank">women wearing pants</a>, or <a href="http://en.wikipedia.org/wiki/Witchcraft" target="_blank">floating in water</a>. It was not until the split and infighting between Catholicism and Protestants weakened both that science and reason were able to get some peace and quiet, and drag the civilized world out of mud and shit into modern prosperity. Even now, it's a creepy sensation to have to live among Christians. There is no apology possible for being a "former" mass murderer; sane, civilized people try to put it aside and get along, but the fact is, we're living next to a half-neutered death cult that was in its time every bit as horrible as Islam is today.</p>

<p>But Christianity was limited in range and destructive power by the technology of the time. Muslims are unfortunately able to ride on the coattails of scientific progress, and hypocritically and blasphemously use modern technology while attacking the sane people who created it. It is a <b>dangerous</b> death cult because we have foolishly given them money and weapons <a href="http://en.wikipedia.org/wiki/Afghanistan" target="_blank">to attack our enemies</a>, or because they had the good luck to live in <a href="http://en.wikipedia.org/wiki/Saudi_Arabia" target="_blank">a desert shithole that has oil under it</a>, and now they've turned these weapons against civilization.</p>

<p>We survived Christianity only because they left their total foaming-at-the-mouth psychopath stage before they could get AK-47s, grenades, and nuclear weapons. Muslims are still in that total foaming-at-the-mouth psychopath stage, and unfortunately won't stay home, pray to Mecca, murder each other over an inheritance question from 13 centuries ago, and leave us alone for the additional 5 centuries or so they need to deteriorate into a harmless, neutered death cult.</p>

<p>Most Muslims who live in the U.S. have at least learned to behave legally; they're no happier with our hedonistic and irreligious lifestyle than we are with their misogyny, homophobia, and religious intolerance, but they mind their own business and we mind ours, and pretend not to care. But <a href="http://en.wikipedia.org/wiki/Naveed_Haq" target="_blank">Naveed Haq</a> showed that even in Seattle, as far from their jihad as you can get, the psychopaths will still pop up and murder anyone, even defenseless pregnant women.</p>

<p>So. There's no way for Islam to fade away before doing more harm. Ignoring it doesn't work, because they intend to conquer the world and kill or convert everyone who is not Muslim. There's no possibility of "peace" with that ideology. The only thing you can do is to expose it, mock it, try to cure people of it, and where necessary defend yourself. They are surrounded, weak, largely impoverished, and low-tech except for what they can steal or buy from us. The only weapons they have are threats and madness. Shutting up because they make threats gives them power over you, and allows them to perpetuate their madness.</p>


<p>The site <a href="http://www.faithfreedom.org/" target="_blank">Faith Freedom</a> says:</p>
<blockquote>
<p>Islam can't be reformed, but it can be eradicated. It can't be molded, but it can be smashed. It is rigid, but brittle. That is why Muslims can't tolerate criticism of it. To eradicate Islam, all we have to do is tell the truth. It's that simple. This was not possible before, but with the help of the Internet, it is now. The insanity of this creed is so glaringly obvious, it boggles the mind. All it takes to see that is to read the Qur'an.</p>

<p>The truth about Islam is out. It's here on this site. With truth and reason alone we can demolish this tall tower of lies. If you help spread the truth we can bring this house of cards down sooner than anyone can imagine. With truth, the decent Muslims will leave Islam and with each Muslim who leaves, we gain a new soldier in our fight against terrorism. We are growing exponentially. The days of Islam are numbered and better days are ahead. Many of us will see that day. Meanwhile, we may have to go through dreadful times. A storm is approaching. It will wipe out Islam, but it will also destroy millions of lives in its path. We can avoid this Armageddon if we stop lying. Islam is not a religion of peace. It is evil. It is a dangerous cult of death and terror. The proof is here. Let us tell the truth. Save lives, not lies. All that is necessary for evil to triumph is for good people to do nothing. Do something and save the world. To become a soldier in this army of light, all you have to do is face the truth. This site exists to help. Help spread the truth. Let it reach the world. It will do its work.</p>
</blockquote>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sat, 29 Mar 2008 05:37:17 -0700</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>Twatting about on Twitter</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=183
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=183
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I am now <a href="http://twitter.com/mdhughes">mdhughes</a> on Twitter, twatting/tweeting/twooting/twittering away about technical stuff.</p>

<p>I'm still convinced it has a ludicrously bad infrastructure, thanks to Ruby's speed and memory problems, but to get SMS interaction, it's that or Facebook (bah), and I plan to use it at WWDC'08, when it will probably go down like a $10 tranny whore instead of actually working.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sun, 23 Mar 2008 17:20:30 -0700</pubDate>
    </item>
      
    <item>
      <category>Cocoa</category>
      <title>Cocoa APIs Which Inexplicably Do Not Exist</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=182
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=182
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>There's no method on NSString for trimming whitespace... So I hacked up this, which appears to work for my use cases, but I'm not sure I'm doing sane things with UTF-8.</p>
<pre>
+ (NSString *)trim:(NSString *)s {
  NSInteger len = [s length];
  if (len == 0) {
    return s;
  }
  const char *data = [s UTF8String];
  NSInteger start;
  for (start = 0; start < len && data[start] <= 32; ++start) {
    // just advance
  }
  NSInteger end;
  for (end = len - 1; end > start && data[end] <= 32; --end) {
    // just advance
  }
  return [s substringWithRange:NSMakeRange(start, end - start + 1)];
}
</pre>

<p>[update 2008-06-17:]</p>

<p>It does exist, it's just... well, inexplicable:</p>
<pre>
[@" foo " stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
</pre>

<p>My trim: is shorter and faster, but at least there is a "standard" way to do it.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 13 Mar 2008 08:10:12 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>On Being a Snob</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=181
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=181
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I'm a Snob, and proud of it. This isn't caused by my infatuation with the Mac and iTouch (yes, I'm studying the iPhone SDK now, more on that later). My infatuation with the Mac, and all the rest of my snobbery, is caused by my devotion to certain ideals, and my contempt for both stupidity and aristocracy.</p>

<p>(If you're reading this in a newsreader, click "More" for the rest of the post.)</p>
        <p><a href='http://kuoi.com/~kamikaze/read.php?id=181'>more...</a></p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sun, 09 Mar 2008 19:51:39 -0700</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>Mr IEBlogger, TEAR DOWN THIS WALL!</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=180
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=180
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Apparently the angry mob of web developers armed with pitchforks and torches have <a href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx">convinced Microsoft to behave like adults for once in their sorry lives</a>.</p>

<p>While it doesn't say anything good about the morons developing IE that they tried this in the first place, at least someone in MS recognized that they don't live in isolation from the real world anymore.</p>

<p>And someday, maybe they'll figure out how to support application/xhtml+xml and proper XHTML content, just like real browsers!</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 03 Mar 2008 23:18:37 -0800</pubDate>
    </item>
      
    <item>
      <category>Cocoa</category>
      <title>Cocoa APIs That Suck Goat Ass</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=179
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=179
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>To make a list of integers in Java, you type:</p>
<pre>
List&lt;Integer&gt; data = Arrays.asList( new Integer[] { 1, 2, 3, 4, } );
</pre>
<p>Ugly syntax wrapped around it, but all the data is pretty clean. Easy enough.</p>

<p>In Python, you type:</p>
<pre>
data = [ 1, 2, 3, 4, ]
</pre>
<p>Suck on that, Java. Javascript, Groovy, and most newer languages are also easy like that.</p>

<p>In Objective-C, you write... Parents, please remove your children from the room, they shouldn't look upon this, lest their <a href="http://kuoi.com/~kamikaze/images/facemelt.jpg">face melt off</a>:</p>
<pre>
NSArray *data = [NSArray arrayWithObjects:[NSNumber numberWithInteger:1],
  [NSNumber numberWithInteger:2],
  [NSNumber numberWithInteger:3],
  [NSNumber numberWithInteger:4],
  nil];
</pre>

<p>Yeah, you wouldn't want <b>INTEGERS</b> to be usable as objects, would you?  So I screwed around with varargs a bit, came up with this. Use it and be happy:</p>
<pre>
+ (NSMutableArray *)arrayWithSize:(NSInteger)count integers:(NSInteger)arg, ... {
  NSMutableArray *array = [NSMutableArray arrayWithCapacity:count];
  if (count &gt; 0) {
    // first arg not part of varargs
    [array addObject:[NSNumber numberWithInteger:arg]];
    va_list arglist;
    va_start(arglist, arg);
    NSInteger item;
    NSInteger i;
    for (i = 1; i &lt; count; ++i) {
      item = va_arg(arglist, NSInteger);
      [array addObject:[NSNumber numberWithInteger:item]];
    }
    va_end(arglist);
  }
  return array;
}
</pre>
<p>Then you can invoke it like:</p>
<pre>
[DataUtil arrayWithSize:4 integers:1, 2, 3, 4];
</pre>

<p>(Yes, I know you can add methods to classes with categories in Obj-C, so I could add that to NSArray instead of to my own utilities class. I find that hard to follow. Go ahead and make your code confusing if you like.)</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 25 Feb 2008 19:08:45 -0800</pubDate>
    </item>
      
    <item>
      <category>Cocoa</category>
      <title>New Cocoa APIs That Saved My Life (at least a few hours of it)</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=178
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=178
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <dl>
<dt><a href="http://developer.apple.com/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-DontLinkElementID_15">NSPredicate regular expression support</a></dt>
<dd>This has actually been in Cocoa since at least 2005, according to the revision history, but the "common wisdom" imparted online and in books was that you need an external regexp library, because there wasn't one in Cocoa. That's just wrong. I'm not sure why people have a hard time finding it, when it shows up in a search of the documentation, and is in the obvious place for "queries to match data": <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html#//apple_ref/doc/uid/TP30001187">NSPredicate</a>.</dd>

<dt><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSAlert_Class/Reference/Reference.html#//apple_ref/occ/instm/NSAlert/setAccessoryView:">NSAlert setAccessoryView:</a></dt>
<dd>You can add arbitrary Cocoa widgets to an NSAlert. Like, say, a text input field:
<pre>
- (NSString *)input:(NSString *)prompt defaultValue:(NSString *)defaultValue {
  NSAlert *alert = [NSAlert alertWithMessageText:prompt
                   defaultButton:@"OK"
                   alternateButton:@"Cancel"
                     otherButton:nil
             informativeTextWithFormat:@""];

  NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
  [input setStringValue:defaultValue];
  [alert setAccessoryView:input];
  NSInteger button = [alert runModal];
  if (button == NSAlertDefaultReturn) {
    [input validateEditing];
    return [input stringValue];
  } else if (button == NSAlertAlternateReturn) {
    return nil;
  } else {
    NSAssert1(NO, @"Invalid input dialog button %d", button);
    return nil;
  }
}
</pre>
</dd>

</dl>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sat, 23 Feb 2008 05:56:30 -0800</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>Night 2 of the MacBook Air Era</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=177
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=177
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://kuoi.com/~wes/">Wes</a> noted that the Air's jewelry box design is the same as the iPhone and iTouch (I love that neologism, Apple should have called it that from the start!). I'm still blown away by how elegant that is. Compare this to the standard Dell industrial cardboard box, styrofoam, tons of plastic wrapping, and it's just scary. It's like they're not even AWARE it could be attractive. Like Michael Dell WANTS to suck all joy out of your computing before you even get the computer on and find out it's infected with Windows.</p>

<p>Anyway. Turns out I want <a href="http://developer.apple.com/">Xcode</a> on the Air, so I go hunting for it. Not on install disk 1 under "Optional Installs" like it is on most Macs, but the <a href="http://docs.info.apple.com/article.html?artnum=307317">remote drive</a> software is, so I install that, restart, go into Sharing, turn on Disk Sharing, and it's visible on the Air. I did nothing on the Air, and yet it pops up on the desktop. Neat!</p>

<p>Disk 2 has Xcode, Dashcode, and WebObjects (ew), install went pretty good; a bit slower than normal, but not bad.</p>

<p>Apple Store was out of the external drive yesterday, and now I'm thinking maybe I won't get one. See if I can live without it.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 18 Feb 2008 23:56:30 -0800</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>Day 2 of the MacBook Air Era</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=176
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=176
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Yesterday, after many days of trying and failing to find one in stock, I went out to the <a href="http://www.apple.com/retail/bellevuesquare/">Bellevue Square Apple Store</a>, and bought my <a href="http://www.apple.com/macbookair/">MacBook Air</a>. The box alone is something to see. It's like a jewelry case. Thick box top that lifts off, and the Air is nestled into a display tray, ready to be admired. Lift that out, and the accessories are down in the second tray. It's the most technoerotic computer packaging I've ever seen.</p>

<p>It is a truly beautiful machine. It doesn't even seem to be a computer, it's just a wafer-thin keyboard with a wafer-thin screen attached. If you're not using the ports or power, there are no ugly breaks in the line of the case. While the MBP is a fine piece of hardware, and makes a great portable desktop computer system, it's still a giant technical-looking block of cable ports and slots and stuff. The Air looks like a magical artifact, like the <a href="http://www.imdb.com/title/tt0085811/">Glaive</a>, or <a href="http://www.imdb.com/title/tt0082348/">Excalibur</a> (maybe <a href="http://www.imdb.com/name/nm0540627/">Thomas Malory</a> gave <a href="http://www.apple.com/pr/bios/ive.html">Jonathan Ive</a> some design advice). And of course, picking it up, you know it's magic; 3 pounds isn't even noticeable, it's like a stack of paper.</p>

<p>While all the <a href="http://www.itbusinessedge.com/blogs/rob/" rel="nofollow">media trolls</a> were whining about missing ports and how the Air doesn't give them handjobs and $200 kickbacks, they missed one: there's no antitheft cable slot on the Air. This would actually be a real problem on the MacBook and MacBook Pro, because those are always going to be tethered to ethernet cabling and power and a half-dozen life-support cords, so taking it with you when you go somewhere is a pain. The Air doesn't care. Unplug the magsafe power cord, and take it. I'd still rather have one, but enough to break the lines of the machine? Maybe not. I should take a closer look at what they do for security at the Apple Store (besides having very polite armed guards at the door).</p>

<p>The keyboard is more solid and has a crisper feel than the MacBook's mushy, wiggly cheap plastic toy keycaps, which is good--I prefer the MacBook Pro's keyboard, but this is actually quite pleasant. The screen is almost too bright. I dropped the brightness a bit after I found the world outside the screen was getting darker. The VGA-quality iSight is pretty lame, but it does work with iChat videoconferencing, even with special effects (I iChatted myself across the room with Bonjour, got some <a href="http://kuoi.com/~kamikaze/Audio/review_mmm.php">wicked feedback</a>). The little teeny tinny speaker under the arrow keys is awful. To sound good, you will need <a href="http://www.sennheiser.com/sennheiser/icm_eng.nsf">headphones</a> or external speakers (audio jack, unless you like wasting your USB port on sound).</p>

<p>Performance is okay. I'm able to run a basic <a href="http://www.eclipse.org/">Eclipse Europa</a> (NOT <a href="http://www.myeclipseide.com/">MyEclipse</a>), and work on my hobby project. <a href="http://secondlife.com/">Second Life</a> gets &lt;10 fps fullscreen with all settings at minimum, in a sim where the MBP gets &gt;30 fps windowed with everything maxed out, but it does run. It's not unusable, just really slow at the 3D graphics (which you'd expect, since it has a crappy Intel onboard graphics thing). For anything that doesn't do a lot of graphics, it's a pretty snappy machine. It's still a 64-bit, Intel Core 2 Duo, even though it's only 1.6GHz, and 2GB RAM is as much as I have in my MBP (yeah, I should upgrade it to 4GB... Not real motivated to spend money on it now).</p>

<p><a href="http://vside.com/">vSide</a> runs great, though. Right after I bought it, I couldn't wait to get home to pop it out, so I went to a <a href="http://tullys.com/">Tullys</a> and used their electricity and wifi, and went into vSide to goof off while waiting for power to charge up, and found a music listening station to see if there was any good music...  They had <a href="http://www.listentofeist.com/">Feist</a>, playing "1 2 3 4", the song in the <a href="http://www.apple.com/ipodnano/ads/">iPod Nano ad</a>. Apple is everywhere!</p>

<p><a href="http://www.mac.com/">.Mac</a> is a life-saver with this device. All of my personal information just syncs across. As long as I'm using IMAP, I don't care which machine I run email on (my POP accounts are going to be a problem until I set them up to forward to another account that can do IMAP). iDisk lets me move files into a common space that all my machines can access. I already used it for that somewhat, but now I'm going to be using it as my primary "drive". Guess I'd better upgrade to 20GB. Alternately, I could just put more stuff on my little portable USB drive, but that's more stuff to carry around. Meh.</p>

<p><a href="http://www.newsgator.com/Individuals/NetNewsWire/">NetNewsWire</a> could be better at .Mac syncing. Half the time, it fails. When it succeeds, it's really slow (okay, I have 1100 feeds, guess it might take a while). I guess I could go back to <a href="https://bloglines.com/">Bloglines</a>, but I do like the NNW experience better. This is, of course, why they released NNW for free: to get people like me to buy NewsGator.</p>

<p>No idea yet how I'm going to set up <a href="http://www.apple.com/macosx/features/timemachine.html">Time Machine</a> (Apple's is nice, but I prefer <a href="http://www.gutenberg.org/etext/35">the original</a>); my big firewire drive won't connect to the Air. I may have to wait for the <a href="http://www.apple.com/timecapsule/">Time Capsule</a> gadget (I don't own an AirPort Extreme yet, so it's a practical solution to the networking problem anyway), and back up onto my USB media drive until then.</p>

<p>I don't have a bag small and light enough for the Air; my <a href="http://developer.apple.com/wwdc/">WWDC07</a> laptop bag is great for the MBP, but about as heavy as the Air and 10x more volume. I shopped around for a bag, and there's nothing. While using a <a href="http://www.manilamac.com/">padded manilla envelope</a> is an amusing idea, I actually need a bit more protection and handles and/or a strap. I'd love to have the <a href="http://www.crumplerbags.com/Cart/index.php?catId=11">Crumpler Winston Fleece</a> in a smaller size. Instead, I bought a cheap <a href="http://www.amazon.com/ANGLE-SwissGear-Wenger-Computer-Case/dp/B000LJW6DY">SwissGear Angle</a> that's still too big by several inches, and weighs half as much as the Air. MADNESS! I'm sure there'll be some nice cases in a few weeks or months, but until then, it's going to be hard to carry the Air correctly. Ideally, the case should be just a layer of neoprene with a zipper, and a carrying strap that can be tightened to use as a handle or loosened to use as a messenger bag. And it should be black with aluminum-colored trim.</p>

<p>So, worth the $1799? Yes, absolutely. I don't know that I'd buy the $3098 64GB SSD version, regardless of how much faster the drive is; 16GB less space would be crippling on such a small device. For me, this machine only makes sense as a travel computer, but it's SO good for that task that anything else seems archaic, it makes every other laptop look as lame as the iPhone makes every other smartphone.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 18 Feb 2008 14:29:53 -0800</pubDate>
    </item>
      
    <item>
      <category>Web</category>
      <title>meta http-equiv="X-UA-Compatible" content="IE=a rotting corpse"</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=175
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=175
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Anyone who develops web pages woke up to some nasty news about Internet Explorer 8 today, according to a <a href="http://alistapart.com/articles/beyonddoctype">Microsoft developer's press release on A List Apart</a>. The one-stop response is <a href="http://ejohn.org/blog/meta-madness/">John Resig's X-IE-VERSION-FREEZE</a> post, and see also <a href="http://webkit.org/blog/155/versioning-compatibility-and-standards/">Surfin' Safari's "we don't need it" response</a>.</p>

<p>IE6 and IE7 don't render web pages correctly, so Microsoft won't have IE8 won't render them correctly, either. They want developers to insert a new tag in their page &lt;head&gt;:</p>
<blockquote><p>
<tt>&lt;meta http-equiv="X-UA-Compatible" content="IE=8" /&gt;</tt>
</p></blockquote>
<p>This will make the page render using the marginally-less-incompetent IE8 rendering engine. If you leave it off, it renders like IE6 or IE7. If IE9 ever comes out, the page will still render like IE8, so you'd either have to change the content to "IE=9" on every page you ever wrote, or use the forward compatibiity content, "IE=edge". Naturally, being Microsoft, they discourage the use of forward compatibility. If you were so stupid that you still worked at MS<a href="http://kuoi.com/~kamikaze/read.php?topic=Web&id=175#rotting_0">[0]</a>, you certainly wouldn't want the world to get any more useful and functional in the future, after all.</p>

<p>So Microsoft has opted out of following web standards in the future; they want to condemn the entire world to render like IE6 did, even when they "upgrade" their browser.</p>

<p>Well, enough of this. The answer is not to write version-specific code and leave the browser to stagnate; MS already tried that with IE6, and it's rotten. The answer is to write pages according to <a href="http://www.w3.org/html/">the HTML specification</a>, test on real browsers like <a href="http://apple.com/safari/">Safari</a> and <a href="http://www.mozilla.com/firefox/">Firefox</a> and <a href="http://opera.com/">Opera</a>, and if Microsoft is so incompetent that they can't handle the standards, they should be ignored. Put in "IE=edge" if you feel generous. I suppose I will for work, but never for my own pages.</p>

<p>The longer-term solution is to stop enabling Microsoft. Option 1 is to simply redirect IE users to a download page for a real browser. Option 2 is to write an ActiveX plugin for IE that will let us embed WebKit to render pages, much like the Tamarin-on-IE7 hack. Then we can shove a proper rendering engine down at people who are still foolish enough to keep using IE.</p>

<hr />
<dl>
<dt><a name="rotting_0">[0]</a></dt>
    <dd>Everyone competent has already left for Google or Amazon or startups. I live in Seattle Eastside and get to regularly see the kind of sub-room-temperature IQs who still work there. I have actually seen these people using shit-brown and puke-green Zunes. Yes, seriously!</dd>
</dl>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 23 Jan 2008 17:57:01 -0800</pubDate>
    </item>
      
    <item>
      <category>Media</category>
      <title>Cloverfield Should be Lost</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=174
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=174
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I saw <a href="http://www.imdb.com/title/tt1060277/">Cloverfield</a> last night, and I regret it. I must warn you all to avoid this film, don't waste your time and money, and do not encourage this bullshit.</p>

<p>If this had been filmed with a traditional camera on steadicam, it might be a reasonably good monster movie with a better-than-average character story. Sadly, however, hack <a href="http://www.imdb.com/title/tt0411008/">pseudo-reality TV</a> writer <a href="http://www.imdb.com/name/nm0009190/">J.J. Abrams</a> watched <a href="http://www.imdb.com/title/tt0185937/">The Blair Witch Project</a> <b>FAR</b> too many times, and tried too hard to imitate it.</p>

<p>The entire film is shot from the POV of a hand-held camera owned by one of the characters. When the characters are running, which they are for most of the film, the camera shakes constantly, veering off to the sides or down at the ground instead of UP at the action, so nothing can be seen. Even when at rest, the character doesn't hold the camera straight. It's nauseating to watch.</p>

<p>Blair Witch kept the running to a minimum, had a high-res camera on a tripod as well as the videocamera, and despite the "found footage" premise, was competently shot. Cloverfield is the worst-shot, most aggressively audience-hostile, incompetently-filmed piece of footage (I cannot even bring myself to call it a "movie" as it is) that I have ever witnessed. There are home movies of 5-year-olds having a birthday party which are better filmed.</p>

<p>The story itself is fine; I liked the characters and they mostly acted with some sense, though why Marlena follows a group of near-strangers into certain doom instead of escaping is unclear, but she is mentally damaged by that point. The monster looks good. The baby monsters/parasites/low-level enemies are an unnecessary distraction to the story, but are well-executed. The special effects and the military presence are great. The product placements for Nokia were very aggressive, and clearly the film should have just stopped for a Nokia commercial rather than shove excess placements in.</p>

<p>I was immensely happy to see that the ending didn't flinch away from what really happens to anyone stupid enough to stay in a city where a giant monster is attacking.</p>

<p>But for the filming, this film deserves to die, and J.J. Abrams needs to be busted down to making commercials for Nokia.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 21 Jan 2008 10:10:43 -0800</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>MacBook Air</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=173
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=173
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><img src="http://kuoi.com/~kamikaze/images/macbook_air.jpg" width="500" height="473" alt="MacBook Air" /></p>
<p>"separate fanbois from cash.", as DarkMark said of it yesterday. And yes, it does that. And I need one. My back needs me to get one.</p>

<p>I currently have a MacBook (5.0 lbs), and a MacBook Pro 17" (6.8 lbs).</p>

<p>I use the MBP for software development, <a href="http://secondlife.com/">Second Life</a>, and as my connection point to the Net, because I always have it on me. This kinda sucks, because it's HEAVY. It's HUGE, too, but it fits nicely in my WWDC 2007 bag. I'm more concerned with the effect that carrying 7+ lbs (once I add the power supply, because it has maybe 2 hours of battery life, MAYBE).</p>

<p>The MB used to do this job minus the software development and <a href="http://secondlife.com/">Second Life</a>, and also served as my writing tablet. But I can't carry both the MBP and the MB (12 lbs?!?), and the weight difference isn't much, so it made more sense to carry the slightly heavier one that was so much better.</p>

<p>The MacBook Air is 60% of the weight of the MB, and <b>44%</b> of the weight of the MBP. I could happily carry the Air all the time, assuming it met my needs... The price is high compared to a MacBook, but not unreasonably so, compared to other ultra-light laptops. The sealed memory, disk, and battery are fine, since I'd just take it back to an Apple Store in event of emergency anyway. This is why you should always buy AppleCare.</p>

<p>What I actually need, day to day away from my desk, is Safari, Mail.app, NetNewsWire, BBEdit, and iTunes. <a href="http://myeclipseide.com/">MyEclipse</a> is too heavy for use on the MB, and the MBA has the same performance, but <a href="http://syntori.com/mochacode">MochaCode</a> is pretty freaking amazing, light, and fast, albeit still in pre-release, and Xcode runs fine on the MB; as I move to more and more Objective-C, I care less and less about the Java stuff. When I need to do serious Java development, I can do that at work (increasingly, that's the only Java code I want to touch) on the company's iMac workstation, or at home on my MBP.</p>

<p>My one concern at this point is how to sync my iTunes library. It's too big for any one drive, especially a dinky little 80GB drive. I have separate libraries for music and TV/movies now, but at least they're on one computer and don't have to sync. Actually, I could just use the iPod all day, and keep my actual music library at home. Ultimately, I should put that on some network-visible system, and use <a href="http://www.apple.com/dotmac/backtomymac.html">Back to My Mac</a> to find it.</p>

<p>The larger implication of this gadget is that my world splits into "permanent storage at home" and "portable ubiquitous wireless device". The only remaining problem is the lack of a cell-based Internet connection, so it's only live near a wifi access point. I've tried setting up my Treo as a bluetooth modem, and have always failed utterly. This is the fault of the Treo, Palm, and Sprint. I hope Palm festers and dies, at this point; they're so grossly incompetent they deserve to suffer on the way down. Sprint's network is pretty good, though their customer service is atrocious. If only Apple would let me hook up an iPhone to a MacBook Air as a bluetooth modem...</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 16 Jan 2008 11:47:50 -0800</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>Twitter Collapses in the Face of Apple and Other Natural Disasters</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=172
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=172
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>During the <a href="http://www.macworld.com/article/131486/2008/01/liveupdate.html">MacWorld Expo 2008</a>, Twitter died. Too many people, hammering it with updates, too many people reading it. And in posts to their blog, <a href="http://blog.twitter.com/2008/01/macworld.html">MacWorld</a>
<a href="http://blog.twitter.com/2008/01/why-we-are-focused-on-engineering-and.html">Why We Are Focused on Engineering and Operations</a>, Twitter is pointing at high traffic as the cause.</p>

<p>Except, it's not, it's just something that exposed the inherent weakness in the system. The cause of the failure is that Twitter is written in Ruby on Rails. And it worked fine for a few hundred people and their friends, so they scaled it up to a few million. And it has been an unmitigated disaster, getting slower and slower no matter how hard they whip the servers. They can keep adding hardware, but that only delays the inevitable with the poor design of Rails, and the inherent slowness of Ruby. <a href="http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/">Alex Payne, one of the Twitter developers, gave an interview which explains just how bad the Rails situation is</a>.</p>

<p>This is the Rails trap. Setting it up is so easy! You can roll out a basic site in a day! But when you need to add unusual (for Rails) features that aren't just database-to-web-forms scraping, or when you need more performance on the front-end boxes, or, Why forbid, change the way you interact with the database, <b>then</b> you're in for a world of hurt. And that hurt is an order of magnitude worse than the hurt you'll get by doing it "right" in the first place.</p>

<p>I certainly won't argue that building a big webapp in Java with <a href="http://java.sun.com/products/jsp/">JSP/Servlets</a> or <a href="http://java.sun.com/javaee/javaserverfaces/">JavaServer Faces</a> and maybe <a href="http://hibernate.org/">Hibernate</a> is <b>easy</b>, because it's not. It takes a good week to have a basic site that does something, and that's if you know what you're doing (for an average Java programmer, a month of studying <a href="http://www.coreservlets.com/">Marty Hall's Core Servlets books</a> and building test applications should be enough to get up to speed). But adding more functionality that works to the JSP or JSF site is pretty easy after that, and it'll be tens to hundreds of times faster than an equivalent Rails app, and can support far more users, and won't require you to write entirely new database drivers to handle caching.</p>

<p>For a site that's meant to support just a small group of people with light usage, Rails can be okay, though it'll always frustrate you when you intend to expand it. A software service like Twitter is the archetypical example of something that would be vastly better off if based on a more robust platform.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Tue, 15 Jan 2008 16:11:14 -0800</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>Ruby Riding the Rails as a Filthy Hobo</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=171
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=171
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://www.tbray.org/ongoing/When/200x/2008/01/03/Prediction-Rails">Tim Bray's predictions for 2008 include the rise of Ruby on Rails</a>. I think not.</p>

<p>The best reality check is to search on <a href="http://dice.com/" rel="nofollow">Dice.com</a> (or other job site):</p>

<pre>
java: 15018 jobs
c++: 7363 jobs
c#: 7017 jobs
perl: 5220 jobs
php: 2176 jobs
python: 1233 jobs
ruby: 637 jobs
delphi: 139 jobs
smalltalk: 44 jobs
lisp: 22 jobs
objective-c: 16 jobs
haskell: 2 jobs
</pre>

<p><b>Java is the dominant language for solving problems that are worth paying money to solve.</b> Nobody else is even close. Java is almost as popular as everything else combined.</p>

<p>Ruby on Rails is excruciatingly slow, and requires far more hardware to scale up than other tools. Using a tool that makes it easy to get started but costs more and causes more pain down the line is not good business sense. The disaster that has been Twitter trying to scale up is going to be repeated over and over, until people quit being penny-wise and pound-foolish, and learn to invest a little in more serious technology.</p>

<p>This might take a while, and certainly Ruby's going to get more popular in the next year, but in the long haul I think it's headed down again, sharply. In my experience, managers are extremely tolerant of senior engineers recommending and using whatever language or framework or technology they like--that's the point of being a senior engineer--but by the end of the development cycle, 12-18 months later, they had better have a working product, or they're out of a job.</p>

<p>The Rails hype machine started up nearly 2 years ago. Now we're seeing a lot of the apps built on it reach the market and creak and groan under the weight of even modest usage; they collapse utterly under Slashdot-type loads. This is going to lead to a lot of fired senior engineers who took a chance on the wrong language/framework, and Ruby will quietly sink back down to its natural place around Lisp's popularity.</p>

<hr />
<p>And yes, I write Java and JSP code for a living. Also HTML/CSS/JavaScript, and Python tools. And in my own time I write Objective-C and some Haskell (more for educational purposes than anything practical, as I'm unconvinced Haskell can <b>be</b> practical).</p>

<p>I wrote this blog and site in PHP, and I've written tens of thousands of lines of PHP code (not counting the HTML); I can speak from hard experience now that PHP is shit. It's an awful language, with horrible syntax and semantics that must have been dreamed up by a madman. It's insecure, and the PHP team doesn't care. It is sheer folly to perpetrate new code in PHP, use something better if you value your data and time.</p>

<p>My experience with Ruby is more limited; I've done the tutorials and read <a href="http://poignantguide.net/ruby/">Why's Poignant Guide to Ruby</a> (which at least has good cartoons and chunky bacon, pity about the language), and tried building stuff in it, and got annoyed by its lack of new features and its ugly, <a href="http://en.wikipedia.org/wiki/The_Shadow_Over_Innsmouth">Innsmouth-look</a>, "dear god what abomination did you crossbreed with?!?" syntax compared to beautiful, graceful, simple Python. But I've read the project postmortems like everyone else. Ruby isn't going to fix your problems for you, it just gives you new problems.</p>

<p>While I love Python for quick problem-solving and for writing beautiful code, there's no way I'd ever again use it for an app that would be run by more than a half-dozen people in the world. It's faster than Ruby, but still 10-100x slower than Java. If it was half the speed, that'd be okay, but it's just not there. Even if speed was not an issue, writing big tools in Python sucks. Compilers turn out to be really handy at catching stupid mistakes, and everyone makes stupid mistakes.</p>

<p>There's nothing magical about what dynamic languages do. If you want dynamic web code in Java, make some JSP pages, and use JSTL with the &lt;sql:&gt; tags, or wrap your database code inside JSP beans. This works at least as well as PHP, maybe better, and will have several orders of magnitude better performance than an equivalent site in Ruby, because it's really compiled into pure Java servlets.</p>

<p>[update 2008-01-11: added Perl statistics.]</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 07 Jan 2008 08:00:00 -0800</pubDate>
    </item>
      
    <item>
      <category>Media</category>
      <title>Rob Enderle Drinks Too Much Eggnog</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=170
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=170
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>An open letter to Rob Enderle and IT Business Edge:</p>

<p>I would like to draw your attention to Rob Enderle's latest article:
<br /><a href="http://www.itbusinessedge.com/blogs/rob/?p=179">Falling for the Dan Lyons Apple Hoax: Implications and Portents</a></p>

<p>In it, he discovers that he was reacting to a fake article on the Fake Steve Jobs blog, which had been revealed to be a fake days before his original post; even if he couldn't recognize parody when he read it, if he'd bothered to check back at FSJ before publication, he'd have discovered that he'd been fooled.</p>

<p>But his incompetent pretense of journalism is not the problem here; everyone laughs at Rob Enderle, and treats him like the perpetually-wrong joke that he is, and no harm done. However, his explanation points to a bigger problem, one of true malfeasance:</p>

<blockquote><p>
    I clearly was drinking way too much eggnog to see the joke for what it was.
</p></blockquote>

<p>Now, we could take that as self-deprecating humor, as parody...  Except that we know that Enderle is not capable of parody, not capable of self-awareness, and not capable of writing, especially when drunk. So clearly this must be taken seriously.</p>

<p>You have an alleged analyst filing reports while drunk, while clearly too incapacitated to understand simple parody. This is the behavior of an alcoholic; today he's filing bad tech analysis, tonight he's driving drunk and killing people.</p>

<p>For the good of everyone, I urge you to stop publishing Rob Enderle, and perhaps you can persuade him to enter an alcohol treatment program.</p>

<p>Thank you, and let's all hope for the best outcome for Rob and his long-suffering family.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sun, 30 Dec 2007 00:02:21 -0800</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>Java 6 for Mac OS X Leopard!</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=169
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=169
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Developers can get a developer preview now at the <a href="http://developer.apple.com/">Apple Developer Connection</a>.</p>

<p>Thanks, Apple!</p>

<p>Yes, it's 64-bit Intel only. No, it doesn't run Eclipse (because their SWT library is only 32-bit right now). But you can run Eclipse in Java 5, and use Java 6 for the compiler and app runtime, and it works. I'm sure some of the <a href="http://www.javalobby.org/">whiny Java dorks</a> will be complaining about this anyway. I'm not with them.</p>

<p>[Update] As I predicted, the <a href="http://www.javalobby.org/java/forums/t104771.html">whiny Java dorks</a> are, in fact, complaining, saying things like <i>"What????? Only 64 bit???? You have GOT to be freaking kidding me!!!! My MacBook is a 32 bit Core Duo one. 
The arrogance is just dripping off left and right, I don't know HOW people put up with it. I don't."</i></p>

<p>Really, this is why we can't have nice things in Mac-Java-land. Even when we get them, most of the Java devs bitch and whine like little girls. They bitch and whine for a pony, and when they get it, they're upset that it's not the right color. <b>YOU GOT A PONY, YOU WHINY BITCH! SHUT UP!</b> If I was Apple, I'd have stopped supporting Java entirely, it's just not worth dealing with these whiny little bitches.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 19 Dec 2007 18:08:48 -0800</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>Human Engineering</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=168
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=168
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <blockquote>
<p>Closure is the aspect of communications design that causes the greatest problems. The concept is best explained with an analogy. The user is at point A and wishes to use the program to get to point B. A poorly human-engineered program is like a tightrope stretched between points A and B. The user who knows exactly what to do and performs perfectly will succeed. More likely, he or she will slip and fall. Some programs try to help by providing a manual or internal warnings that tell the user what to do and what not to do. These are analogous to signs along the tightrope advising "BE CAREFUL" and "DON'T FALL." I have seen several programs that place signs underneath the tightrope, so that the user can at least see why he failed as he plummets. A somewhat better class of programs provide masks against illegal entries. These are equivalent to guardrails alongside the tightrope. These are much nicer, but they must be very well constructed to ensure that the user does not thwart them. Some programs have nasty messages that bark at the errant user, warning against making certain entries. These are analogous to scowling monitors in the school halls, and are useful only for making an adult feel like a child. <b>The ideal program is like a tunnel bored through solid rock. There is but one path, the path leading to success. The user has no options but to succeed.</b></p>

<p>The essence of closure is the narrowing of options, the elimination of possibilities, the placement of rock solid walls around the user. Good design is not an accumulative process of piling lots of features onto a basic architecture; good design requires the programmer to strip away minor features, petty options, and general trivia.</p>
<p>-<cite>Chris Crawford, <a href="http://www.atariarchives.org/dere/chaptB.php">De Re Atari: Appendix B: Human Engineering</a>, 1982</cite></p>
</blockquote>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Fri, 07 Dec 2007 09:10:11 -0800</pubDate>
    </item>
      
    <item>
      <category>Toys</category>
      <title>Throw More Kindling on the Fire</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=167
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=167
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>A couple more thoughts on the Kindle.</p>

<ol>
<li value="5">It's not obvious from the demos, but the screen has 4-color grayscale, like the old <a href="http://en.wikipedia.org/wiki/Sony_Reader">Sony Reader PRS-500</a>. That's slightly less terrible, but still grossly inadequate. The new <a href="http://en.wikipedia.org/wiki/Sony_Reader#PRS-505">Sony Reader PRS-505</a> has 8-color grayscale, and is still a little jaggy and dull. It appears to be just as dim a display as the old Sony, and not as bright as the new one, which means it's <a href="http://www.penny-arcade.com/comic/2001/06/13">very dark and hard to read</a> in anything but perfect lighting.

<blockquote><p>
Outside of a dog, a book is man's best friend.
<br />Inside of a dog, it's too dark to read.
<br />-<cite>Groucho Marx</cite>
</p></blockquote>
</li>

</ol>

<p>After seeing a couple more video demos, I'll add to my litany of contempt:</p>

<ol>
<li value="7">The scroll bar controlled by a paddle for choosing menu options is one of the worst user interfaces I have ever seen in my life with technology. We have these things now called "touch screens". On the <a href="http://www.apple.com/iphone/">iPhone</a>/<a href="http://www.apple.com/ipodtouch/">iPod touch</a>, you just <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?playlistId=162252578&s=143441&i=162253040">touch</a> the screen to do something, or flick the screen up or down to shift the page, and it moves like a physical thing. Scroll bars were cool and new on the <a href="http://en.wikipedia.org/wiki/Macintosh_128K">Macintosh 128K</a> in 1984, and paddle controllers haven't been cool since <a href="http://en.wikipedia.org/wiki/Pong">Pong</a>, and the combination just stinks. No, I don't have one of those primitive 20th Century scroll wheels on my mouse; I have a <a href="http://www.apple.com/mightymouse/">Mighty Mouse</a> with a mini-trackball for scrolling, and I now expect all small-screen displays to respond to touch and drag. Wake up and join the 21st Century.</li>

<li value="8">There's no way to select a single word for dictionary lookup or clicking to a URL. You select an entire line with the paddle and it lists everything, slowly.</li>

<li value="9">The next/prev buttons and the keyboard are incredibly sluggish and unresponsive. You can literally watch it stop and think half a second per keypress, or a few seconds for a new page or a popup dialog, before responding. This is a thing that would drive anyone who isn't on heavy sedatives to start using heavy sedatives. Good interfaces must respond <b>instantly</b>, at least within 1/10th of a second, or people become increasingly frustrated and begin to hate your product. Sluggish response produces loathing. I've done user testing and watched this process turn ordinary, happy people into raving maniacs. I expect Amazon will have a lot of returned Kindles that have been thrown into walls.</li>

</ol>

<hr />
<p>It's obvious to anyone who has worked at Amazon (I served an 11-month tour of duty inside the 'Zon) why the Kindle is so awful. The psychology of every company is set and shaped by the psychology of the founders. Jeff Bezos runs things on the cheap; he still acts like he's eating ramen at a struggling startup.</p>

<p>When he started Amazon in an empty warehouse, he couldn't afford real desks, so he bought some door blanks and 2x4s, and made some cheap, nasty desks out of them. To this day, all desks and conference room tables in Amazon are <b>Door Desks</b>, made custom for Amazon to remind you to be frugal and not spend any money on anything that doesn't help the company meet next payroll, to hell with aesthetics or the long-range future.</p>

<p>Similarly, the Amazon infrastructure is lashed together from cheap-ass Linux servers that just fail over and get replaced, rather than buying anything quality, because that wouldn't be "frugal".</p>

<p>Amazon doesn't pay people to do site technical support, they just issue the engineers pagers and make them do it. It's not like you've got work to do, or wanted to sleep or something, right?</p>

<p>You don't even want to know what the software is like inside, but it's the same principle, exacerbated by Amazon's obsessive <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">Not Invented Here</a> culture, which leads to Amazon-created/-modified incompatible versions of every tool.</p>

<p>So naturally, the Kindle is cheap-ass white plastic, with no aesthetic design or usability engineering, just whatever the cheapest possible components were, lashed together by an engineer who hasn't been let out of his ugly, flourescent-lit lab for years. Spending money on artists and designers, or buying slightly better components, would violate the Door Desk Principle.</p>

<hr />
<p><a href="http://www.techcrunch.com/2007/11/21/kindle-web-browsing-experience-is-horrible/">Mike Arrington</a> was right in his <a href="http://scobleizer.com/2007/11/21/kindlecrunched/">video with Scoble</a>: the <a href="http://www.techcrunch.com/wp-content/etchasketchamazon2.jpg">Etch-A-Sketch</a> is a better device. Despite the equally primitive controls and nearly equivalent display, the Etch-A-Sketch is fast and responsive, and just plain works. The Etch-a-Sketch knows what its technological limitations are and still produces a good user experience. The Etch-A-Sketch even has style; it's bright red, because it's for children who are attracted to bright colors, and it has a smooth case and big chunky knobs for awkward young hands. The Kindle is trying to be something that it just can't be with the crippled technology Amazon chose and Amazon's inability to make classy devices.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 22 Nov 2007 04:11:10 -0800</pubDate>
    </item>
      
    <item>
      <category>Toys</category>
      <title>Amazon's Kindling, or, "Burn Before Reading"</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=166
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=166
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>The <a href="http://amazon.com/gp/product/B000FI73MA/">Amazon Kindle</a> is out, and it's about as useful as any previous e-book reader. Which is to say, not at all.</p>

<ol>
<li>The Kindle does not support PDF books. Full stop. Without PDF, the device is useless. Almost all existing non-DRM'd ebooks are sold in PDF format. You can supposedly convert your PDFs into the proprietary Amazon format, but it'll cost you $0.10 per book, for something you already own, and destroy the existing page layout.</li>

<li>It's $400, plus $10 per DRM-crippled Amazon book, plus $2/mo per RSS feed. They don't charge for the network access because they've already extracted your wallet.</li>

<li>It's hideously ugly. It looks like some cheap office supply tool, like a barcode printer, not a $400 piece of electronics that you'd want to curl up with day in and day out for the rest of your life. Since becoming a Mac, iPod, and Nintendo DS owner, I won't own an electronic device that ugly. Aesthetics matter, and this thing has none; it makes the shit-brown and puke-green Zunes look tasteful.</li>

<li>The keyboard is unnecessary, large, and awkwardly placed. The scroller can only be manipulated with the right hand while the left hand holds it. This is unlike a print book, where you can hold a paperback and thumb through it with one hand, ambidextrously. The angled front will dig into your hand and be hard to hold on to. The usability is, shockingly, even worse than the nonexistent aesthetics.</li>

<li>The screen is monochrome. 16-color grayscale would have been enough to have decent font antialiasing, and a 256-color web palette would have been far superior. As it is, it'll be quite unpleasant to read on (the Sony reader has an identical screen, and it was terrible). Compare this to an iPhone, which has similar DPI, but has bright, sharp color and the Mac's perfect font rendering. I'd far rather read on my little iPod Touch, if only it had local file storage.</li>

<li>Luddite print fetishists are addicted to the smell of rotting wood pulp and the feel of leather or hard rotting wood pulp. Sony understood that and put a good cover on their e-book reader, but it's not enough. If you want the fetishists to convert, you'll have to wrap it in a few sheets of paper, or perhaps some artificial scent dispenser. I really don't think they know or care about <b>paper</b> as such, they just fetishize the smell and feel.</li>
</ol>

<p>So why is anyone pushing it? Well, the big-name bloggers and newspapers are pushing it because they expect to get 30% of the $2/mo fee for subscribing to their RSS feeds. <span style='color: green'>PAYOLA</span>. I cannot believe that anyone who isn't getting a kickback from Amazon honestly likes this device.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Wed, 21 Nov 2007 14:35:39 -0800</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>User Interface Design</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=165
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=165
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>It has been noted that I'm... intemperate, let's say... with bad design, and an obsessive fanboy for good design. When people identify too strongly with the systems I say have bad design or no design at all, like Linux, they take it very poorly indeed, and think it's a personal attack. It is rarely personal, and even if you have mal-designed one of these programs I scorn, it's just strong encouragement for you to do better. I don't wish you ill, I just want you to learn from your mistakes. Of course, I have only good will to those who share my madness...</p>

<p>I'm finally starting to see a method in this madness, and to organize my thoughts about it. So, below the break, a few thoughts on user interface design.</p>

<p>There are three ways to write a GUI program. Because they are most commonly associated with specific platforms, I'll call them <b>the Unix Way</b>, <b>the Windows Way</b>, and <b>the Macintosh Way</b>, but any can appear on any platform.</p>
        <p><a href='http://kuoi.com/~kamikaze/read.php?id=165'>more...</a></p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 12 Nov 2007 20:07:15 -0800</pubDate>
    </item>
      
    <item>
      <category>Roleplaying</category>
      <title>"Avast ye! Do ye want to be my friend?", or, "The Lonely Pirate"</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=164
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=164
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I started playing <a href="http://disney.go.com/pirates/online/">Pirates of the Caribbean Online</a> last week, and it's an extremely fun, simple little MMO (for Mac and that other platform) about killin' <a href="http://en.wikipedia.org/wiki/Rum,_Sodomy_and_the_Lash">British Navy</a> guys wit' their fancy red coats an' all, and shootin' undead pirates what ain't even alive no more, and sinkin' ships of the <a href="http://en.wikipedia.org/wiki/Rum,_Sodomy_and_the_Lash">British Navy</a>, the <a href="http://en.wikipedia.org/wiki/East_India_Trading_Company">East India Trading Company</a>, and the undead. It be, in short, a whole rum barrel full of awesome. Arr!</p>

<p>But one behavior of online players weirds me right out. Not the obsession with talkin' like a pirate, that be perfectly normal, landlubber! No, it be when some pirate ye have ne'er fought alongside or spoken to wants ye to join their crew, or be their friend (even if, as in POTCO, it's just as a "Pirate Friend", not a "True Friend"). That's just way too intimate, way too fast. If we fight in the forest together and I see that ye be a true pirate with cannonballs of solid brass, if'n ye know what I mean, I'll offer me dialog box of friendship to ye. But ye're just askin' for some treacherous devil like me to stab ye in the back, steal your coin pouch, and make off wit' yer girl if ye ask a stranger to be yer friend. What be ye thinkin'?</p>

<p>Oh, and last night I learned voodoo powers. I can now make someone be attacked by <a href="http://docs.info.apple.com/article.html?artnum=301920">a swarm of bees</a> just by waving a voodoo doll in their face. Muahahahahaha!</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sun, 11 Nov 2007 19:20:19 -0800</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>Skype Sucks on Leopard</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=163
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=163
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>If you have your firewall active on Leopard, <b><a href='#skype_firewall'>WHICH YOU SHOULD, DO IT NOW</a></b>, Skype will only launch once. Second time, it'll just die.</p>

<p>It turns out that Skype modifies itself, and Leopard's firewall sees that as a virus and won't let it run again. The solution is simple: Run Skype from the DMG every time, and it can't modify itself. You'll have to hit "Allow" on the "launch this scary new app" and "bypass firewall" dialogs, giving you the Vista experience, but at least it works.</p>

<p>Skype's soi-disant "technical support" has a different suggestion. They say you should just turn off your firewall!</p>

<p>The best response to people this <strike>malicious</strike> incompetent would be to quit using Skype, but sadly it's our office IM system. &lt;sigh&gt;</p>

<hr />
<p><a name='#skype_firewall'></a>Menu Apple | System Preferences | Security | Firewall, select "Set access for specific services and applications".</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 05 Nov 2007 08:25:30 -0800</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>iChat Screen Sharing</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=162
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=162
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>In Leopard, select someone you're iChatting with, and hit Buddies | Ask to Share X's Screen.</p>

<p>Once they accept, you are now sharing control of their screen. That's it! Your screen is minimized in the corner, where you can flip back to it, (drag &amp; drop? I didn't try that), whatever.</p>

<p>This is, with no exaggeration, magic.</p>

<p>I've used VNC, Remote Desktop, X11, and so on for years and years. Sharing a screen to fix someone else's computer or see what they're seeing was a total pain in the ass. Until now.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 01 Nov 2007 15:08:10 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>John Siracusa has a few things to say about Leopard...</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=161
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=161
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://arstechnica.com/reviews/os/mac-os-x-10-5.ars/">"If the Finder looks like a starlet headed for rehab, then the Dock is out on a bender in Leopard. We've already seen the aesthetic damage. Now it's time to take stock of the functional vandalism."</a></p>

<p>And a background article he wrote some years ago: <a href="http://arstechnica.com/articles/paedia/finder.ars">the Spatial Finder</a>. I miss the real Finder.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Tue, 30 Oct 2007 13:27:30 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>Mark Has a Leopard</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=160
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=160
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Leopard Day came (I went to the Bellevue Apple store to get an iPod Touch and a free Leopard t-shirt!), and I started my Leopard download from the <a href="http://developer.apple.com/">ADC</a> (yes, Leopard is "free" for developers, but $500/year "free")...  And a mere 12 hours later, I had a DMG... With an invalid checksum. I was heartbroken. Crushed. Thankfully, yesterday I was able to download it at work, got a good copy, and am now running Leopard. Still, that the consumers got Leopard days (for some developers a week+ before the November Dev DVD arrives) before the developers, that's a serious problem. Apple, please address this in the future. Developers pay serious money for ADC and WWDC passes because they need to know the future before the consumers.</p>


<p><b>Installation</b></p>

<p>The "Upgrade" process worked almost flawlessly for me, despite this being a heavily-used development machine. Make a good backup (I know, without Time Machine that's asking a lot...) and try it. If it fails, the worst that can happen is you have to erase and install, but you still have a backup.</p>

<p>All of my apps Just Worked in Leopard. I shouldn't really be surprised by this, but it's a pleasant change from the beta seeds, which were not so great at running every random thing.</p>

<p>In Console.app, I saw a lot of "com.apple.launchd[1] (com.apple.dyld) Throttling respawn: Will start in 60 seconds". See <a href='http://forums.macrumors.com/showthread.php?t=376542'>this MacRumors thread</a> for a solution:
<br /><code>sudo update_prebinding -force -root /</code>
<br />and then reboot.</p>


<p><b>Development Tools</b></p>

<p>Xcode 3.0 initially refused to install. I've had 2.4, at least one beta, and 2.5 on this box, so that's unsurprising. Running
<br /><code>sudo /Developer/Library/uninstall-devtools</code>
<br />to clean that out, and then re-installing Xcode 3.0 worked nicely.</p>

<p>I was able to subscribe to the Apple documentation set this morning and get an update from them, instead of having to download the dmg from developer.apple.com as before, so finally that's working. From now on, Xcode should just update itself on a regular basis; I'll have to check back and see if that's still true in a month, but it looks promising.</p>


<p><b>Command-Line Tools</b></p>

<p>Those who've used Terminal in previous seeds know how great the tabbed Terminals are: no more running 'screen' and having to hit ^A&lt;ESC&gt;^B to scroll back, etc., just use it like a normal tabbed app.</p>

<p>'ls' has been upgraded: it now shows "@" after the permissions if the file has metadata, and you can use
<br /><code>xattr -l FILENAME</code>
<br />to list the metadata and contents. I can't find a proper man page for xattr, but 'xattr -?' gave basic instructions. This is actually kind of a big deal; with these tools, metadata is now easy for developers to find and work with.</p>

<p>'ant', 'mvn', and 'svn' are now installed standard. This will make it quite a lot easier for developers to set up a new machine and get working; a stock, unmodified Leopard has all the tools you actually need. And oh, yeah:</p>
<pre>] python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04) 
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; import turtle
&gt;&gt;&gt; turtle.reset()
&gt;&gt;&gt;
</pre>
<p>A standard, current production version Python! YEE-ha!</p>


<p><b>Java</b></p>

<p>Now, the one dark spot: Java. Java 6 is not on Leopard. I believe, from things said by Apple engineers, that there were some issues that kept it from an initial release, but it'll be out soon. In the mean time, just be happy that Java 5 works. They cleaned up the Swing look &amp; feel quite a bit, they made it 64-bit, seems pretty stable; I've been working in MyEclipse last night and this morning, and had zero problems.</p>

<p>I really wouldn't suggest deploying for Java 6 yet, anyway, but it is inconvenient for developers to not be able to develop against it. Still, this is going to be a short-term problem, and freaking out or saying you're leaving Mac (as James Gosling has, in favor of <b>Solaris</b>, of all the ludicrous choices possible), that's an overreaction. Patience, people.</p>

<p>If you are going to complain, please complain in <a href='https://bugreport.apple.com'>Radar</a>, where Apple will read it and may even give a damn, <b>NOT</b> on the goddamn java-dev@lists.apple.com mailing list, which is for <b>technical</b> issues. <a href='http://lists.apple.com/archives/Java-dev/2007/Oct/msg00448.html'>This post by the infamous Hani Suleiman</a> summed it up nicely.</p>

<p>The Java "community"'s hysterical reaction to only having Java 5 has been so immature, so totally ignorant, that I'm seriously reconsidering my use of Java; I have been for a while, since native Cocoa apps are far superior technology for desktop apps and games, but this is driving another nail in the coffin. I don't want to be associated with these people in any way.</p>

<p>Hey, Whiny Java People: Why didn't you whine when Vista shipped without any JVM at all? (or does it still have J++ 1.1?)</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Tue, 30 Oct 2007 13:12:06 -0700</pubDate>
    </item>
      
    <item>
      <category>Mac</category>
      <title>A Short Conversation While Waiting for the Mothership</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=159
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=159
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <dl>
<dd>Me: 29 hours to go.</dd>
<dt>min: got your tennis shoes so pope steve can pull a heaven's gate?</dt>
<dd>Me: If Pope Steve promised us a spaceship, it wouldn't be some preposterous suicide pact. It'd actually be a real spaceship, with real aliens.
<br />They might require us to submit to anal sex to get on-board, but fuck, it's a real spaceship.</dd>
</dl>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Thu, 25 Oct 2007 13:39:53 -0700</pubDate>
    </item>
      
    <item>
      <category>Cocoa</category>
      <title>Cocoa logging</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=158
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=158
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>I've finally worked out what I think is a reasonably robust logging system for my debugging code, which I can disable when I'm ready for production:</p>

<p>In foo_Prefix.pch:</p>
<pre>
#define DEBUG

#ifdef DEBUG
// DLOG takes a format argument (which must begin %s) and 0 or more args:
// DLOG(@"%s");
// DLOG(@"%s: %d", x);
#define DLOG(fmt, ...) NSLog(fmt, __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#define DLOG(...)
#endif
</pre>

<p>I have to remember to always use <code>DLOG(@"%s foo");</code>, not just <code>NSLog(@"foo")</code>, but it works quite nicely. __PRETTY_FUNCTION__ is awesome: it inserts the current classname and method selector. ##__VA_ARGS__ removes the preceding comma if there are no arguments.</p>

<p>DEBUG is really defined in the Debug build configuration instead of in the header itself.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Sat, 01 Sep 2007 16:06:11 -0700</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>The GNUtards Must Be Crazy</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=157
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=157
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p><a href="http://blogs.streamserve.com/chris/PermaLink,guid,927e3a33-2a59-4348-904f-b27b853ae31e.aspx">Chris Stone wrote a while back</a>:</p>
<blockquote>
<p>The GPL effectively prohibits any sort of commercial use. With version 3 due out soon, it gets even more restrictive because of the Microsoft/Novell patent tax pact. The BSD and MIT licenses do not prohibit commercial use. That means that it is possible for someone to make money off of them, i.e., to eat, buy clothes, buy plasma TV’s.</p>
</blockquote>

<p>This is the enlightened view. The MIT, BSD, and X11 licenses are the only true "open source" licenses. They are clear, unambiguous, and allow you to share your work in the spirit of scientific research. When others improve on your work, they are free to either continue contributing to that body of knowledge, or go make some money from their unique contribution.</p>

<p>I don't feel bad when someone uses my BSD-licensed code to make money, I feel happy. I intended to give it away, so I'm going to honestly give it away, without lying to you and attaching strings to the gift.</p>

<p>The GPL is bigoted hate speech from a bitter dork who was upset that all his Lisp buddies were leaving the AI lab and getting real jobs at Symbolics, so he first tried to destroy them with an inferior copy of their work, and when that failed, he made it his life's work to destroy the commercial software industry. The GPL is solely about jealousy: they aren't making any money, so they hate anyone else who is making money. It's the same mental disorder that makes hippies hate all corporations and businesses, because they're dirt-poor and stupid, so they resent anyone else who isn't.</p>

<p>The GPL is discriminatory. It is biased against anyone who wants to actually produce commercial software and make a living from it. It is difficult, bordering on impossible, to make money from GPL software. Red Hat, Novell, and a handful of others sell service, because Linux is so hard to use and maintain that most people need service to use it. But if they tried to sell licenses without support contracts for Linux, they'd be crushed by Ubuntu giving it away for free. The most successful business model Novell's found has been getting bribed by Microsoft. Neither of these companies make any new software, they just repackage someone else's software, and then try to extort money for it. The GPL has led directly to extortion.</p>

<p>The GPL is a bait-and-switch. It shows you functional code that might very well solve your problem, and then says, "Oh, no, you can't actually use this, because you <u>work for a living</u>."</p> It's difficult to impossible to use open source software in many interesting ways. Readline is a totally useless library for many projects, because the GPL license is poison; if it was LGPL or BSD, it would be ubiquitous. A normal, sane mind would be enthusiastic about that, about seeing their tool be used and make others happy.</p>

<p>And Stallman's not getting more sane with age, either. In a <a href="http://www.groklaw.net/article.php?story=20070403114157109">Groklaw interview</a>, he says:</p>
<blockquote>
<p>"Q: One final question. We're seeing more and more devices, and I'm thinking specifically of games consoles -- I know that my kids have one in the house -- where there is no --"</p>
<p>"Richard Stallman: I wouldn't. You have to learn how to say no to your kids."</p>
<p>"Q: That's true, that's true, I wouldn't deny it. Now, there is no free software at all for devices like this [correction: Yellow Dog supports some console(s)]."</p>
<p>"Richard Stallman: That's why there is no possible ethical way you could use one, and so you shouldn't have it."</p>
</blockquote>

<p>Great. Now he's calling everyone who plays videogame consoles unethical. Is there no end to this blackguard's insults against people who just want to use some fucking software? As Thomas Becket asked, "Will nobody rid us of this turbulent homeless loser?"</p>

<p>But then, let's look at all the great games which were written as GPL...  Oh, wait, there aren't any. If you're a totally obsessive GNUtard (or the pitiable child of such a GNUtard), you can't play any new games, only crappy ripoffs of commercial software. There are no equivalents to Nintendo or Square/Enix in the GNU world. Even id software, who always release Quake and Doom on Linux, don't do it as GPL. (Some developers, including id, do release end-of-life software years later as GPL, just as I do with BSD, but they weren't written and released under GPL initially). And why is that? Because if you release a game as GPL, someone else will give it away for free, and you'll go out of business. There will then be no more new games. At least with commercial software, you can fight the pirates with the law. But if you GPL your game, then the pirates are protected by the law.</p>

<p>Chris's thought that the GPL causes slow-downs in development of open source is exactly right. When have you <b>EVER</b> seen a truly innovative piece of GPL software? Everything in GPL is a bad copy of some other software that was developed under a commercial license or a true open source license like BSD. Worse, GPL software damages and even drives out commercial competitors; it doesn't have to be any good, it just has to consume resources, like rabbits in Australia or pigeons in any city.</p>

<ul>
<li>Linux is a copy of Unix. BSD Unix is years more advanced than Linux, and MacOS X (which is based on BSD Unix) is 10-20 years ahead of Linux.</li>

<li>gcc is just another C compiler, and not a very good one. The <a href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/284132.htm">Intel compilers</a> compile significantly faster and produce faster and more memory-efficient code from the same source. I'm sure Borland's compilers are still faster and more efficient than gcc, too. There used to be many others, but the widespread availability of a shitty but "free" gcc has poisoned the market. There are alternative CPUs for which gcc is the only real compiler, but that's not a positive feature, that's a tragedy.</li>

<li>KDE and GNOME are hideous, difficult, and unstable desktop environments. I'm appalled that these are what pass for a desktop environment on Linux. While I have few kind words to say about Windows, at least their desktop is better than KDE. There's no comparison at all to Mac OS X. GNOME isn't even basically functional... GNOME is one of the worst pieces of software I have ever seen in my life.</li>

<li>The GIMP is... almost decent. It's not innovative in any way, it's still an inferior copy of Photoshop, but at least for once a GNU program isn't a complete piece of shit. I include it in this list because it shows the best possible result for a GPL program: not a complete piece of shit, but still a ripoff.</li>

<li>The FSF is trying to make "Gnash", a replacement for Flash 7, and it's apparently as attractive and functional as the name makes it sound. Adobe already has a free version of its Flash 9 player for Linux. Not that I understand why they bother; they get nothing but hate from the FSF and a lot of the Linux community for providing Flash and Acrobat, even though they give away free client software.</li>

<li>OpenOffice.org is scarily ugly and barely functional. Now, it's interesting that Sun's found a way to use GPL as a weapon against all other office suites, and put out this crappy free version and then charge for the slightly less terrible StarOffice version. But it's ultimately just another MS Office clone. Compare that to, say, Apple's iWork suite (Pages, Keynote); Pages is graceful and attractive and works in a very different way from Word. It's certainly not as complex, and that's a virtue. That's something that would never happen with GPL software.</li>
</ul>

<p>Yes, there is bad closed-source software, too, every Microsoft product being the canonical example...  But normally the market weeds them out, and for every bad closed-source commercial product, I can show you a dozen crappy GPL equivalents.</p>

<p>Because he lives in the Bizarro universe where black is white, up is down, and cats and dogs live together, Stallman doesn't even care about functionality or originality:</p>
<blockquote>
<p>"Write letters to the editor whenever you see a newspaper or magazine praise non-free software, by judging it according to shallow criteria, only caring what job it would do and what's the price and not caring whether it respects your freedom."</p>
</blockquote>

<p>Functionality is not shallow. <b>Functionality is the purpose of software</b>. To get the job done. To do it cost-effectively, efficiently, reliably, in an easy-to-use and attractive manner.</p>

<p>Whether or not you can modify a piece of software is meaningful only to a handful of programmers. It makes no difference at all to the users. To a working programmer, GPL software is useless, because you can't include it in your software at work. So the only ones who find GPL software's "freedom to modify" useful are bored college students and useless hippies.</p>

<p>Ultimately, the GPL is about restricting the rights of programmers to do as they wish with the software they write. Someone who loves liberty would allow and encourage every programmer to release their software under terms that they find acceptable for their own needs. For some people, that'll be commercial; for some, BSD. But if he had the political power, Stallman would put a gun to the head of every programmer and force them to use the GPL, and would put a gun to the head of every user and force them to only use GPL software. His motivation is to steal your software and make it part of the FSF, so that all new software development ends, all commercial software goes out of business, and finally the demon of jealousy screeching in his head can stop.</p>

<p>Stop giving a crazy person power over you. Don't use the GPL.</p>
        </div>
      ]]></description>
      <author>kamikaze@kuoi.asui.uidaho.edu</author>
      <pubDate>Mon, 06 Aug 2007 02:06:29 -0700</pubDate>
    </item>
      
    <item>
      <category>Software</category>
      <title>The NetBeans Masochism Tango</title>
      <link>http://kuoi.com/~kamikaze/read.php?id=156
</link>
      <guid>http://kuoi.com/~kamikaze/read.php?id=156
</guid>
      <description><![CDATA[
        <div bgcolor=''>
        <p>Okay, I've given up on IDEA. It's crazy piled on crazy, with just enough things working to make me not instantly reject it, but then it hurts me at every opportunity. Using Ant was such a chore, and reading my Ant output was so bad, it really wasn't viable.</p>

<p>It looks like I'm stuck with a not-very-nice Eclipse Europa. Maybe they'll fix the code completion focus bug someday.</p>

<p>As a last, masochistic exercise, I tried NetBeans. I hate <a href="http://kuoi.com/~kamikaze/read.php?topic=Software&id=120">Sun's constant lies and bullshit about NetBeans</a>, and every time I've tried to use it or seen it used it was like like a boot kicking in my face, FOREVER, but I'm a desperate man, and my ideals can be bought with shiny software that works.</p>

<p>To forestall the usual "that's fixed in the nightlies, what, are you living in the dark ages?" responses Sun's shills give me when I bitch about stuff in NetBeans, I got NetBeans 6.0M10, the latest, best, most polished and awesometasticular version, so it should rock the house, yeah?</p>

<p>25MB for just Java SE, 103MB for J2EE with Glassfish and Tomcat. Okay, fine, I've got a healthy respect for Glassfish as a Sun product that doesn't suck, and I am all about the J2EE. The installer is... well, it's an installer. It works okay. I still like Eclipse's non-installer installation best, but it beats the shit out of JBuilder 2007.</p>

<p>As you might expect, the Swing GUI is uglier than 10 miles of ugly on a hot summer day. The file dialog is the Swing JFileDialog, which looks like Windows on every platform. Option checkbox trees show a full checkmark even if only some of the sub-elements are checked, instead of a highlighted dash as they should until every option is chosen; you have to expand the tree to see if it's really a full or partial selection. The editor pane tabs are glossy Aqua-like buttons instead of actual tabs and have a totally non-standard teeny little close x instead of <strike>brushed metal</strike> dark grey like Mac has used for some time; see Safari for how document-view tabs should look on a Mac. Aqua tabs are for control panels <b>ONLY</b>. As always, I come to the conclusion that nobody at Sun has the slightest trace of visual style, any comprehension of usability, or any comprehension of making a platform-specific GUI appearance. I can't tell if they're all blind, or perhaps if they only develop in BSD vi from the command line, and have never seen a GUI in their lives. There is no escape. There's no <a href="http://www.randelshofer.ch/quaqua/download.html">Quaqua</a> GUI because this is a Sun app, and changing the Swing L&amp;F won't help me any because all the others are even more hideous and just as unusable.</p>

<p>Also as usual, the key bindings are an unspeakable horror. Their idea of "Eclipse"-like keys is laughably wrong (binding Ctrl instead of the platform menu modifier, which is available and defined in the java.awt.Toolkit!), and things like Cmd-Y for Redo (instead of Shift-Cmd-Z)...  Does anyone really use such stupid keys? Have they even <b>heard</b> of the Apple Human Interface Guidelines? If you're going to make an app that works on the Mac, make it work <b>right</b> on the Mac or don't bother.</p>

<p>Yeah