<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/'>
<channel>
  <title>Chris Hanson</title>
  <link>http://chanson.livejournal.com/</link>
  <description>Chris Hanson - LiveJournal.com</description>
  <managingEditor>cmh@mac.com</managingEditor>
  <lastBuildDate>Thu, 28 May 2009 03:22:15 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>chanson</lj:journal>
  <lj:journalid>451423</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>http://l-userpic.livejournal.com/38237788/451423</url>
    <title>Chris Hanson</title>
    <link>http://chanson.livejournal.com/</link>
    <width>64</width>
    <height>64</height>
  </image>

<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/188113.html</guid>
  <pubDate>Thu, 28 May 2009 03:22:15 GMT</pubDate>
  <title>New weblog!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/188113.html</link>
  <description>I&apos;ve finally moved my weblog to my own domain!  You can find it at &lt;a href=&quot;http://eschatologist.net/blog/&quot;&gt;http://eschatologist.net/blog/&lt;/a&gt; now and probably forever.&lt;br /&gt;&lt;br /&gt;I mostly wanted to wait until both WordPress and MarsEdit supported tags well, rather than just categories, and I wanted to wait until I could figure out how to migrate things easily.  The latter I never really did; any migration I do is by hand, copying out of Xjournal and pasting into MarsEdit.&lt;br /&gt;&lt;br /&gt;I&apos;ve migrated many of my posts to the new weblog so far.  I&apos;ll migrate more over time, and I&apos;ll fix up the internal links over time too.  In the meantime, it&apos;s nice to be able to use &lt;a href=&quot;http://www.red-sweater.com/marsedit/&quot;&gt;MarsEdit&lt;/a&gt; to manage my posts, and to edit them as &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So update your subscriptions and be sure to stop by!</description>
  <comments>http://chanson.livejournal.com/188113.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/187873.html</guid>
  <pubDate>Thu, 09 Oct 2008 06:25:04 GMT</pubDate>
  <title>DDJ vs. Backyard Poultry</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/187873.html</link>
  <description>&lt;a href=&quot;http://www.ericsink.com/&quot;&gt;Eric Sink&lt;/a&gt; has a post talking about the &lt;a href=&quot;http://www.ericsink.com/entries/poultry_magazines.html&quot;&gt;sad state of developer publishing&lt;/a&gt;, specifically discussing the declining readership of the venerable developer magazine &lt;cite&gt;&lt;a href=&quot;http://www.ddj.com/&quot;&gt;Dr. Dobb&apos;s Journal&lt;/a&gt;&lt;/cite&gt;, as compared to that mainstay of American newsstands &lt;cite&gt;&lt;a href=&quot;http://www.backyardpoultrymag.com/&quot;&gt;Backyard Poultry&lt;/a&gt;&lt;/cite&gt;.&lt;br /&gt;&lt;br /&gt;After reading the article and the replies, I just had to throw in my two cents about magazine publishing and why &quot;1% of the US population are software developers, so there should be a huge market for development magazines.&quot;&lt;br /&gt;&lt;br /&gt;It&apos;s a significant mistake to think that &lt;strong&gt;the reader&lt;/strong&gt; is the target and that &lt;strong&gt;the magazine&lt;/strong&gt; is the product.&lt;br /&gt;&lt;br /&gt;It is actually &lt;strong&gt;the aggregate readership&lt;/strong&gt; that is the product, and &lt;strong&gt;the advertisers&lt;/strong&gt; who are the target.  That is, unless the magazine takes no advertising and is entirely supported by its subscribers.&lt;br /&gt;&lt;br /&gt;This was driven home to me recently when I bought the recent &quot;eInk Flashing Cover&quot; issue of &lt;cite&gt;Esquire&lt;/cite&gt;.  I had never read &lt;cite&gt;Esquire&lt;/cite&gt; before, so in addition to checking out the cool hardware on the cover, I started trying to read it.  It was way more full of ads than &lt;cite&gt;Wired&lt;/cite&gt; ever was — even in the days when &lt;a href=&quot;http://www.suck.com/daily/95/10/06/daily.html&quot;&gt;Suck famously disassembled &lt;cite&gt;Wired&lt;/cite&gt; 3.09 to remove the ads&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Furthermore, its advertisers were all very high-end.  Thus I wasn&apos;t that surprised when I saw that the price on the subscription card for a year of &lt;cite&gt;Esquire&lt;/cite&gt; was well under $1/issue.&lt;br /&gt;&lt;br /&gt;So if &lt;cite&gt;Dr. Dobb&apos;s Journal&lt;/cite&gt; is circling the drain, it&apos;s not the current readership that&apos;s to be blamed, or the Internet.  It&apos;s the lack of advertisers interested in reaching that readership, or the magazine&apos;s ability to reach a readership that is interesting to a better-paying tier of advertisers.</description>
  <comments>http://chanson.livejournal.com/187873.html</comments>
  <category>magazines</category>
  <category>publishing</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/187540.html</guid>
  <pubDate>Sat, 27 Sep 2008 23:53:35 GMT</pubDate>
  <title>Let&apos;s merge managed object models!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/187540.html</link>
  <description>There was a question recently on &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;Stack Overflow&lt;/a&gt; asking &lt;a href=&quot;http://stackoverflow.com/questions/130316/cross-model-relationships-in-nsmanagedobjectmodel-from-merged-models&quot;&gt;how to handle cross-model relationships in managed object models&lt;/a&gt;.  Now, the poster wasn&apos;t asking about how to handle relationships across &lt;em&gt;persistent stores&lt;/em&gt; — he was asking how to handle splitting a model up into pieces such that the pieces could be recombined.&lt;br /&gt;&lt;br /&gt;It turns out that this is somewhat straightforward to do using Core Data.  Let&apos;s say you have a simple model with Song and Artist entities.  I&apos;ll write it out here in a pseudo-modeling language for ease of reading:  &lt;code&gt;&lt;pre&gt;MusicModel = {
    Song = {
        attribute title : string;
        attribute duration : float;
        to-one-relationship artist : Artist,
            inverse : songs,
            delete-rule : nullify;
        userInfo = { };
    };

    Artist = {
        attribute name : string;
        to-many-relationship songs : Song,
            inverse : artist,
            delete-rule : cascade;
        userInfo = { };
    };
};&lt;/pre&gt;&lt;/code&gt;  Now let&apos;s say you want to split this up into two models, where Song is in one and Artist is in the other.  You could just try and create two &lt;code&gt;xcdatamodel&lt;/code&gt; files in Xcode, one with each entity, and wire the relationships together after loading them and merging them with &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectModel_Class/Reference/Reference.html#//apple_ref/occ/clm/NSManagedObjectModel/modelByMergingModels:&quot;&gt;+[NSManagedObjectModel modelByMergingModels:]&lt;/a&gt;&lt;/code&gt;.  Except that won&apos;t work:  Relationships with no destination entity won&apos;t be compiled by the model compiler.&lt;br /&gt;&lt;br /&gt;What else might you try?  You could try just putting dummy entities in for relationships to point to.  However, merging models will fail then, because &lt;a href=&quot;http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectModel_Class/Reference/Reference.html&quot;&gt;NSManagedObjetModel&lt;/a&gt; won&apos;t merge models that have entity name collisions.&lt;br /&gt;&lt;br /&gt;It turns out, though, that you can merge models very easily by hand, by taking advantage of the way Core Data&apos;s model-description objects handle the &lt;code&gt;NSCopying&lt;/code&gt; protocol.  All you have to do is create your destination model, loop through every entity in each of your source  models, and copy every entity that you &lt;em&gt;haven&apos;t&lt;/em&gt; tagged as a stand-in using a special key in their &lt;code&gt;userInfo&lt;/code&gt; dictionary.&lt;br /&gt;&lt;br /&gt;Why does this work?  The trick is that before you tell a persistent store coordinator to &lt;em&gt;use&lt;/em&gt; a model, that model is mutable and references relationship destination entities and inverse relationships by &lt;em&gt;name&lt;/em&gt;.  So you can have only a minimal representation of Artist in one model, and a minimal representation of Song in another model:  &lt;code&gt;&lt;pre&gt;SongModel = {
    Song = {
        attribute title : string;
        attribute duration : float;
        to-one-relationship artist : Artist,
            inverse : songs,
            delete-rule : nullify;
        userInfo = { };
    };

    Artist = {
        /* Note no attributes. */
        to-many-relationship songs : Song,
            inverse : artist,
            delete-rule : cascade;
        userInfo = { IsPlaceholder = YES; };
    };
};

