<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>briankc.com</title>
	<atom:link href="http://briankc.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://briankc.com</link>
	<description>Brian Christensen's weblog</description>
	<pubDate>Thu, 28 Feb 2008 22:29:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Preliminary notes on Aperture 2.0 plug-ins</title>
		<link>http://briankc.com/2008/02/13/preliminary-notes-on-aperture-20-plug-ins/</link>
		<comments>http://briankc.com/2008/02/13/preliminary-notes-on-aperture-20-plug-ins/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 23:56:13 +0000</pubDate>
		<dc:creator>Brian Christensen</dc:creator>
		
		<category><![CDATA[Aperture]]></category>

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

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

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

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

		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://briankc.com/2008/02/13/preliminary-notes-on-aperture-20-plug-ins/</guid>
		<description><![CDATA[Many Aperture users are starting to get excited about the upcoming Aperture 2 plug-in SDK. I think some people are expecting this to be some kind of &#8220;adjustments&#8221; API, perhaps allowing you to add additional effects filters on top of the standard adjustments like white balance, exposure, and so on.

Unfortunately, from what I&#8217;ve been able [...]]]></description>
			<content:encoded><![CDATA[<p>Many Aperture users are starting to get excited about the upcoming Aperture 2 plug-in SDK. I think some people are expecting this to be some kind of &#8220;adjustments&#8221; API, perhaps allowing you to add additional effects filters on top of the standard adjustments like white balance, exposure, and so on.</p>

<p>Unfortunately, from what I&#8217;ve been able to figure out, the SDK will not support non-destructive adjustments. It doesn&#8217;t ask the plug-in to &#8220;apply&#8221; its changes anywhere in the current chain of non-destructive adjustments or anything of the sort. It creates a copy of the selected photo, lets the plug-in do whatever it does to that copy, and that&#8217;s pretty much it. So, if the user does some exposure adjustments, then uses some type of &#8220;filter effect&#8221; edit plug-in, and finally applies a few more standard (ie. contrast) adjustments, he won&#8217;t be able to change the initial exposure adjustments and have them reflected in the &#8220;edited&#8221; copy.</p>

<p>Using class-dump we can see that the following is all a plug-in appears to be able to do:</p>


<div class="wp_syntax"><div class="code"><pre class="objc"><span style="color: #0000ff;">@protocol</span> ApertureEditPlugIn
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>initWithAPIManager:<span style="color: #002200;">&#40;</span>id&lt;PROAPIAccessing&gt;<span style="color: #002200;">&#41;</span>apiManager;
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>editManager:<span style="color: #002200;">&#40;</span>id&lt;ApertureEditManager&gt;<span style="color: #002200;">&#41;</span>editManager didImportImageAtPath:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>imagePath versionUniqueID:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>versionUniqueID;
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>beginEditSession;
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>editWindow;
&nbsp;
<span style="color: #0000ff;">@end</span>
&nbsp;
<span style="color: #0000ff;">@protocol</span> ApertureEditManager
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>selectedVersionIds;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>editableVersionIds;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>importedVersionIds;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>propertiesWithoutThumbnailForVersion:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>thumbnailForVersion:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8 size:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #002200;">&#41;</span>fp12;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>editableVersionsOfVersions:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8 stackWithOriginal:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">BOOL</span><span style="color: #002200;">&#41;</span>fp12;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">BOOL</span><span style="color: #002200;">&#41;</span>canImport;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>importImageAtPath:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8 referenced:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">BOOL</span><span style="color: #002200;">&#41;</span>fp12 stackWithVersions:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp16;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>deleteVersions:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>addCustomMetadata:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8 toVersions:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp12;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>addHierarchicalKeywords:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp8 toVersions:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>fp12;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>apertureWindow;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>endEditSession;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>cancelEditSession;
&nbsp;
<span style="color: #0000ff;">@end</span></pre></div></div>


<p>To get at the data required to actually perform any &#8220;edits&#8221; on the image, you have to send the editManager an &#8220;editableVersionsOfVersions:stackWithOriginal:&#8221; message. This causes Aperture to create copies of the requested images. That&#8217;s all the plug-in is then able to work with.</p>

<p>I&#8217;d love to be completely wrong on this, but it appears that these &#8220;edit&#8221; plug-ins won&#8217;t be that much different than using &#8220;open with external editor.&#8221; This isn&#8217;t looking to be nearly as powerful or &#8220;revolutionary&#8221; as a lot of folks are hoping for, I&#8217;m afraid.</p>

<p>Maybe the official SDK will somehow prove me wrong, but the initial indications don&#8217;t look particularly promising at this point.</p>
]]></content:encoded>
			<wfw:commentRss>http://briankc.com/2008/02/13/preliminary-notes-on-aperture-20-plug-ins/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Thoughts on the MWSF &#8216;08 keynote</title>
		<link>http://briankc.com/2008/01/20/thoughts-on-the-mwsf-08-keynote/</link>
		<comments>http://briankc.com/2008/01/20/thoughts-on-the-mwsf-08-keynote/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 03:57:35 +0000</pubDate>
		<dc:creator>Brian Christensen</dc:creator>
		
		<category><![CDATA[Apple]]></category>

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

		<guid isPermaLink="false">http://briankc.com/2008/01/20/thoughts-on-the-mwsf-08-keynote/</guid>
		<description><![CDATA[It seems only logical to write a post-&#8221;Stevenote&#8221; analysis following my obligatory Macworld 2008 predictions entry from last week. Complete rundowns of the keynote have been hashed out ad nauseam across the internet, so I will limit myself to just two points of interest.

The state of the Mac OS

Steve Jobs started off by reporting that [...]]]></description>
			<content:encoded><![CDATA[<p>It seems only logical to write a post-&#8221;Stevenote&#8221; analysis following my <a href="http://briankc.com/2008/01/14/the-eve-of-macworld-2008/">obligatory Macworld 2008 predictions entry</a> from last week. Complete rundowns of the keynote have been hashed out ad nauseam across the internet, so I will limit myself to just two points of interest.</p>

<h3>The state of the Mac OS</h3>

<p>Steve Jobs started off by reporting that Apple had so far shipped 5 million copies of Leopard, making this &#8220;the most successful release of Mac OS X ever.&#8221; According to Jobs, this constitutes 20% of the Mac OS X installed base. As a developer currently working on a Leopard-only product, I find these numbers to be outstanding news. <a href="http://wilshipley.com/">Wil Shipley</a> of <a href="http://delicious-monster.com/">Delicious Monster</a> has noted several times that the type of users who quickly upgrade to the latest operating system are the ones willing to spend money on software, and as such constitute a terrific target audience for new applications.</p>

<p>One can only imagine what numbers Jobs will reveal at the WWDC &#8216;08 keynote this summer.</p>

<h3>The MacBook Air</h3>

<p>Unsurprisingly, the complaints, the incessant whining, and the usual proclamations of Apple&#8217;s impending doom due to the introduction of the <a href="http://www.apple.com/macbookair/">MacBook Air</a> are running rampant across the web. Price comparisons between it and other MacBook models are being used to justify claims that the machine is &#8220;overpriced&#8221; and &#8220;underpowered.&#8221;</p>

<p>Granted, the Air is obviously less powerful than its MacBook (Pro) counterparts and it does indeed cost more. But engineering a notebook to fit into the constraints this product dictated doesn&#8217;t happen by itself. Hardware engineers don&#8217;t work for free. Miniaturization is always expensive. Historically, notebooks have been less powerful than their desktop counterparts, yet tended to cost quite a bit more. Portability comes at a premium.</p>

<p>John Gruber <a href="http://daringfireball.net/2008/01/macbook_air">published his take</a> on the MacBook Air in which he says that it is &#8220;clearly designed as a secondary machine, not a main machine.&#8221; While I agree that this statement holds true for power users, I also think Scott Stevenson <a href="http://theocacao.com/document.page/545">makes an excellent point</a> that &#8220;there&#8217;s an entire category of users that could use this not just as their primary, but their <em>only</em> computer.&#8221;</p>

<p>I don&#8217;t know if the MacBook Air will be a bestseller, but I do predict it&#8217;ll be a success.</p>
]]></content:encoded>
			<wfw:commentRss>http://briankc.com/2008/01/20/thoughts-on-the-mwsf-08-keynote/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The eve of Macworld 2008</title>
		<link>http://briankc.com/2008/01/14/the-eve-of-macworld-2008/</link>
		<comments>http://briankc.com/2008/01/14/the-eve-of-macworld-2008/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 00:03:08 +0000</pubDate>
		<dc:creator>Brian Christensen</dc:creator>
		
		<category><![CDATA[Apple]]></category>

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

		<guid isPermaLink="false">http://briankc.com/2008/01/14/the-eve-of-macworld-2008/</guid>
		<description><![CDATA[With the Stevenote less than twenty-four hours away, it&#8217;s high time for the obligatory Macworld Eve post. 

The big item that seems to be circulating the rumor sites is the so-called &#8220;MacBook Air.&#8221; While I think that name sounds rather pedestrian, there does appear to be some circumstantial evidence supporting the idea. But regardless of [...]]]></description>
			<content:encoded><![CDATA[<p>With the Stevenote less than twenty-four hours away, it&#8217;s high time for the obligatory Macworld Eve post. </p>

<p>The big item that seems to be circulating the rumor sites is the so-called &#8220;MacBook Air.&#8221; While I think that name sounds rather pedestrian, there does appear to be some circumstantial evidence supporting the idea. But regardless of its title, I am betting we will be seeing some sort of slimmed-down MacBook, probably lacking an optical drive. <a href="http://log.carpeaqua.com/post/23700504">Justin Williams has an interesting take</a> on how this could be accomplished by Apple introducing a new digital software distribution model. I agree with John Gruber <a href="http://daringfireball.net/2008/01/macworld_expo_predictions">that it will feature a standard hard disk, not flash memory</a>.</p>

<p>We may also see an updated iPhone. Revised Cinema Displays seem likely as well, along with a new Apple TV.</p>

<p>In any case, I&#8217;m sure it will be interesting. I&#8217;ll be following along via <a href="http://www.macrumorslive.com/">MacRumorsLive</a>. Hopefully some people will be <a href="http://twitter.com/">&#8220;twittering&#8221;</a> live from the keynote as it unfolds, too.</p>
]]></content:encoded>
			<wfw:commentRss>http://briankc.com/2008/01/14/the-eve-of-macworld-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Create a transparent fullscreen view</title>
		<link>http://briankc.com/2007/12/15/create-a-transparent-fullscreen-view/</link>
		<comments>http://briankc.com/2007/12/15/create-a-transparent-fullscreen-view/#comments</comments>
		<pubDate>Sat, 15 Dec 2007 23:14:33 +0000</pubDate>
		<dc:creator>Brian Christensen</dc:creator>
		
		<category><![CDATA[Apple]]></category>

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

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

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

		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://briankc.com/2007/12/15/create-a-transparent-fullscreen-view/</guid>
		<description><![CDATA[The question of how to create a transparent fullscreen view came up on the cocoa-dev list recently. As it turns out, it is fairly trivial to implement.

The custom window subclass

Create the following header file:


1
2
3
4
5
6
7
8
9
// TransparentWindow.h
&#160;
#import &#60;Cocoa/Cocoa.h&#62;
&#160;
@interface TransparentWindow : NSWindow 
&#123;
&#125;
&#160;
@end


In the implementation all we need to do to make the window transparent is specify a [...]]]></description>
			<content:encoded><![CDATA[<p>The question of how to create a transparent fullscreen view came up on the cocoa-dev list recently. As it turns out, it is fairly trivial to implement.</p>

<h3>The custom window subclass</h3>

<p>Create the following header file:</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="objc"><span style="color: #ff0000;">// TransparentWindow.h</span>
&nbsp;
<span style="color: #339900;">#import &lt;Cocoa/Cocoa.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">@interface</span> TransparentWindow : <span style="color: #0000ff;">NSWindow</span> 
<span style="color: #002200;">&#123;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">@end</span></pre></td></tr></table></div>


<p>In the implementation all we need to do to make the window transparent is specify a <span class="code">NSBorderlessWindowMask</span> and set the background color to <span class="code">[NSColor clearColor]</span>.</p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="objc"><span style="color: #ff0000;">// TransparentWindow.m</span>
&nbsp;
<span style="color: #339900;">#import &quot;TransparentWindow.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">@implementation</span> TransparentWindow
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">id</span><span style="color: #002200;">&#41;</span>initWithContentRect:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">NSRect</span><span style="color: #002200;">&#41;</span>contentRect styleMask:<span style="color: #002200;">&#40;</span>NSUInteger<span style="color: #002200;">&#41;</span>aStyle backing:<span style="color: #002200;">&#40;</span>NSBackingStoreType<span style="color: #002200;">&#41;</span>bufferingType defer:<span style="color: #002200;">&#40;</span><span style="color: #0000ff;">BOOL</span><span style="color: #002200;">&#41;</span>flag
<span style="color: #002200;">&#123;</span>
    self = <span style="color: #002200;">&#91;</span>super initWithContentRect:<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #0000ff;">NSScreen</span> mainScreen<span style="color: #002200;">&#93;</span> frame<span style="color: #002200;">&#93;</span> styleMask:NSBorderlessWindowMask backing:bufferingType defer:flag<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #002200;">&#40;</span>self<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #002200;">&#91;</span>self setBackgroundColor:<span style="color: #002200;">&#91;</span><span style="color: #0000ff;">NSColor</span> clearColor<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>self setOpaque:NO<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">@end</span></pre></td></tr></table></div>


<h3>Using the window class</h3>

<p>To use this window you can either instantiate it programmatically or set it as the custom window class in your NIB file (I am using the latter method myself in a current project). </p>

<p>If you need a semi-transparent window, you can substitute something like <span class="code">[NSColor colorWithCalibratedWhite:1.0 alpha:0.5]</span> for the color object in line 13.</p>

<p>And, depending on what you are doing, you may want your window to appear above the menubar. To do so, add <span class="code">[self setLevel:NSMainMenuWindowLevel + 1];</span> after line 14.</p>
]]></content:encoded>
			<wfw:commentRss>http://briankc.com/2007/12/15/create-a-transparent-fullscreen-view/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The obligatory introduction</title>
		<link>http://briankc.com/2007/10/25/the-obligatory-introduction/</link>
		<comments>http://briankc.com/2007/10/25/the-obligatory-introduction/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 00:14:54 +0000</pubDate>
		<dc:creator>Brian Christensen</dc:creator>
		
		<category><![CDATA[Blogging]]></category>

		<guid isPermaLink="false">http://briankc.com/2007/10/25/the-obligatory-introduction/</guid>
		<description><![CDATA[The great inaugural post has finally been blasted onto the internet. Having burned through about a dozen different concept designs over the past couple of years without actually doing anything with them, I suppose it&#8217;s about time.

One of the motivating factors was Daniel Jalkut&#8217;s No More Excuses post, which made me finally decide to fight [...]]]></description>
			<content:encoded><![CDATA[<p>The great inaugural post has finally been blasted onto the internet. Having burned through about a dozen different concept designs over the past couple of years without actually doing anything with them, I suppose it&#8217;s about time.</p>

<p>One of the motivating factors was Daniel Jalkut&#8217;s <a href="http://www.red-sweater.com/blog/414/no-more-excuses">No More Excuses</a> post, which made me finally decide to fight my inner procrastination and launch this blog.</p>

<p>And I recently &#8220;soft-launched&#8221; my small self-funded Mac software startup, <a href="http://alienorb.com/">Alien Orb Software</a>. I want to use this web space to write about technical as well as small business topics, with a focus on the Mac. That doesn&#8217;t mean I will arbitrarily confine myself to this subject matter, but that is mostly what I see myself writing about in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://briankc.com/2007/10/25/the-obligatory-introduction/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
 