<?xml version="1.0" encoding="UTF-8"?><feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:thr="http://purl.org/syndication/thread/1.0"
  xml:lang="en"
  >
  <id>http://livingcode.org/feed/atom</id>
  <updated>2009-11-13T19:33:25Z</updated>
  <title type="text">Living Code</title>
  <subtitle type="text">Programming for the Fun of It</subtitle>
  <link rel="self" type="application/atom+xml" href="http://livingcode.org/feed" />
  <link rel="alternate" href="http://livingcode.org" />
  <rights type="text">Copyright 2009</rights>
  <generator uri="http://wordpress.org/" version="2.8.6">WordPress</generator>
      <entry>
    <id>http://livingcode.org/?p=143</id>
    <title type="html"><![CDATA[Watershed du jour &#8211; 3D coming of age]]></title>
    <updated>2009-07-26T19:09:25Z</updated>
    <published>2009-07-26T19:09:25Z</published>
    <author>
      <name>Dethe</name>
      <email>delza@livingcode.org</email>
<uri>http://livingcode.org/</uri>    </author>
    <link rel="replies" type="application/atom+xml" href="http://livingcode.org/2009/07/26/watershed-du-jour-3d-coming-of-age/feed" thr:count="1"  />
    <link rel="alternate" href="http://livingcode.org/2009/07/26/watershed-du-jour-3d-coming-of-age" />
    <category scheme="http://livingcode.org" term="Mac" />
    <category scheme="http://livingcode.org" term="Web" />
    <summary type="html"><![CDATA[While software and hardware have made great strides, some things still remain in the realm of specialized software. One way to look at this is, what can you still not do on the web?  I can think of a few things: 3D, sound synthesis, video editing.  I have hopes for all of these, [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2009/07/26/watershed-du-jour-3d-coming-of-age"><![CDATA[<p>While software and hardware have made great strides, some things still remain in the realm of specialized software. One way to look at this is, what can you still <em>not</em> do on the web?  I can think of a few things: 3D, sound synthesis, video editing.  I have hopes for all of these, but 3D in particular looks to be on the edge of a real breakthrough, and not necessarily from where I expected it.</p>
<p>For years I have been tracking X3D, the XML-based 3D specification that is the successor to VRML. I&#8217;ve been watching and working with the open-source <a href="http://freewrl.sourceforge.net/">FreeWRL</a> tool, and it has been making good progress. However, the Age of Plugins appears to be on the decline.  If it isn&#8217;t built-in to the browser (or ubiquitous, like Flash, and I have doubts about the long-term viability of Flash), there is little chance of getting viewers to install a plugin for your media format. That&#8217;s why I&#8217;m excited to see that Firefox is experimenting with a <a href="https://wiki.mozilla.org/Canvas:3D">3D context</a> for the &lt;canvas/&gt; element, which will base its API on <a href="http://www.khronos.org/opengles/">OpenGL ES</a>, and significantly will support import of <a href="http://www.khronos.org/news/permalink/firefox_with_canvas_3d_allows_loading_of_collada_models/">Collada models</a> (presumably Collada Digital Asset Exchange, or .dae files).</p>
<p>But Firefox alone does not make a viable ecosystem.  The other things I have come across recently that have convinced me that Collada models are going to springboard 3D into the hands of ordinary users are that <a href="http://www.spore.com/patch">Spore patch 5</a> (available now for PC, coming soon for Mac) supports exporting creatures (with textures and ready for animation) in Collada format, so you <a href="http://oceanquigley.blogspot.com/2009/07/how-to-export-spore-creatures-to-maya.html">can work with them</a> in the 3D tool of your choice, and that the next major release of Mac OS X, Snow Leopard, will support <a href="http://www.apple.com/macosx/refinements/enhancements-refinements.html">Collada as a built-in file type</a> (scroll down to &#8220;Digital Asset Exchange support&#8221;). Collada has kept pretty quiet, at least in my world, but the support for it is <a href="https://collada.org/mediawiki/index.php/Portal:Products_directory">pretty widespread</a>, including open-source tools such as Blender and OGRE, plus all the usual suspects such as Maya and 3dsMax. Sadly, my editor of choice, Cheetah3D does not yet support it, but I understand they&#8217;re working on it.</p>
<p>I, for one, welcome our new 3D asset exchange overlords. Along with improved user creation tools like Spore, SecondLife, and SketchUp, 3D is almost ready for prime time.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2009/tab-dumping-with-applescript-and-back-to-python</id>
    <title type="html"><![CDATA[Tab Dumping with AppleScript and back to Python]]></title>
    <updated>2009-01-31T20:04:19Z</updated>
    <published>2009-01-31T19:58:31Z</published>
    <author>
      <name>Dethe</name>
      <email>delza@livingcode.org</email>
<uri>http://livingcode.org/</uri>    </author>
    <link rel="replies" type="application/atom+xml" href="http://livingcode.org/2009/01/31/tab-dumping-with-applescript-and-back-to-python/feed" thr:count="4"  />
    <link rel="alternate" href="http://livingcode.org/2009/01/31/tab-dumping-with-applescript-and-back-to-python" />
    <category scheme="http://livingcode.org" term="Mac" />
    <category scheme="http://livingcode.org" term="Projects" />
    <category scheme="http://livingcode.org" term="Python" />
    <category scheme="http://livingcode.org" term="Tutorial" />
    <summary type="html"><![CDATA[
Goal: Iterate through all my (OS X Safari) browser windows and make a list of titles and urls which is then placed in the clipboard ready to be pasted into an email or blog post.
This is an update to Tab Dumping in Safari. That still works well as the basis for extending any Cocoa-based application [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2009/01/31/tab-dumping-with-applescript-and-back-to-python"><![CDATA[<p><img src='http://livingcode.org/wp-content/uploads/2009/01/rock.jpg' alt='Rock' /></p>
<p><strong>Goal:</strong> Iterate through all my (OS X Safari) browser windows and make a list of titles and urls which is then placed in the clipboard ready to be pasted into an email or blog post.</p>
<p>This is an update to <a href="http://livingcode.org/2006/tab-dumping-in-safari">Tab Dumping in Safari</a>. That still works well as the basis for extending any Cocoa-based application at runtime, but it relies on SIMBL, which while it is a great bit of code, essentially is abusing the InputManager interface.  Some developers and users shun such hacks, and at least one Apple application checks for them at startup and warns you from using them.</p>
<p>I have been running the <a href="http://webkit.org/">WebKit</a> nightlies, which are like Safari, but with newer code and features (most importantly to me right now, a Firebug-like developer toolkit).  WebKit warns at startup that if you&#8217;re running extensions (such as SIMBL plugins) it may make the application less stable.  I was running both <a href="http://haoli.dnsalias.com/">Saft</a> and my own tab dumping plugin, and WebKit was crashing a lot.  So I removed those and the crashes went away.  I miss a handful of the Saft extensions (but not having to update it for every Safari point release), and I found I <em>really</em> miss my little tab-dumping tool.</p>
<p>I toyed with the idea of rewriting it as a service, which would then be available from the services menu, but couldn&#8217;t figure out how to access the application&#8217;s windows and tabs from the service.  So I tried looking at Safari&#8217;s scriptable dictionary, using the AppleScript Script Editor.  Long ago, John Gruber had <a href="http://daringfireball.net/2003/05/safaris_unscriptable_tabs">written</a> about the frustration with Safari&#8217;s tabs not being scriptable, but a glance at the scripting dictionary showed me this was no longer the case (and probably hasn&#8217;t been for years, I haven&#8217;t kept track).</p>
<p>I am a complete n00b at AppleScript.  I find the attempt at English-like syntax just confuses (and irritates) me no end.  But what I wanted looked achievable with it, so I armed myself with some examples from Google searches, and Apple&#8217;s intro pages and managed to get what I wanted working.  It may not be the best possible solution (in fact I suspect the string concatenation may be one of the most pessimal methods), but it Works For Me™.</p>
<p>In Script Editor, paste in the following:</p>
<p><code>
<pre>
set url_list to ""
-- change WebKit to Safari if you are not running nightlies
tell application "WebKit"
  set window_list to windows
  repeat with w in window_list
    try
      set tab_list to tabs of w
      repeat with t in tab_list
        set url_list to url_list &#038; name of t &#038; "\n"
        set url_list to url_list &#038; URL of t &#038; "\n\n"
      end repeat
    on error
      -- not all windows have tabs
    end try
  end repeat
  set the clipboard to url_list
end tell
</pre>
<p></code></p>
<p>I had to use AppleScript Utility to add the script menu to my menu bar.  From there it was easy to create script folders that are specific to both WebKit and Safari and save a copy of the script (with the appropriate substitution, see comment in script) into each folder.  Now I can copy the title and URL of all my open tabs onto the clipboard easily again, without any InputManager hacks.</p>
<p>I had some recollection that is a way to do this from Python, so I looked and found <a href="http://appscript.sourceforge.net/">Appscript</a>.  I was able to install this with a simple <code>easy_install appscript</code> and quickly ported most of the applescript to Python.  The only stumbling block was that I couldn&#8217;t find a way to access the clipboard with appscript, and I didn&#8217;t want to have to pull in the PyObjC framework just to write to the clipboard. So I used <code>subprocess</code> to call the command-line <code>pbcopy</code> utility.</p>
<p><code>
<pre>
#!/usr/local/bin/python
from appscript import app
import subprocess
tab_summaries = []
for window in app('WebKit').windows.get():
    try:
        for tab in window.tabs.get():
            name = tab.name.get().encode('utf-8')
            url = tab.URL.get().encode('utf-8')
            tab_summaries.append('%s\n%s' % (name, url))
    except:
        # not all windows have tabs
        pass
clipboard = subprocess.Popen('pbcopy', stdin=subprocess.PIPE)
clipboard.stdin.write('\n\n'.join(tab_summaries))
</pre>
<p></code></p>
<p>The remaining hurdle was simply to put the Python script I&#8217;d written into the same Scripting folder as my AppleScript version. For me this was <code>~/Library/Scripts/Applications/WebKit/</code>. When run from the scripts folder, your usual environment is not inherited, so the <code>#!</code> line must point to the version of Python you are using (and which has Appscript installed). You should also make the script executable.  Adding <code>.py</code> or any other extension is not necessary.</p>
<p>Overall, while I found AppleScript to be very powerful, and not quite as painful as I remembered, I found the Python version (warts and all) to be easier to work with. Combined with the fact that the script folder will run non-Applescript scripts, this opens up new worlds for me.  I have hesitated in the past to write a lot of SIMBL-based plugins, tempting though it may be, because they are hacks, and they run in <em>every</em> Cocoa-based application.  But adding application-specific (or universal) scripts, in Python, is pure, unadulterated goodness.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2008/in-earth-dreams</id>
    <title type="html"><![CDATA[in earth dreams]]></title>
    <updated>2008-11-14T05:43:00Z</updated>
    <published>2008-11-14T05:43:00Z</published>
    <author>
      <name>Dethe</name>
      <email>delza@livingcode.org</email>
<uri>http://livingcode.org/</uri>    </author>
    <link rel="replies" type="application/atom+xml" href="http://livingcode.org/2008/11/13/in-earth-dreams/feed" thr:count="1"  />
    <link rel="alternate" href="http://livingcode.org/2008/11/13/in-earth-dreams" />
    <category scheme="http://livingcode.org" term="Mac" />
    <category scheme="http://livingcode.org" term="Presentations" />
    <category scheme="http://livingcode.org" term="Python" />
    <category scheme="http://livingcode.org" term="Web" />
    <summary type="html"><![CDATA[
This is a collaboration that Daniela and I did together.  Her words and voice, my scripting and adding some titles.  The words to the poem can be found on her site here (or actually, on any page of her site since it is currently in her sidebar). The animation itself was done in [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2008/11/13/in-earth-dreams"><![CDATA[<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/gybpgqwRHso&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/gybpgqwRHso&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>This is a collaboration that <a href="http://strangeplaces.livingcode.org/">Daniela</a> and I did together.  Her words and voice, my scripting and adding some titles.  The words to the poem can be found on her site <a href="http://strangeplaces.livingcode.org/archives/6/in-earth-dreams">here</a> (or actually, on any page of her site since it is currently in her sidebar). The animation itself was done in <a href="http://nodebox.net/">NodeBox</a> (so this example is Mac-only, but it could probably be adapted easily to Processing.</p>
<p><code>
<pre>
from math import radians, sin, cos
from random import seed

POEM = '''
in earth dreams
her limbs 		are all sky
her body		inhabited
by wild birds		and busy
mammals
an endangered 		species
she lost		 her head
where reason 		gives
the impression 		everything is
clear
she motions 	to dance
a rhythm			spins
and turns		attracted
to light
if she had eyes 		I would see
the stars		she holds
dear
then 		there are 		all
the words		she escapes
slips past 		their curved
seashell ears	as they listen
to capture 		her
on the page		 my words
are already	changing her
while she weaves 	gossamer
and soft moss		to hang
in autumn 	woods
'''.split()

size(320,240)
speed(30)

class Vector(object):

    def __init__(self, idx):
        self._starting_angle = self.angle = radians(random(360))
        self.rate = random(0.5,2.5)
        self.distance = sin(radians(idx * 2) + 180) * 100
        self.x = 0
        self.y = 0

    def step(self):
       self.angle = self._starting_angle + FRAME * radians(self.rate)
       self.x = cos(self.angle) * self.distance
       self.y = sin(self.angle) * self.distance
       return self.rate, self.x, self.y

class Word(object):

    index = []

    def __init__(self, idx, word):
		self.red = random()
		self.green  = random(0.4, 0.75)
		self.blue = 0.4
		self.vector = Vector(idx)
		self.word = word
		self.size = 10 + 2 * len(word)
		self.duration = 3 * (len(word) + 2)
		Word.index += [idx] * self.duration

    def step(self, alpha=1.0):
		fill(self.red, self.green, self.blue, alpha)
		rate, x, y = self.vector.step()
		push()
		rotate(rate * FRAME)
		font('Georgia', self.size)
		text(self.word, x, y)
		pop()

def setup():
    global words
    seed(0)
    words = [Word(idx, word) for idx,word in enumerate(POEM)]

def draw():
    translate(WIDTH/2 -50,HEIGHT/2)
    background(1.0, 0.97, 0.86)
    # Add one word at a time, then show all words for 100 frames more
    if FRAME < len(Word.index):
        last = Word.index[FRAME]
        for word in words[:last]:
            word.step()
    # Now fade out and have blank screen for titles
    elif FRAME < len(Word.index) + 100:
        alpha = 1.0 - 0.01 * (FRAME - len(Word.index))
        for word in words:
            word.step(alpha)
</pre>
<p></code></p>
<p>I used iMovie '08 to mix the voice and animation and to add the titles.  I wasn't very happy with the changes to iMovie, I found the earlier versions were much more flexible and easy to use.  On the other hand, I tried Norrkross Movie, that I actually had to buy, and was unable to do it at all.  Next time I will just add the titles in NodeBox and only use iMovie to add the soundtrack.</p>
<p>My Python script could probably be cleaned up too.  This was what I had after many iterations and experiments to get the timing, color, and rotation where we were both happy with it.</p>
<p>This was my first time uploading to YouTube and the resulting movie is very jumpy, in the original movie I uploaded was not.  If anyone has suggestions how to avoid that (whether pre-processing or a better movie hosting service), please let me know in the comments.  Overall I was happy with how it turned out and I'm looking forward to our next collaboration.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2008/the-apple-tablet</id>
    <title type="html"><![CDATA[The Apple Tablet]]></title>
    <updated>2008-01-25T20:52:02Z</updated>
    <published>2007-01-23T08:00:00Z</published>
    <author>
      <name>Dethe</name>
      <email>delza@livingcode.org</email>
<uri>http://livingcode.org/</uri>    </author>
    <link rel="replies" type="application/atom+xml" href="http://livingcode.org/2007/01/23/the-apple-tablet/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2007/01/23/the-apple-tablet" />
    <category scheme="http://livingcode.org" term="Mac" />
    <category scheme="http://livingcode.org" term="News" />
    <summary type="html"><![CDATA[So last year I got tired of waiting for Apple to come out with a tablet computer (which Jobs will never purposely do, even though Ink Services are built right into OS X). I also got sentimental for the Newton that I outlined my thesis on, lo these many years ago. My sentimental reflections were [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2007/01/23/the-apple-tablet"><![CDATA[<p>So last year I got tired of waiting for Apple to come out with a tablet computer (which Jobs will never purposely do, even though Ink Services are built right into OS X). I also got sentimental for the Newton that I outlined my thesis on, lo these many years ago. My sentimental reflections were enhanced by this article by <a href="http://www.makezine.com/blog/archive/2005/12/make_your_own_100_laptop.html">Phillip Torrone</a> on building a sub-$100 laptop out of an old eMate from eBay. I had never used eBay, so as an experiment (one of two: I also picked up a copy of the long out of print Avalon Hill board game Dune) I found myself a Newton MessagePad 110. Which, by and large, does nothing.It boots OK, but I&#8217;m reluctant to use it for anything besides a conversation piece unless I can get my data back off of it (and it would be nice to load new apps on it as well). Since none of my Macs have AppleTalk serial ports, I&#8217;m not sure how to get the Newton talking to them. I&#8217;ve checked the Newton sites, but what instructions there are appear to be dated and complex (perhaps it just is complex, I&#8217;m not ruling that out). So, LazyWeb, I invoke thee! What is the best way to get an OS X box talking with a Newton?My email is below. I&#8217;ll quote from (and credit) responses unless requested not to. Any help in reifying my nostalgia is appreciated.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2006/mac-os-x-software-favorites-part-one-basics</id>
    <title type="html"><![CDATA[Mac OS X Software Favorites Part One: Basics]]></title>
    <updated>2008-01-25T20:53:10Z</updated>
    <published>2006-09-11T07:12:48Z</published>
    <author>
      <name>Dethe</name>
      <email>delza@livingcode.org</email>
<uri>http://livingcode.org/</uri>    </author>
    <link rel="replies" type="application/atom+xml" href="http://livingcode.org/2006/09/10/mac-os-x-software-favorites-part-one-basics/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2006/09/10/mac-os-x-software-favorites-part-one-basics" />
    <category scheme="http://livingcode.org" term="Mac" />
    <summary type="html"><![CDATA[Yesterday was my last day at my job for the past five years, and with it I left my Macbook Pro (it was a nice tool, but they own it). Coincidentally, I&#8217;m now setting up my new Macbook. Since I know several other people who are setting up new Macs, I thought I&#8217;d give my [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2006/09/10/mac-os-x-software-favorites-part-one-basics"><![CDATA[<p>Yesterday was my last day at my job for the past five years, and with it I left my Macbook Pro (it was a nice tool, but they own it). Coincidentally, I&#8217;m now setting up my new Macbook. Since I know several other people who are setting up new Macs, I thought I&#8217;d give my thoughts on some of the best software available. Since that&#8217;s a big topic, I&#8217;m going to break it up into several posts, starting with the basics: Application Launcher, Text Editor, Web Browser, Newsreader</p>
<h3>Macbook vs. Macbook Pro</h3>
<p>Before diving into the software, just a note on the hardware. I&#8217;m going with a black Macbook for several reasons. First, it looks really cool, and I can&#8217;t deny that appeals to me. Second, it is somewhat smaller and lighter than the smallest Macbook Pros, and since I carry my laptop to and from work every day by foot or bicycle, that matters (I&#8217;m getting two power bricks so I can leave one in each location to save even more weight). Third, the wifi reception is much better. Encasing an antenna in plastic appears to work better than encasing it in aluminum, go figure. Macbook Pros are more powerful, but only a bit, and mainly for heavy-duty 3D, which isn&#8217;t really my thing. We&#8217;ll see how much this matters in practice. White vs. Black Macbook: the white ones are rumored to stain really easily, plus did I mention that the black ones look really freaking cool? The Macbook is cheaper than the Macbook Pro, but that&#8217;s not a big factor in why I&#8217;m choosing it (since once again, work will own it, just a different work&#8211;more on that later). The Macbook also gets better battery life, is slightly less crotch-scaldingly hot, and so far I&#8217;m liking the keyboard a lot.</p>
<h3>Application Launcher: Quicksilver</h3>
<p>I used to use <a href="http://ranchero.com/tigerlaunch/">TigerLaunch</a> (free, open source), and still do on other Macs in the family, but once you&#8217;ve tried <a href="http://quicksilver.blacktree.com/">Quicksilver </a>(free, beta) there&#8217;s no going back. I&#8217;m still working on becoming a <a href="http://theappleblog.com/2006/02/14/quicksilver-tutorials-round-up/">Quicksilver power user</a>, but just the app-launching and file-searching facility is worth using this tool for. TigerLaunch is great for its simplicity, and Quicksilver is great for making you wonder how you ever got along without it. I&#8217;ve heard wonderful things about <a href="http://www.cocoatech.com/">PathFinder</a> ($34.95USD) and keep meaning to try it, but haven&#8217;t gotten to it yet. First I need to learn how to write Quicksilver plugins in Python&#8230;</p>
<h3>Editor: TextMate</h3>
<p>I used to use Pico on Unix and BBEdit Lite on Mac OS 7, back in the day. I couldn&#8217;t stand either vi or emacs. I wanted a T-shirt that read, &#8220;I&#8217;d rather die than use vi.&#8221; Then I worked at a company where the only editor you could count on being installed was vi and I began to get its keystrokes etched into the memory of my fingers. I&#8217;m not even that good at it, but sometimes vi can be so damn fast. Of course, I don&#8217;t use classic vi, but a nice modern <a href="http://macvim.org/OSX/index.php">Vim</a> (free, open source). I&#8217;ve tried to switch back to Mac editors a few times: <a href="http://www.barebones.com/products/textwrangler/">TextWrangler</a> (free, the OS X incarnation of BBEdit Lite), <a href="http://www.codingmonkeys.de/subethaedit/">SubEthaEdit</a> ($35USD, great for collaborative editing), <a href="http://smultron.sourceforge.net/">Smultron</a> (free, open source). These are all great editors, but each one lacked something that kept me from switching over completely. I had been hearing about <a href="http://macromates.com/">TextMate</a> (€39EUR) for some time, but had trouble getting excited over a commercial editor when there were so many free ones to choose from. I finally gave it a serious try and I&#8217;m hooked. It still isn&#8217;t as easy to search as vi is, but the way it can be expanded on with plugins and the general fit and feel are great.</p>
<h3>Browser: Safari + Saft</h3>
<p>Safari is shaping up to be a great browser, fast and powerful. There are a few details that are missing, but nearly all of them are satisfied with the <a href="http://haoli.dnsalias.com/">Saft</a> ($12USD) extension, which provides great ad filtering, improves the way windows and tabs are handled, and gives shortcuts for accessing search sites from the address bar, among many other features. Safari itself takes two kinds of plugins, <a href="http://developer.apple.com/technotes/tn/tn2020.html">Netscape-style</a> plugins and <a href="http://developer.apple.com/documentation/InternetWeb/Conceptual/WebKit_PluginProgTopic/index.html">WebKit</a> plugins. Unfortunately, these are only triggered when their target mime types are loaded, so they can&#8217;t readily be used to extend the way the application itself works. So all of the Safari extensions that I&#8217;m aware of are implemented as InputManagers (see my post on <a href="http://livingcode.org/entry/tab_dumping_in_safari.html">TabDump</a> for more on InputManagers). My TabDump extension is the other extension that I find indispensable, which is why I wrote it, but more important than TabDump itself is the example it gives for writing your own extensions to Safari or any other (Cocoa) application. That&#8217;s what I love about OS X, you can get into it and take control of your own machine, make it your own. You can do that with Linux, of course, but the high-level of Cocoa applications make a huge difference. Back to browsers, I also recommend the <a href="http://www.flip4mac.com/wmv_download.htm">Flip4Mac</a> plugin, to allow your browser to play Windows Media files directly. Finally, I also keep <a href="http://www.mozilla.com/firefox/">Firefox</a> (free, open-source) around for its advanced features. It&#8217;s not my main browser, but it has features that show where the browser (and all applications) will be going in the future. I may have to do a separate post just about the cool features coming in <a href="http://wiki.mozilla.org/Firefox2">Firefox 2</a> (currently in beta) and <a href="http://wiki.mozilla.org/Firefox3">Firefox 3</a>. Other good browsers to keep around for testing are <a href="http://www.caminobrowser.org/">Camino</a> (the Firefox engine with a Cocoa UI) and <a href="http://www.opera.com/">Opera</a> (free). For more Safari plugins and extensions than you could ever use, check the listings at <a href="http://pimpmysafari.com/">Pimp My Safari</a>.</p>
<h3>Newsreader: NetNewsWire</h3>
<p>I realize that Safari now supports RSS feeds in some fashion, but it really isn&#8217;t a newsreader. I&#8217;m not crazy about trying to put every possible application into the browser. If you have to work betwwen Windows, OS X, and Linux, or some combination thereof, then things like <a href="http://mail.google.com/mail/">GMail</a> and <a href="http://www.bloglines.com/">Bloglines</a> can be a godsend, otherwise you&#8217;re probably better off with a dedicated desktop app. <a href="http://www.newsgator.com/NGOLProduct.aspx?ProdID=NetNewsWire">NetNewsWire</a> ($29.95USD) is a desktop app that is so good, it was the most popular newsreader (by far) for a long time, even though it only ran on OS X. Since being acquired by NewsGator, it&#8217;s still as good, but now synchronizes your feeds with the NewsGator site, so you get the best of both worlds: a top-notch desktop app, and a webapp that stays sychronized with it. I have a feeling that in the near future, nearly all applications will work this way. And if you can&#8217;t afford the price, they still offer NetNewsWire Lite for free (and I happily used it for a couple of years before upgrading).</p>
<h3>Mail: Mail.app</h3>
<p>Apple gives you a decent email program with OS X, nothing too fancy. It keeps getting better (mostly) with each new release. There has been some complaints about Mail.app in OS 10.4 changing to a proprietary format (which they did in order to integrate with Spotlight) and I&#8217;ll have more to say about that in a future post. I have tried using Gmail (when I was mostly using Windows at work) and <a href="http://www.mozilla.com/thunderbird/">Thunderbird</a> (free, open-source), and coming back to Mail.app is like a breath of fresh air. For nearly everything I do, Mail.app is better. It&#8217;s far from perfect, and sites like HawkWings specialize in plugins and extensions for Mail.app, but it sure works for me. I do wonder why email programs are still so hard to get right. Since email is basically the oldest use of the internet (and networks generally), and the original &#8220;killer app,&#8221; if we don&#8217;t know how to do email yet, what hope do we have for anything that&#8217;s actually complicated? Of course, perhaps because they have been around for so long, choice of email programs tends to be very personal, so all I can say is, Mail.app works for me. I also recommend the <a href="http://home.cc.gatech.edu/eaganj/MailApp">AttachmentScannerPlugin</a> by James Eagan, who also provides a <a href="http://www.bazza.com/~eaganj/weblog/2006/03/29/demystifying-mail-app-plugins/">tutorial on writing plugins for Mail.app</a> which is generally applicable to extending Cocoa programs and using their undocumented private APIs. Also, he uses Python and PyObjC to write the plugin, which makes me happy.</p>
<p>Regular reader(s) were probably wondering how I was going to get that plug for Python and PyObjC in there, eh?</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2003/happiness-is-a-warm-tiger</id>
    <title type="html"><![CDATA[Happiness is a Warm Tiger]]></title>
    <updated>2008-01-26T05:58:21Z</updated>
    <published>2005-05-04T05:51:02Z</published>
    <author>
      <name>Dethe</name>
      <email>delza@livingcode.org</email>
<uri>http://livingcode.org/</uri>    </author>
    <link rel="replies" type="application/atom+xml" href="http://livingcode.org/2005/05/03/happiness-is-a-warm-tiger/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2005/05/03/happiness-is-a-warm-tiger" />
    <category scheme="http://livingcode.org" term="Mac" />
    <summary type="html"><![CDATA[My copy of Mac OS 10.4 arrived Friday, right on schedule. I spent the weekend backing up my laptop, doing a clean install, and then restoring my data, which also fixed the problem I&#8217;ve been having where applications take a really long time to launch. No problems so far and performance is noticeably faster. You [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2005/05/03/happiness-is-a-warm-tiger"><![CDATA[<p>My copy of Mac OS 10.4 arrived Friday, right on schedule. I spent the weekend backing up my laptop, doing a clean install, and then restoring my data, which also fixed the problem I&#8217;ve been having where applications take a really long time to launch. No problems so far and performance is noticeably faster. You gotta love an OS where each update makes your existing hardware faster.</p>
<p>First impressions: Spotlight searching really is as fast as they claim, Dashboard is neat in a gee-whiz sort of way, but I&#8217;m not sure how much I&#8217;ll actually use it. The built-in dictionary and thesaurus are welcome additions. I&#8217;m sure with time I will come to use smart folders in both the Finder and Mail. But for me the real juice in this version is underneath the hood in the development tools.</p>
<p>I&#8217;ve had a few secret hopes for Tiger, for things which have not been announced, but might be slipped under the door. Three of them were: NSOutlineView gaining support for varying row height (to make it easier to write applications like OmniOutline), improved Cocoa support for QuickTime, and being able to round-trip Nibs to text format and back via nibtool. Well, two out of three ain&#8217;t bad. The NSOutline now supports row height via it&#8217;s delegate method <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSOutlineView.html#//apple_ref/doc/uid/20000110-BABHDHAE%22">heightOfRow:ofItem:</a>, the <a href="http://developer.apple.com/documentation/QuickTime/Reference/QTCocoaObjCKit/index.html#//apple_ref/doc/uid/TP40001164">QTKit</a> framework provides excellent support for QuickTime media from Cocoa (and thus from PyObjC), but alas, nibs cannot be created from text input via <a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/nibtool.1.html">nibtool</a> (or any other tool that I&#8217;m aware of), although the nibtool man page does at least list this deficiency as a known bug.</p>
<p>But there is more good news in the <a href="http://developer.apple.com/documentation/GraphicsImaging/Reference/CoreImagingRef/index.html">Core Image</a>, <a href="http://developer.apple.com/documentation/MusicAudio/Reference/CoreAudio/book_intro/chapter_1_section_1.html">Core Audio</a>, and <a href="http://developer.apple.com/documentation/GraphicsImaging/Reference/CoreImagingRef/index.html">Core Data</a> frameworks. Core Image gives fast, powerful graphic processing and pipelining tools for both still images and video. Core Audio does the same for sound. And while Mac development in the Model-View-Controller (MVC) has been supported via Interface Builder (View), NSArrayController and NSObjectController (Controller), now with Core Data the Model portion is fully supported as well. Bill Bumgarner has a welcome <a href="http://www.pycs.net/bbum/2005/5/1/">example</a> on his blog of how to use CoreData from Python.</p>
<p>But wait, there&#8217;s more! There&#8217;s an <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSTreeController.html#//apple_ref/occ/cl/NSTreeController">NSTreeController</a> to go along with the NSArrayController and friends. There are hooks and documentation for many more of the Apple-supplied applications, including the new <a href="http://developer.apple.com/documentation/Cocoa/Reference/SyncServicesRef_ObjC/index.html">Sync Services</a>. And PyObjC now has wrappers for Core Data, Automator, XGrid, and Sync Services. And that&#8217;s not to mention the improved WebKit, new features of NSTextView, and much more. It&#8217;s a great time to be a Mac developer, and being able to do all this from Python really ices the cake for me.</p>
]]></content>
        </entry>
  </feed>