ArtistModel = {
    Song = {
        /* Note no attributes. */
        to-one-relationship artist : Artist,
            inverse : songs,
            delete-rule : nullify;
        userInfo = { IsPlaceholder = YES; };
    };

    Artist = {
        attribute name : string;
        to-many-relationship songs : Song,
            inverse : artist,
            delete-rule : cascade;
        userInfo = { };
    };
};&lt;/pre&gt;&lt;/code&gt;  Then, when you write some code to combine them, the merged model will wind up with the full definition of Song and the full definition of Artist.  Here&apos;s an example of the code you might write to do this:  &lt;code&gt;&lt;pre&gt;- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models {
    NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease];

    // General strategy:  For each model, copy its non-placeholder entities
    // and add them to the merged model. Placeholder entities are identified
    // by a MyRealEntity key in their userInfo (which names their real entity,
    // though their mere existence is sufficient for the merging).

    NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0];

    for (NSManagedObjectModel *model in models) {
        for (NSEntityDescription *entity in [model entities]) {
            if ([[[entity userInfo] objectForKey:@&quot;IsPlaceholder&quot;] boolValue]) {
                // Ignore placeholder.
            } else {
                NSEntityDescription *newEntity = [entity copy];
                [mergedModelEntities addObject:newEntity];
                [newEntity release];
            }
        }
    }

    [mergedModel setEntities:mergedModelEntities];

    return mergedModel;
}&lt;/pre&gt;&lt;/code&gt;  This may seem like a bit of overhead for this simple example.  The critical thing to see above is that &lt;em&gt;only that which is necessary for model consistency is in the placeholder entities&lt;/em&gt;.  Thus you only need the inverse relationship from Song to Artist in ArtistModel.  Say you wanted to add a Picture entity related to the Artist entity — you don&apos;t have to add that to both models, only to ArtistModel.  The benefit of this method for merging models should then be pretty apparent:  It gives you the ability to make your model separable, just like your code.</description>
  <comments>http://chanson.livejournal.com/187540.html</comments>
  <category>core data</category>
  <category>xcode</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/187267.html</guid>
  <pubDate>Mon, 25 Aug 2008 02:36:58 GMT</pubDate>
  <title>Erlang on LLVM?  or: Outsource your JIT!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/187267.html</link>
  <description>Has anyone been working on using &lt;a href=&quot;http://llvm.org/&quot;&gt;LLVM&lt;/a&gt; to do just-in-time code generation for the &lt;a href=&quot;http://erlang.org/&quot;&gt;Erlang&lt;/a&gt; virtual machine?&lt;br /&gt;&lt;br /&gt;Depending on the design and structure of the Erlang virtual machine, it doesn&apos;t seem like it would be all that tough a project.  And it could provide a nice performance boost for those projects that are starting to use Erlang like &lt;a href=&quot;http://couchdb.org/&quot;&gt;CouchDB&lt;/a&gt; and &lt;a href=&quot;http://www.ejabberd.im/&quot;&gt;ejabberd&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For an example of what I&apos;m talking about, there&apos;s a project called &lt;a href=&quot;http://vmkit.llvm.org/&quot;&gt;VMKit&lt;/a&gt; that has implemented the Java and .NET virtual machines atop LLVM with reasonable performance.  Essentially, if you have a virtual machine, rather than skipping either just-in-time or static code generation entirely, or trying to do it all yourself for some specific platform on which you want to run, take a look at what you can do with LLVM and see if you can leverage its code generation instead.</description>
  <comments>http://chanson.livejournal.com/187267.html</comments>
  <category>jabber</category>
  <category>.net</category>
  <category>ejabberd</category>
  <category>erlang</category>
  <category>couchdb</category>
  <category>java</category>
  <category>llvm</category>
  <category>compilers</category>
  <category>performance</category>
  <category>xmpp</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/186984.html</guid>
  <pubDate>Tue, 29 Jul 2008 09:21:56 GMT</pubDate>
  <title>Not it!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/186984.html</link>
  <description>I didn&apos;t write &lt;em&gt;&lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=286047207&amp;amp;mt=8&quot;&gt;Carrie&apos;s Dots&lt;/a&gt;&lt;/em&gt; — but I did download it!&lt;br /&gt;&lt;br /&gt;It was written by &lt;a href=&quot;http://dr-chris.org/&quot;&gt;&lt;strong&gt;Dr.&lt;/strong&gt; Chris Hanson&lt;/a&gt;, a Chris Hanson who&apos;s evidently still in the mid-South.  Maybe the next time I get a chance to visit &lt;span class=&apos;ljuser  ljuser-name_realgreendragon&apos; lj:user=&apos;realgreendragon&apos; style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://realgreendragon.livejournal.com/profile&apos;&gt;&lt;img src=&apos;http://l-stat.livejournal.com/img/userinfo.gif&apos; alt=&apos;[info]&apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://realgreendragon.livejournal.com/&apos;&gt;&lt;b&gt;realgreendragon&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; in Mississippi, we&apos;ll get to meet up!</description>
  <comments>http://chanson.livejournal.com/186984.html</comments>
  <category>programming</category>
  <category>iphone</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/186875.html</guid>
  <pubDate>Fri, 18 Jul 2008 16:52:52 GMT</pubDate>
  <title>LLVM terminology</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/186875.html</link>
  <description>I thought the proper terminology was worth pointing out, since I&apos;ve seen — and heard — some misuses lately.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://llvm.org/&quot;&gt;LLVM&lt;/a&gt;&lt;/strong&gt; is the Low-Level Virtual Machine and the project surrounding it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://llvm.org/docs/CommandGuide/html/llvmgcc.html&quot;&gt;LLVM-GCC&lt;/a&gt;&lt;/strong&gt; is a compiler that uses GCC for its front-end and LLVM for its back-end.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://clang.llvm.org/&quot;&gt;Clang&lt;/a&gt;&lt;/strong&gt; is the C language family front-end that is part of the LLVM project.  It&apos;s a parser, semantic analyzer, and code generator — in other words, a compiler front-end that uses LLVM for its back-end.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://clang.llvm.org/StaticAnalysis.html&quot;&gt;The Clang Static Analyzer&lt;/a&gt;&lt;/strong&gt; is what people have been trying out lately, to find subtle bugs in their and other projects.  It&apos;s a great tool.&lt;br /&gt;&lt;br /&gt;I just thought this was important to mention, because people have been referring to &quot;LLVM&quot; instead of &quot;LLVM-GCC&quot; in reference to the compiler included in Xcode 3.1, and people have been referring to &quot;Clang&quot; instead of &quot;the Clang Static Analyzer&quot; in reference to what they&apos;ve been using to find bugs in their projects.</description>
  <comments>http://chanson.livejournal.com/186875.html</comments>
  <category>llvm</category>
  <category>xcode</category>
  <category>compilers</category>
  <category>performance</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/186564.html</guid>
  <pubDate>Sun, 06 Jul 2008 04:52:15 GMT</pubDate>
  <title>New bike!  Marin Belvedere 2007</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/186564.html</link>
  <description>I just got my first bike since junior high, and rode a bike today for the first time since high school!  Many thanks to &lt;a href=&quot;http://jighexadecimal.com/&quot;&gt;Meg&lt;/a&gt; for helping me pick it out and to &lt;a href=&quot;http://razorwind.org/&quot;&gt;Dan&lt;/a&gt; and others for listening to me ramble about what I might or might not want.&lt;br /&gt;&lt;br /&gt;What I wound up getting was a &lt;a href=&quot;http://www.marinbikes.com/bicycles_2007/html/bikes/bike_specs/specs_belvedere.html&quot;&gt;2007 Belvedere&lt;/a&gt; from &lt;a href=&quot;http://www.marinbikes.com/&quot;&gt;Marin Bikes&lt;/a&gt;, in matte coal (of course).  I test-rode it and it felt great, I could even shift — something I could never do in junior high or high school without losing control, damn post-shifters — and the only limit I felt with it was me!&lt;br /&gt;&lt;br /&gt;So after accessorizing a bit, Meg and I rode home and then walked back to pick up the car.  Cupertino and the South Bay in general are so bike-friendly I can tell I&apos;m going to put a &lt;em&gt;lot&lt;/em&gt; of miles on it just this summer, and if I get a good set of panniers there&apos;s no reason I won&apos;t be able to keep doing so into the fall and even winter.&lt;br /&gt;&lt;br /&gt;And as tired as I am just from riding a couple miles today, it feels a hell of a lot better than contributing to the climate crisis while paying nearly $5/gallon for gasoline.</description>
  <comments>http://chanson.livejournal.com/186564.html</comments>
  <category>bicycle</category>
  <category>conservation</category>
  <category>climate crisis</category>
  <category>ecology</category>
  <category>transportation</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/186135.html</guid>
  <pubDate>Sat, 28 Jun 2008 22:58:16 GMT</pubDate>
  <title>Always use notification name globals, not literal strings!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/186135.html</link>
  <description>What&apos;s wrong with this code?  &lt;code&gt;&lt;pre&gt;- (void)registerForNotificationsFromTask:(NSTask *)task ( {
    [[NSNotificationCenter defaultCenter]
        addObserver:self
           selector:@selector(taskDidTerminateNotification:)
               name:@&quot;NSTaskDidTerminateNotification&quot;
             object:task];
}&lt;/pre&gt;&lt;/code&gt;  If you didn&apos;t notice anything wrong, look again.&lt;br /&gt;&lt;br /&gt;What&apos;s bad about this is that it&apos;s passing a &lt;strong&gt;string literal&lt;/strong&gt; instead of a &lt;strong&gt;global variable&lt;/strong&gt; for the notification name.  The code should really look like this:  &lt;code&gt;&lt;pre&gt;- (void)registerForNotificationsFromTask:(NSTask *)task ( {
    [[NSNotificationCenter defaultCenter]
        addObserver:self
           selector:@selector(taskDidTerminateNotification:)
               name:NSTaskDidTerminateNotification
             object:task];
}&lt;/pre&gt;&lt;/code&gt;  Isn&apos;t that better?  (Among other things, Xcode will offer to complete the &lt;code&gt;NSTaskDidTerminateNotification&lt;/code&gt; global variable for you — unlike the contents of a string literal.)&lt;br /&gt;&lt;br /&gt;This is a bug that often results from copying &amp;amp; pasting from documentation into code.  &quot;I need this notification, it needs to be a string, so I&apos;ll just put &lt;code&gt;@&quot;&quot;&lt;/code&gt; around it.&quot;  The &lt;em&gt;type&lt;/em&gt; of a notification name is, in fact, &lt;code&gt;NSString&lt;/code&gt; but you don&apos;t have to pass a &lt;em&gt;string literal&lt;/em&gt; for that.  Instead, pass the global variable that exists for each notification name and you&apos;re guaranteed that the right thing will happen.&lt;br /&gt;&lt;br /&gt;If you&apos;re creating and using your own notifications, be sure to follow the Cocoa pattern and create your own global variables containing the notification name.  Otherwise you&apos;re at the mercy of typos within string literals.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; Sanjay Samani helpfully pointed out that by &lt;em&gt;constant string&lt;/em&gt; I meant &lt;em&gt;string literal&lt;/em&gt;.  Thanks, Sanjay!  I&apos;ve updated my post with this correction.  (Not sure where my memory was…)</description>
  <comments>http://chanson.livejournal.com/186135.html</comments>
  <category>objective-c</category>
  <category>xcode</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/185985.html</guid>
  <pubDate>Wed, 11 Jun 2008 04:22:26 GMT</pubDate>
  <title>I fucking hate this city</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/185985.html</link>
  <description>Meg rode her bike down from the hotel to Union Square to meet me for dinner, locking it up at a bike station right outside Borders.&lt;br /&gt;&lt;br /&gt;After we walked back from dinner, we discovered it had been stolen.  Right in the middle of dinner, right on the corner of fucking Union Square.&lt;br /&gt;&lt;br /&gt;I fucking hate San Francisco.  What a shit-hole of a city.</description>
  <comments>http://chanson.livejournal.com/185985.html</comments>
  <category>theft</category>
  <category>san francisco</category>
  <category>hate</category>
  <lj:security>public</lj:security>
  <lj:reply-count>24</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/185676.html</guid>
  <pubDate>Mon, 09 Jun 2008 07:56:44 GMT</pubDate>
  <title>WWDC 2008</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/185676.html</link>
  <description>The time is upon us once again — &lt;a href=&quot;http://developer.apple.com/wwdc/&quot;&gt;WWDC&lt;/a&gt; time!&lt;br /&gt;&lt;br /&gt;As I have the past few years, I&apos;ll be in San Francisco all week, staying at the &lt;a href=&quot;http://www.jdvhotels.com/kabuki/&quot;&gt;Hotel Kabuki&lt;/a&gt; in &lt;a href=&quot;http://www.sfjapantown.org/&quot;&gt;Japantown&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And of course, I&apos;ll be around the conference all week — especially in the labs.  Come by and say hi, and I&apos;ll be happy to help with any questions you have!</description>
  <comments>http://chanson.livejournal.com/185676.html</comments>
  <category>apple</category>
  <category>iphone</category>
  <category>conferences</category>
  <category>mac os x</category>
  <category>xcode</category>
  <category>conventions</category>
  <category>wwdc</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/185561.html</guid>
  <pubDate>Wed, 04 Jun 2008 01:23:06 GMT</pubDate>
  <title>No NSCoder night for me tonight!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/185561.html</link>
  <description>I&apos;d like to make it to &lt;a href=&quot;http://nscodernight.com/&quot;&gt;NSCoder Night&lt;/a&gt; tonight, but I just have too much else to do today — again.&lt;br /&gt;&lt;br /&gt;I won&apos;t be seeing anyone at NSCoder Night next week, either, as I&apos;ll be in San Francisco for the &lt;a href=&quot;http://developer.apple.com/wwdc/&quot;&gt;Apple Worldwide Developers Conference&lt;/a&gt;!  If you&apos;re attending, be sure to find me and say hi!</description>
  <comments>http://chanson.livejournal.com/185561.html</comments>
  <category>irc</category>
  <category>cocoa</category>
  <category>get-togethers</category>
  <category>objective-c</category>
  <category>nscoder night</category>
  <category>programming</category>
  <category>cocoaheads</category>
  <category>mac os x</category>
  <category>conferences</category>
  <category>wwdc</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/185228.html</guid>
  <pubDate>Wed, 28 May 2008 00:15:25 GMT</pubDate>
  <title>No NSCoder night for me tonight!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/185228.html</link>
  <description>I&apos;d like to make it to &lt;a href=&quot;http://nscodernight.com/&quot;&gt;NSCoder Night&lt;/a&gt; tonight, but I just have too much else to do today.  Hopefully I&apos;ll see everyone there next week!</description>
  <comments>http://chanson.livejournal.com/185228.html</comments>
  <category>objective-c</category>
  <category>irc</category>
  <category>nscoder night</category>
  <category>programming</category>
  <category>cocoaheads</category>
  <category>mac os x</category>
  <category>cocoa</category>
  <category>get-togethers</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/185072.html</guid>
  <pubDate>Fri, 16 May 2008 01:45:17 GMT</pubDate>
  <title>CocoaHeads Silicon Valley at Apple on Thursday, May 15, 2008</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/185072.html</link>
  <description>The next &lt;a href=&quot;http://www.cocoaheads.org/us/SiliconValleyCalifornia/index.html&quot;&gt;CocoaHeads Silicon Valley&lt;/a&gt; meeting will be on Thursday, May 15, 2008 — &lt;strong&gt;that&apos;s tonight!&lt;/strong&gt; — at 7:30 in the &lt;strong&gt;Garage 1&lt;/strong&gt; meeting room at Infinite Loop 4 on Apple&apos;s main campus. That&apos;s inside and upstairs at Apple&apos;s Infinite Loop campus in Cupertino.  See the &lt;a href=&quot;http://www.cocoaheads.org/us/SiliconValleyCalifornia/index.html&quot;&gt;web site&lt;/a&gt; for directions.&lt;br /&gt;&lt;br /&gt;This month&apos;s main presentation is on the &lt;a href=&quot;http://theocacao.com/document.page/572&quot;&gt;Best of Both Worlds&lt;/a&gt; — an introduction to Cocoa development by Scott Stevenson.  &lt;blockquote&gt;This talk is a combination of an introduction to Cocoa, as well as a series of advanced tips and tricks that even relatively experienced Mac programmers may not know about.&lt;br /&gt;&lt;br /&gt;The idea here is that we want to give all of the people who are new to Mac and iPhone development a chance to get started, but we also want to do something special for our advanced programmers. So rather than choosing one, we&apos;re just going to go ahead and do both.&lt;/blockquote&gt;  Joel Norvell will also be presenting on how to edit PDF forms using Cocoa — he&apos;s done a lot of work with PDFKit and Cocoa, and I&apos;m looking forward to learning from him.&lt;br /&gt;&lt;br /&gt;Thanks a ton to &lt;a href=&quot;http://theocacao.com/&quot;&gt;Scott Stevenson&lt;/a&gt;, Steve Zyszkiewicz, Michael Jurewitz and &lt;a href=&quot;http://joar.com/&quot;&gt;Joar Wingfors&lt;/a&gt; for organizing!&lt;br /&gt;&lt;br /&gt;In general, at a &lt;a href=&quot;http://www.cocoaheads.org/&quot;&gt;CocoaHeads&lt;/a&gt; meeting we do some introductions, have a presentation including Q&amp;amp;A time with the presenter, and then have an open Q&amp;amp;A and demo-your-cool-app period.  After the meeting there&apos;s more independent mingling and discussion until it&apos;s time to go at 9:30.  Often a subset of the meeting moves to &lt;a href=&quot;http://bjsbrewhouse.com/restaurants_page/cupertino.html&quot;&gt;BJ&apos;s Brewhouse in Cupertino&lt;/a&gt;, which is right in front of the Apple Infinite Loop campus on De Anza Boulevard.</description>
  <comments>http://chanson.livejournal.com/185072.html</comments>
  <category>events</category>
  <category>cocoa</category>
  <category>objective-c</category>
  <category>pdf</category>
  <category>leopard</category>
  <category>programming</category>
  <category>cocoaheads</category>
  <category>mac os x</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/184816.html</guid>
  <pubDate>Sat, 03 May 2008 05:23:35 GMT</pubDate>
  <title>Why is Twitter not just Jabber?</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/184816.html</link>
  <description>Twitter is a way to post a short message to a wide group of subscribers, and to receive messages posted by a wide group of subscribers.&lt;br /&gt;&lt;br /&gt;That&apos;s instant messaging.  There&apos;s already a standard protocol for it:  &lt;a href=&quot;http://www.jabber.org/&quot;&gt;Jabber&lt;/a&gt; (&lt;a href=&quot;http://www.xmpp.org/&quot;&gt;XMPP&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Why not just use it?  &lt;strong&gt;Why invent a new protocol?!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Actually, Twitter already &lt;em&gt;does&lt;/em&gt; have &lt;a href=&quot;http://groups.google.com/group/twitter-development-talk/web/jabber-pubsub&quot;&gt;experimental XMPP access to the full timeline&lt;/a&gt; — rather than to individual timelines, or to your friends&apos; timelines — and you can use it to build things like TweetMaps and TweetClouds and Quotably and…&lt;br /&gt;&lt;br /&gt;But Twitter should really be built &lt;em&gt;entirely&lt;/em&gt; around XMPP.  It shouldn&apos;t be a web app at all, though it could certainly have a web front-end.  In case you doubt me, &lt;a href=&quot;http://www.process-one.net/en/blogs/article/introducing_the_xmpp_application_server/&quot;&gt;here&apos;s an example Twitter-like service&lt;/a&gt; implemented by &lt;a href=&quot;http://www.process-one.net/en/&quot;&gt;Process One&lt;/a&gt; atop the &lt;a href=&quot;http://www.ejabberd.im/&quot;&gt;&lt;code&gt;ejabberd&lt;/code&gt;&lt;/a&gt; XMPP application server.</description>
  <comments>http://chanson.livejournal.com/184816.html</comments>
  <category>jabber</category>
  <category>ejabberd</category>
  <category>instant messaging</category>
  <category>internet</category>
  <category>standards</category>
  <category>twitter</category>
  <category>xmpp</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/184550.html</guid>
  <pubDate>Wed, 30 Apr 2008 00:25:47 GMT</pubDate>
  <title>No NSCoder Night for me tonight!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/184550.html</link>
  <description>I&apos;d like to make it to &lt;a href=&quot;http://nscodernight.com/&quot;&gt;NSCoder Night&lt;/a&gt; tonight, but I won&apos;t be able to as I&apos;ll be looking at a new place.  Wish me luck, and have fun everybody!</description>
  <comments>http://chanson.livejournal.com/184550.html</comments>
  <category>objective-c</category>
  <category>irc</category>
  <category>nscoder night</category>
  <category>programming</category>
  <category>cocoaheads</category>
  <category>mac os x</category>
  <category>cocoa</category>
  <category>get-togethers</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/184318.html</guid>
  <pubDate>Sun, 27 Apr 2008 06:16:50 GMT</pubDate>
  <title>Build LLVM and clang!</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/184318.html</link>
  <description>I&apos;ve talked about the &lt;a href=&quot;http://chanson.livejournal.com/172642.html&quot;&gt;LLVM Compiler Infrastructure&lt;/a&gt; in the past, but what I haven&apos;t talked about yet is just how &lt;em&gt;easy&lt;/em&gt; and &lt;em&gt;quickly&lt;/em&gt; you can build it on your own Mac running Leopard!  This is a great way to get into hacking on compiler lexical analyzers and parsers, code generators, optimizers, and so on.&lt;br /&gt;&lt;br /&gt;What&apos;s more, you can build both &lt;a href=&quot;http://llvm.org/&quot;&gt;LLVM&lt;/a&gt; and the new C front-end &lt;code&gt;&lt;a href=&quot;http://clang.llvm.org/&quot;&gt;clang&lt;/a&gt;&lt;/code&gt; very easily and in &lt;strong&gt;five to ten minutes&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;First, create a work area to check them out into, wherever you normally create your projects.  &lt;code&gt;&lt;pre&gt;[~]% cd /Projects
[/Projects]% mkdir LLVM
[/Projects]% cd LLVM
[/Projects/LLVM]%&lt;/pre&gt;&lt;/code&gt;  Then check out LLVM itself and &lt;code&gt;clang&lt;/code&gt; from the &lt;a href=&quot;http://llvm.org/docs/GettingStarted.html#checkout&quot;&gt;LLVM Subversion repository&lt;/a&gt;.  &lt;code&gt;&lt;pre&gt;[/Projects/LLVM]% svn checkout http://llvm.org/svn/llvm-project/llvm/trunk llvm
[/Projects/LLVM]% cd llvm/tools
[/Projects/LLVM/llvm/tools]% svn checkout http://llvm.org/svn/llvm-project/cfe/trunk clang
[/Projects/LLVM/llvm/tools]% cd ../..
[/Projects/LLVM]%&lt;/pre&gt;&lt;/code&gt;  Then edit the &lt;code&gt;PARALLEL_DIRS&lt;/code&gt; definition in &lt;code&gt;llvm/tools/Makefile&lt;/code&gt; to tell it about &lt;code&gt;clang&lt;/code&gt;.  Just add &lt;code&gt;clang&lt;/code&gt; onto the end, like this:  &lt;code&gt;&lt;pre&gt;PARALLEL_DIRS := llvm-config  \
                 opt llvm-as llvm-dis \
                 llc llvm-ranlib llvm-ar llvm-nm \
                 llvm-ld llvm-prof llvm-link \
                 lli gccas gccld llvm-extract llvm-db \
                 bugpoint llvm-bcanalyzer llvm-stub llvmc2 \
                 clang&lt;/pre&gt;&lt;/code&gt;  Now create a directory to build into, next to your &lt;code&gt;llvm&lt;/code&gt; directory, and change into it.  &lt;code&gt;&lt;pre&gt;[/Projects/LLVM]% mkdir build
[/Projects/LLVM]% cd build
[/Projects/LLVM/build]%&lt;/pre&gt;&lt;/code&gt;  This is where you&apos;ll actually run &lt;code&gt;configure&lt;/code&gt;.  This will ensure your source tree isn&apos;t polluted with build products, and that everything stays self-contained while you hack.  &lt;code&gt;&lt;pre&gt;[/Projects/LLVM/build]% ../llvm/configure --enable-targets=host-only
# lots of logging
[/Projects/LLVM/build]%&lt;/pre&gt;&lt;/code&gt;  You&apos;ll note that above I passed an argument to &lt;code&gt;configure&lt;/code&gt;.  This ensures that LLVM is only built to target the architecture I&apos;m running on, to speed up the build process; this is generally fine for simple front-end development.&lt;br /&gt;&lt;br /&gt;Now, to build LLVM as well as &lt;code&gt;clang&lt;/code&gt; all I have to do is invoke &lt;code&gt;make&lt;/code&gt;.  LLVM is set up to correctly do parallel builds, so I&apos;ll pass the number of CPUs I have in my machine via &lt;code&gt;make -j 4&lt;/code&gt;.  &lt;code&gt;&lt;pre&gt;[/Projects/LLVM/build]% make -j 4
# lots of logging
[/Projects/LLVM/build]%&lt;/pre&gt;&lt;/code&gt;  That&apos;s it!  LLVM is now (hopefully) successfully built.  All of the pieces are in the &lt;code&gt;build&lt;/code&gt; directory under &lt;code&gt;Debug/bin&lt;/code&gt; and &lt;code&gt;Debug/lib&lt;/code&gt; and so on; see the LLVM web site for details about what the various components are.</description>
  <comments>http://chanson.livejournal.com/184318.html</comments>
  <category>objective-c</category>
  <category>c</category>
  <category>programming</category>
  <category>llvm</category>
  <category>mac os x</category>
  <category>compilers</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/184036.html</guid>
  <pubDate>Mon, 21 Apr 2008 09:15:36 GMT</pubDate>
  <title>Copyright canonical form</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/184036.html</link>
  <description>One thing that&apos;s nagged at me lately has been the series of applications I&apos;ve seen lately with copyright statements that appear to be from the Bizarro universe.  I don&apos;t mean that they have weird license restrictions; rather, they have a copyright statement in their standard About panel that&apos;s formatted strangely.  It&apos;s a minor pet peeve to be sure, but it&apos;s a simple thing to get right and getting it wrong looks silly.&lt;br /&gt;&lt;br /&gt;Note that &lt;em&gt;the following is not legal advice&lt;/em&gt; on asserting or protecting your copyright — you&apos;ll have to go to a lawyer for that — it&apos;s just a suggestion on how to concisely format your statement that your work is covered under copyright.&lt;br /&gt;&lt;br /&gt;In a Cocoa application, the standard About panel will show the copyright statement specified under the &lt;code&gt;NSHumanReadableCopyright&lt;/code&gt; of its &lt;code&gt;Info.plist&lt;/code&gt; file.  This should generally be of the form &lt;blockquote&gt;Copyright © &lt;em&gt;«YEARS»&lt;/em&gt; &lt;em&gt;«HOLDERS»&lt;/em&gt;. All rights reserved.&lt;/blockquote&gt; where &lt;em&gt;«YEARS»&lt;/em&gt; represents the individual year, set of years, or range of years during which the application was authored and &lt;em&gt;«HOLDERS»&lt;/em&gt; represent the authors of the application.&lt;br /&gt;&lt;br /&gt;Thus if I were to start writing an application in 2007 and finish it in 2008, I would put &lt;blockquote&gt;Copyright © 2007–2008 Chris Hanson. All rights reserved.&lt;/blockquote&gt; in the &lt;code&gt;NSHumanReadableCopyright&lt;/code&gt; key of its &lt;code&gt;Info.plist&lt;/code&gt; file.  (Yes, that&apos;s an en-dash between the years, option-hyphen gets you one.)  It wouldn&apos;t have the year at the end, or random commas after things, or random abbreviations.  Just one simple statement.&lt;br /&gt;&lt;br /&gt;Someday I&apos;ll figure out how to add &lt;blockquote&gt;Copyright © 2002–2008 Chris Hanson. All rights reserved.&lt;/blockquote&gt; to the bottom of my weblog, too.  Hopefully in such a way that I can actually update it easily when the year rolls over…</description>
  <comments>http://chanson.livejournal.com/184036.html</comments>
  <category>programming</category>
  <category>mac os x</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/183642.html</guid>
  <pubDate>Thu, 17 Apr 2008 19:38:12 GMT</pubDate>
  <title>CocoaHeads Silicon Valley at Apple on Thursday, April 17, 2008</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/183642.html</link>
  <description>The next &lt;a href=&quot;http://www.cocoaheads.org/us/SiliconValleyCalifornia/index.html&quot;&gt;CocoaHeads Silicon Valley&lt;/a&gt; meeting will be on Thursday, April 17, 2008 — &lt;strong&gt;that&apos;s tonight!&lt;/strong&gt; — at 7:30 in the &lt;strong&gt;De Anza 3&lt;/strong&gt; auditorium at Apple. That&apos;s just inside the &lt;strong&gt;south side of De Anza 3&lt;/strong&gt;, right across Mariani Avenue from Apple&apos;s Infinite Loop campus in Cupertino.  See the &lt;a href=&quot;http://www.cocoaheads.org/us/SiliconValleyCalifornia/index.html&quot;&gt;web site&lt;/a&gt; for directions.&lt;br /&gt;&lt;br /&gt;This month&apos;s presentation is all about &lt;a href=&quot;http://theocacao.com/document.page/566&quot;&gt;designing and implementing your human interface&lt;/a&gt;.  User experience and human interface design are &lt;strong&gt;critical&lt;/strong&gt; for Mac OS X software to get right.  To that end, there&apos;s even going to be a &lt;strong&gt;UI makeover&lt;/strong&gt; as Scott describes in his post on the meeting!&lt;br /&gt;&lt;br /&gt;Thanks a ton to &lt;a href=&quot;http://theocacao.com/&quot;&gt;Scott Stevenson&lt;/a&gt;, Steve Zyszkiewicz, Michael Jurewitz and &lt;a href=&quot;http://joar.com/&quot;&gt;Joar Wingfors&lt;/a&gt; for organizing!&lt;br /&gt;&lt;br /&gt;In general, at a &lt;a href=&quot;http://www.cocoaheads.org/&quot;&gt;CocoaHeads&lt;/a&gt; meeting we do some introductions, have a presentation including Q&amp;amp;A time with the presenter, and then have an open Q&amp;amp;A and demo-your-cool-app period.  After the meeting there&apos;s more independent mingling and discussion until it&apos;s time to go at 9:30.  Often a subset of the meeting moves to &lt;a href=&quot;http://bjsbrewhouse.com/restaurants_page/cupertino.html&quot;&gt;BJ&apos;s Brewhouse in Cupertino&lt;/a&gt;, which is right in front of the Apple Infinite Loop campus on De Anza Boulevard.</description>
  <comments>http://chanson.livejournal.com/183642.html</comments>
  <category>human interface design</category>
  <category>objective-c</category>
  <category>leopard</category>
  <category>programming</category>
  <category>events</category>
  <category>cocoaheads</category>
  <category>mac os x</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/183322.html</guid>
  <pubDate>Tue, 15 Apr 2008 05:58:11 GMT</pubDate>
  <title>Down the Rabbit Hole: Four Years On</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/183322.html</link>
  <description>Today was my &lt;a href=&quot;http://chanson.livejournal.com/94629.html&quot;&gt;four year anniversary&lt;/a&gt; working on &lt;a href=&quot;http://www.apple.com/macosx/developertools/xcode.html&quot;&gt;developer tools&lt;/a&gt; at &lt;a href=&quot;http://www.apple.com/&quot;&gt;Apple&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No regrets about taking the red pill here!</description>
  <comments>http://chanson.livejournal.com/183322.html</comments>
  <category>apple</category>
  <category>xcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/183123.html</guid>
  <pubDate>Mon, 14 Apr 2008 02:13:49 GMT</pubDate>
  <title>NeXTstation Color:  Free to good (local) home</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/183123.html</link>
  <description>I have a complete 25MHz NeXTstation Color that I want to get rid of to a good home — in other words, you should want to use in some capacity as a NeXT workstation, not make its case into art or something.  This isn&apos;t some crappy PC of which there are millions with tiny variations among them, it&apos;s a workstation of which only a relatively small number were made.&lt;br /&gt;&lt;br /&gt;Specifications:  &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://lowendmac.com/next/nextstncolor.html&quot;&gt;NeXTstation Color&lt;/a&gt;&lt;/li&gt; &lt;li&gt;17-inch NeXT Color Display&lt;/li&gt; &lt;li&gt;16MB RAM&lt;/li&gt; &lt;li&gt;400MB SCSI HD&lt;/li&gt; &lt;li&gt;NeXT Keyboard (non-ADB)&lt;/li&gt; &lt;li&gt;NeXT Mouse (non-ADB)&lt;/li&gt; &lt;li&gt;NeXT Sound Box&lt;/li&gt; &lt;li&gt;Appropriate cabling.&lt;/li&gt; &lt;/ul&gt;  It worked the last time I turned it on, which was probably 2003. It&apos;s been in a box in my closet — the box the movers put it in when I moved out here four years ago. I don&apos;t see why it wouldn&apos;t work, but I wouldn&apos;t guarantee it. The motherboard battery will probably need replacing, for one thing.&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;Want it, and reasonably local to Cupertino? Ping me and we&apos;ll talk.&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update:&lt;/strong&gt;  The NeXTstation is claimed!  Thanks for the impressive response — who knew so many people would want a workstation that&apos;s old enough to drive?</description>
  <comments>http://chanson.livejournal.com/183123.html</comments>
  <category>next</category>
  <category>nextstep</category>
  <category>workstation</category>
  <category>nextstation</category>
  <category>unix</category>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/182996.html</guid>
  <pubDate>Sun, 30 Mar 2008 01:40:35 GMT</pubDate>
  <title>Apple TV 2.0.1</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/182996.html</link>
  <description>A new version of the &lt;a href=&quot;http://www.apple.com/appletv/&quot;&gt;Apple TV&lt;/a&gt; software is available!  And what&apos;s more, after updating to Apple TV 2.0.1, I found that I can actually use my YouTube favorites and subscriptions on my Apple TV!&lt;br /&gt;&lt;br /&gt;This is great, because I mark videos that I&apos;ll want to watch again as favorites, and I have a number of subscriptions set up to interesting videos — like those from the &lt;a href=&quot;http://www.youtube.com/user/ComputerHistory&quot;&gt;Computer History Museum&lt;/a&gt; and &lt;a href=&quot;http://www.youtube.com/user/zendulo&quot;&gt;Zendulo&lt;/a&gt; — that aren&apos;t yet available as video podcasts.&lt;br /&gt;&lt;br /&gt;YouTube favorites and subscriptions hadn&apos;t worked for me in the past because I have a YouTube account that&apos;s linked to my Google account — that is, a YouTube account that ends in &lt;code&gt;@gmail.com&lt;/code&gt;.  After updating to Apple TV 2.0.1, I just had to log out from my YouTube account and log in again, and everything came up just fine.</description>
  <comments>http://chanson.livejournal.com/182996.html</comments>
  <category>audio</category>
  <category>podcasts</category>
  <category>apple tv</category>
  <category>video</category>
  <category>youtube</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/182581.html</guid>
  <pubDate>Tue, 18 Mar 2008 06:00:06 GMT</pubDate>
  <title>peterb hits it out of the park</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/182581.html</link>
  <description>peterb of Tea Leaves, in &lt;cite&gt;&lt;a href=&quot;http://tleaves.com/2008/03/10/game-developer-to-world-please-revolve-around-me/&quot;&gt;Game Developer To World: Please Revolve Around Me!&lt;/a&gt;&lt;/cite&gt; summarizes the position taken by &lt;a href=&quot;http://www.tgdaily.com/content/view/36390/118/&quot;&gt;Tim Sweeny of Epic during an interview&lt;/a&gt; thusly:  &lt;blockquote&gt; &lt;ol&gt; &lt;li&gt;People aren’t buying expensive enough PCs.&lt;/li&gt;  &lt;li&gt;Even the expensive PCs aren’t good enough to run his games.&lt;/li&gt;  &lt;li&gt;People who buy cheaper machines with Intel integrated graphics are giving their money to Blizzard instead of Epic.&lt;/li&gt;  &lt;li&gt;This aggression cannot stand. The solution is that everyone except us should change what they’re doing and buy machines with more expensive graphics hardware.&lt;/li&gt;  &lt;/ol&gt;  &lt;/blockquote&gt;  This problem is endemic in the game industry.&lt;br /&gt;&lt;br /&gt;The most recent example, I was going to buy my girlfriend &lt;a href=&quot;http://thesims2.ea.com/&quot;&gt;The Sims 2&lt;/a&gt; for Valentine&apos;s Day to play on her MacBook.  Oops!  Her MacBook has the dread &lt;em&gt;Intel integrated graphics&lt;/em&gt; and therefore can&apos;t run it!  Or, indeed, &lt;em&gt;any&lt;/em&gt; of the other games ported to the Mac using the &lt;a href=&quot;http://transgaming.com/products/cider/&quot;&gt;same technology&lt;/a&gt;!  Thanks a bunch, it&apos;s not like anybody has a MacBook!  (Except, of course, &lt;em&gt;everybody&lt;/em&gt; these days.)&lt;br /&gt;&lt;br /&gt;But wait, what are the actual &lt;a href=&quot;http://thesims2.ea.com/help/detail.php?help_id=21&quot;&gt;system requirements for The Sims 2 on Windows&lt;/a&gt;?  800 MHz CPU and a T&amp;L-capable video card, or 2GHz CPU and non-T&amp;L-capable video card.  Her MacBook definitely meets those criteria, and it&apos;s &lt;em&gt;also&lt;/em&gt; a huge portion of the Mac customer base for a game like that.  I wonder if the PowerPC build would run acceptably under Rosetta — the original Sims ran fine on an iBook DV a half-decade ago, after all, and it&apos;s not like The Sims 2 is new.&lt;br /&gt;&lt;br /&gt;I also heard a lot of commentary around the time the iMac G5 debuted about its &quot;terrible&quot; 5200FX video chipset.  After all, it meant that a lot of games people were working on for then-high-end machines wouldn&apos;t run!  Except, uh, &lt;em&gt;why&lt;/em&gt; wouldn&apos;t they run?  &lt;em&gt;Because developers didn&apos;t actually design for what users were buying!&lt;/em&gt;  They were designing for some ideal system that very few people had, and beyond that they had the gall to complain that they weren&apos;t selling many games.  Hmm.  I wonder why.  If you limit your market to people with beefy dual-G5 systems with high-end video cards who are &lt;em&gt;allowed&lt;/em&gt; to install games on them, maybe that&apos;s not such a big market...  On the other hand, if you design for the iMac G4, and the iMac G5 comes out, chances are you&apos;ll be able to sell to a lot more people...&lt;br /&gt;&lt;br /&gt;Game developers should be targeting &lt;em&gt;the systems people are using&lt;/em&gt; rather than &lt;em&gt;systems with every feature under the sun&lt;/em&gt;.  No wonder casual games do so well — nobody else is &lt;em&gt;willing&lt;/em&gt; to serve that vast majority of the market!&lt;br /&gt;&lt;br /&gt;So if you&apos;re writing a game, or thinking about writing a game, or any other performance-sensitive application, look at what the bulk of the users you want to target are currently using and design for that.  Neither you nor your users are likely to be disappointed with the results.</description>
  <comments>http://chanson.livejournal.com/182581.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/182472.html</guid>
  <pubDate>Mon, 17 Mar 2008 07:18:25 GMT</pubDate>
  <title>Xcode unit testing articles updated</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/182472.html</link>
  <description>I&apos;ve updated my posts on creating and debugging unit tests for for Cocoa applications and frameworks for Xcode 3.0.  If you have any additional questions about how unit testing works in Xcode, don&apos;t hesitate to ask!&lt;br /&gt;&lt;br /&gt;Here are pointers to the updated articles:  &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://chanson.livejournal.com/119303.html&quot;&gt;Xcode: Unit Testing Cocoa frameworks&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://chanson.livejournal.com/119578.html&quot;&gt;Xcode: Debugging Cocoa Framework Unit Tests&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://chanson.livejournal.com/120263.html&quot;&gt;Xcode: Unit Testing Cocoa Applications&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://chanson.livejournal.com/120740.html&quot;&gt;Xcode: Debugging Cocoa application unit tests&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The most significant change is in debugging Cocoa application unit tests.  There&apos;s an extra environment variable you&apos;ll need to add to your executable, &lt;code&gt;DYLD_FALLBACK_FRAMEWORK_PATH&lt;/code&gt;, before you&apos;ll be able to debug it with Xcode 3.0.  This is necessary because Xcode takes advantage of a new linker feature — runpath-relative install names — in order to support moving and renaming your Developer folder and having multiple versions of Xcode installed.</description>
  <comments>http://chanson.livejournal.com/182472.html</comments>
  <category>objective-c</category>
  <category>unit testing</category>
  <category>debugging</category>
  <category>xcode</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/182135.html</guid>
  <pubDate>Wed, 13 Feb 2008 07:10:01 GMT</pubDate>
  <title>Dr. Kiki teaches us to say &quot;Theobroma Cacao&quot;</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/182135.html</link>
  <description>&lt;a href=&quot;http://www.kirstensanford.com/&quot;&gt;Dr. Kiki Sanford&lt;/a&gt; teaches us on her latest &lt;a href=&quot;http://www.onnetworks.com/videos/food-science/&quot;&gt;&lt;cite&gt;Food Science&lt;/cite&gt;&lt;/a&gt; podcast about &lt;strong&gt;&lt;a href=&quot;http://www.onnetworks.com/videos/food-science/chocolate&quot;&gt;chocolate&lt;/a&gt;&lt;/strong&gt; how to &lt;em&gt;definitively&lt;/em&gt; pronounce &lt;a href=&quot;http://theocacao.com/&quot;&gt;Theobroma Cacao&lt;/a&gt;.</description>
  <comments>http://chanson.livejournal.com/182135.html</comments>
  <category>podcasts</category>
  <category>chocolate</category>
  <category>science</category>
  <category>video</category>
  <category>cocoa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://chanson.livejournal.com/181767.html</guid>
  <pubDate>Sun, 10 Feb 2008 06:41:42 GMT</pubDate>
  <title>Free font happiness!  Inconsolata, Kaffeesatz and Tagesschrift</title>
  <author>cmh@mac.com</author>  <link>http://chanson.livejournal.com/181767.html</link>
  <description>I love good fonts.  It&apos;s one of the things that I enjoy most about Mac OS X — the font rendering is &lt;em&gt;wonderful&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Lately for programming and Terminal use, I&apos;ve used &lt;a href=&quot;http://www.levien.com/type/myfonts/inconsolata.html&quot;&gt;Inconsolata&lt;/a&gt; by &lt;a href=&quot;http://www.levien.com/&quot;&gt;Raph Levien&lt;/a&gt;.  It&apos;s a very clean monospaced font that renders really well at 12 points and higher, and is perfectly usable for coding at that size.  It avoids the &lt;a href=&quot;http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html&quot;&gt;Vera Sans Mono&lt;/a&gt; problems with too-thin horizontal lines at common sizes.&lt;br /&gt;&lt;br /&gt;Tonight — thanks to &lt;a href=&quot;http://mooseyard.com/Jens/&quot;&gt;Jens Alfke&lt;/a&gt; and his &lt;a href=&quot;http://mooseyard.com/Jens/2008/02/make-mine-mercurial/&quot;&gt;logo design&lt;/a&gt; for the &lt;a href=&quot;http://www.selenic.com/mercurial/&quot;&gt;Mercurial&lt;/a&gt; distributed SCM system — I&apos;ve discovered the free fonts from &lt;a href=&quot;http://www.yanone.de/&quot;&gt;Yanone&lt;/a&gt;, specifically &lt;a href=&quot;http://www.yanone.de/typedesign/kaffeesatz/&quot;&gt;Kaffeesatz&lt;/a&gt; and &lt;a href=&quot;http://www.yanone.de/typedesign/tagesschrift/&quot;&gt;Tagesschrift&lt;/a&gt;.  Kaffeesatz in particular is a pretty slick font; hopefully I can find a use for it in something.&lt;br /&gt;&lt;br /&gt;Any other free &amp;amp; open font suggestions?  Let me know in the comments.  I can always use more great fonts.</description>
  <comments>http://chanson.livejournal.com/181767.html</comments>
  <category>fonts</category>
  <category>kaffeesatz</category>
  <category>programming</category>
  <category>vera sans</category>
  <category>mac os x</category>
  <category>tagesschrift</category>
  <category>inconsolata</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
</channel>
</rss>
