<?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/2008/meme-du-jour</id>
    <title type="html"><![CDATA[Meme du jour]]></title>
    <updated>2008-04-11T16:05:39Z</updated>
    <published>2008-04-11T04:49:10Z</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/04/10/meme-du-jour/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2008/04/10/meme-du-jour" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[Just for fun, and because I&#8217;m trying out two things:

Using Ecto for posting again
Blogging more often

Here are my results from the latest craze:



$ history&#124;awk '{a[$2]++} END{for(i in a){printf "%5d\t%s\n",a[i],i}}'&#124;sort -rn&#124;head
139 ls
87 cd
54 python
43 /usr/bin/python
38 less
21 vim
16 clear
12 mate
11 rm
10 ssh



The first python is the one I built from source so I can include it in [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2008/04/10/meme-du-jour"><![CDATA[<p>Just for fun, and because I&#8217;m trying out two things:</p>
<ol>
<li>Using Ecto for posting again</li>
<li>Blogging more often</li>
</ol>
<p>Here are my results from the latest craze:</p>
<pre>
<code>
<pre>
$ history|awk '{a[$2]++} END{for(i in a){printf "%5d\t%s\n",a[i],i}}'|sort -rn|head
139 ls
87 cd
54 python
43 /usr/bin/python
38 less
21 vim
16 clear
12 mate
11 rm
10 ssh
</pre>
<p></code>
</pre>
<p>The first python is the one I built from source so I can include it in applications packaged with py2app, the second is the built-in python for Leopard. Both are version 2.5. The mate program is used to open files in TextMate from the command line.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2008/wordpress-pain</id>
    <title type="html"><![CDATA[Wordpress pain]]></title>
    <updated>2008-03-20T05:21:04Z</updated>
    <published>2008-03-16T06:19: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/2008/03/15/wordpress-pain/feed" thr:count="1"  />
    <link rel="alternate" href="http://livingcode.org/2008/03/15/wordpress-pain" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[Well, I&#8217;ve been working off and on for a few days on a Processing applet.  The only reason I like Processing better than NodeBox is because I can embed the results in an applet on my web site.  At least, I could if WordPress didn&#8217;t keep stripping out the embedding markup.  
[Update: [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2008/03/15/wordpress-pain"><![CDATA[<p>Well, I&#8217;ve been working off and on for a few days on a Processing applet.  The only reason I like Processing better than NodeBox is because I can embed the results in an applet on my web site.  At least, I could if WordPress didn&#8217;t keep stripping out the embedding markup.  </p>
<p>[Update: I did finally figure out how to disable the auto-conversion.  What a PITA.  Now I just have to figure out what I've broken by doing that.]</p>
<p>Frustrations like this are why I was writing my own blogging software.  The main holdup on writing my own blogging software was the fact that it is damn difficult to get anything but PHP to run persistently on Dreamhost.  Actually, even WordPress runs as a CGI, so maybe its hard to run PHP persistently too.  Anyway, it would take a lot of effort to move all my sites to a host that lets me run WSGI apps, but at moments like this, I think it would be worth it.  WordPress has sucked yet more hours of my life away.</p>
<p>Going to bed, sick with loathing for WordPress. Again.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2008/apologies</id>
    <title type="html"><![CDATA[Apologies]]></title>
    <updated>2008-02-23T06:35:09Z</updated>
    <published>2008-02-22T05:18:58Z</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/02/21/apologies/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2008/02/21/apologies" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[
I wanted to apologize for spamming Planet Python (and anyone else that happens to subscribe) with old posts recently.  After spending many of my free hours for the past year noodling around with my weblog software (and the myriad of problems getting anything to run persistently on Dreamhost), I finally gave up and switched [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2008/02/21/apologies"><![CDATA[<p><a href="http://livingcode.org/wp-content/uploads/2008/02/picture-2.png" title="Mandala"><img src="http://livingcode.org/wp-content/uploads/2008/02/picture-2.png" alt="Mandala" /></a></p>
<p>I wanted to apologize for spamming Planet Python (and anyone else that happens to subscribe) with old posts recently.  After spending many of my free hours for the past year noodling around with my weblog software (and the myriad of problems getting anything to run persistently on Dreamhost), I finally gave up and switched to WordPress.  I&#8217;ve imported my old blogs for the sake of continuity (from Blogger and my own custom weblog, but not going back to Manila yet), and mapped the old URLs with redirects, so things should be fairly transparent to the casual observer.</p>
<p>A couple of good things came from my time wrestling with my own software. I learned a lot more about WSGI. I got to evaluate TurboGears, Django, web.py, Pylons, and raw WSGI. I learned more about Atom syndication and AtomPub. And while I was doing all that, WordPress got semi-decent Atom 1.0 support and also began to support tagging: two of the reasons I was rolling my own.  It&#8217;s still dog-slow, but I think that may have more to do with how DreamHost is running it (as a CGI) than WordPress itself.  And since I&#8217;m running several other WordPress blogs for family members and friends, at least I only have one system to fight with rather than two.</p>
<p>Another good thing that came out of switching to WordPress, and one of the main reasons I had ripped my old blogging system apart to rebuild it it as a server-side tool, is that my blog supports comments now. I have spent the past year doing a bit more than just twiddling with blogging software, and I hope to have some of my more interesting experiments and some tutorials to post soon.  Let me know what you think of it.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2006/tab-dumping-in-safari</id>
    <title type="html"><![CDATA[Tab Dumping in Safari]]></title>
    <updated>2008-01-17T07:30:28Z</updated>
    <published>2006-08-31T06:04:27Z</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/08/30/tab-dumping-in-safari/feed" thr:count="2"  />
    <link rel="alternate" href="http://livingcode.org/2006/08/30/tab-dumping-in-safari" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[The Problem
I first saw the term &#8220;tab dump&#8221; on Dori Smith&#8217;s blog, but I immediately recognized the concept. I keep Safari running all the time and with the help of Hao Li&#8217;s wonderful extension Saft I keep everything in tabs in one window. Among its many features, Saft will let you consolidate your windows into [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2006/08/30/tab-dumping-in-safari"><![CDATA[<h3>The Problem</h3>
<p>I first saw the term &#8220;tab dump&#8221; on Dori Smith&#8217;s <a href="http://www.backupbrain.com/2006_04_16_archive.html">blog</a>, but I immediately recognized the concept. I keep Safari running all the time and with the help of Hao Li&#8217;s wonderful extension <a href="http://livingcode.org/entry/li.dnsalias.com/Saft/">Saft</a> I keep everything in tabs in one window. Among its many features, Saft will let you consolidate your windows into tabs of one window, and it can save the tabs you have open when you close (or crash) Safari, and re-open them automatically when you start Safari again. What it doesn&#8217;t do is give you a list of all the tabs you have open in text format, suitable for blog or email. I don&#8217;t currently put tag dumps on the blog because a) I&#8217;d feel guilty doing that without adding at least a short comment for each link, which would take too much time, and b) because this isn&#8217;t really a link blog, more a place for me to bash out example code and tutorials. At least, that&#8217;s how I think of it.</p>
<p>I do however, find Safari teetering on the brink of being unfunctionally slow because I have so many tabs open, and often they&#8217;re only open because I want to remember to do something with them later, or come back to them, or some other reminder-type function. So I send myself a tab dump on a more-or-less daily basis. Firefox has tools to help you do this, but I haven&#8217;t seen anything for Safari, possibly because you can&#8217;t really do it with a Safari plugin, but need to use an InputManager, which is fairly deep magic, and basically a hack, an abuse of the system.</p>
<p>On the other hand, I couldn&#8217;t keep using Safari if it wasn&#8217;t for Saft, and Saft is an InputManager. Another tool for blocking ads and such (which Saft also does) is <a href="http://www.culater.net/software/PithHelmet/PithHelmet.php">PithHelmet</a>, but the interesting thing to me about PithHelmet isn&#8217;t that it is a popular ad blocker, but that the Mike Solomon (who wrote PithHelmet) decided to not just make an InputManager, but to make <em>the only InputManager you&#8217;ll ever need</em>. You see, PithHelmet itself is not an InputManager, it is a plugin for <a href="http://www.culater.net/software/SIMBL/SIMBL.php">SIMBL</a> (also by Solomon), which is an InputManager that loads plugins based on the application(s) they claim to support. InputManagers get loaded by <em>every</em> application (Cocoa apps, at least), so you have to be careful you&#8217;re in the app you want to modify, and take steps not to break things. SIMBL takes care of the nasty business of being a well-behaved system hack, and your code can assume it is in the right app, because it doesn&#8217;t get loaded otherwise.</p>
<h3>The Goal</h3>
<p>Once I figured out that the only way I was going to get Tab Dumping behaviour into Safari (because Safari tabs don&#8217;t play well with Javascript, that turned out to be a dead-end), I decided to try writing an InputManager in Python. SIMBL is open-source, so at first I was looking at the code to see what I need to do to create an InputManager (remember, this is a hack, so Apple doesn&#8217;t document it very well). I also read Mike&#8217;s essay <a href="http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering">Armchair Guide To Cocoa Reverse Engineering</a>. What I decided was that, rather than recreate the functionality in SIMBL using Python, I would just create a SIMBL plugin in Python.</p>
<p>Getting started wasn&#8217;t too bad, but I found one issue in the above essay that stumped me for awhile. Mike recommends you put your initialization code into a class method <span class="code">load()</span> which gets called after your class is loaded. I don&#8217;t know if it is artifact of using PyObjC or what, but my <span class="code">load()</span> method was never getting called. What I did instead was to run the command-line utility <span class="code">class-dump</span> on another SIMBL plugin to see what they were doing. They were using the class method <span class="code">initialize()</span> rather than load and when I switched to that things started working, where by &#8220;things&#8221; I mean, &#8220;I could print to the console to see that my class had loaded.&#8221;</p>
<h3>The Solution</h3>
<p>The next step was to actually do something once I had my code loading into Safari. The tab behaviour of Safari isn&#8217;t part of WebKit, so it isn&#8217;t documented anywhere. Once again, I used the handy <span class="code">class-dump </span>utility. This is a fabulous tool which will read any Cocoa library, bundle, or application and produce a pseudo-header file showing all the objects and methods defined. I still had to try a few different paths to get to the tab information I wanted, but it was pretty easy, armed as I was with Python and the output of <span class="code">class-dump</span>. Here is the result:</p>
<pre>import objc</pre>
<pre>from Foundation import *</pre>
<pre>from AppKit import *</pre>
<pre>class TabDump(NSObject):</pre>
<pre>    # We will retain a pointer to the plugin to prevent it</pre>
<pre>    # being garbage-collected</pre>
<pre>    plugin = None</pre>
<pre>    @classmethod</pre>
<pre>    # the following is not strictly necessary, but we only</pre>
<pre>    # need one instance of our object</pre>
<pre>    def sharedInstance(cls):</pre>
<pre>        if not cls.plugin:</pre>
<pre>            cls.plugin = cls.alloc().init()</pre>
<pre>        return cls.plugin</pre>
<pre>    @classmethod</pre>
<pre>    def initialize(cls):</pre>
<pre>        app = NSApp()</pre>
<pre>        menu = app.windowsMenu()</pre>
<pre>        cls.item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(</pre>
<pre>            'Dump tabs to clipboard',</pre>
<pre>             'tabdump:',</pre>
<pre>             '')</pre>
<pre>        # should be after "Previous Tab" and "Next Tab"</pre>
<pre>        menu.insertItem_atIndex_(cls.item, 6)</pre>
<pre>        cls.item.setTarget_(cls.sharedInstance())</pre>
<pre>    def tabdump_(self, source):</pre>
<pre>        output = []</pre>
<pre>        app = NSApp()</pre>
<pre>        for window in app.windows():</pre>
<pre>            if window.className() == 'BrowserWindow':</pre>
<pre>                controller = window.windowController()</pre>
<pre>                for browserWebView in controller.orderedTabs():</pre>
<pre>                    output.append(browserWebView.mainFrameTitle().encode('utf8'))</pre>
<pre>                    output.append(browserWebView.mainFrameURL().encode('utf8'))</pre>
<pre>                    output.append('')</pre>
<pre>        self.copyToPasteboard_('\n'.join(output))</pre>
<pre>    def copyToPasteboard_(self, string):</pre>
<pre>        pasteboard = NSPasteboard.generalPasteboard()</pre>
<pre>        pasteboard.declareTypes_owner_([NSStringPboardType], self)</pre>
<pre>        pasteboard.setString_forType_(string, NSStringPboardType)</pre>
<p>As you can see, on my class being initialized, I create a new menu item and insert it into the Windows menu. This could be more robust, by testing menu item names to make sure I&#8217;m in the right place, but it works for me, and simple code is more maintainable code. I create an instance of my object and make it the target of the menu item. Pretty basic stuff.</p>
<p>When the tabdump method is called (by selecting the menu item in Safari), it walks through Safari&#8217;s window objects (of which there are many) until it finds browser windows, then it extracts the tabbed views from the browser windows to get the titles and URLs involved. When it has collected all the title/URL pairs, it turns it into a big string and puts the string on the pasteboard. Here is where we could be a lot fancier. I&#8217;m just putting title/URL pairs, separated by newlines in plain text, because that&#8217;s how I mail them to myself. You could easily create Markdown links or any other format here. You could turn them into HTML and put them on the Pasteboard that way. There&#8217;s a lot you can do, and the Firefox tool I used to use to do this offered so many options that I was never sure what most of them actually did. Here you can customize the code to do exactly what you need, and keep it simple.</p>
<h3>Building the plugin</h3>
<p>I haven&#8217;t tested this with multiple windows, or with a window with only one tab. It might work, might not. I don&#8217;t plan on using it that way, and if I do, it&#8217;s easy enough to fix. Now, there is one more thing you&#8217;ll need, which is the <span class="code">setup.py</span> script to build it. Assuming you&#8217;ve saved the above code as <span class="code">TabDump.py</span>, the following script should be what you need:</p>
<pre>'''</pre>
<pre>    Minimalist build file for TabDump.py</pre>
<pre>    To build run 'python setup.py py2app' on the command line</pre>
<pre>'''</pre>
<pre>from distutils.core import setup</pre>
<pre>import py2app</pre>
<pre>plist = dict(</pre>
<pre>    NSPrincipalClass='TabDump',</pre>
<pre>    CFBundleName='TabDump',</pre>
<pre>    SIMBLTargetApplications=[</pre>
<pre>        dict(</pre>
<pre>            BundleIdentifier='com.apple.Safari',</pre>
<pre>            MinBundleVersion='312',</pre>
<pre>            MaxBundleVersion='420')],</pre>
<pre>)</pre>
<pre>setup(</pre>
<pre>    plugin=['TabDump.py'],</pre>
<pre>    options=dict(py2app=dict(</pre>
<pre>        extension='.bundle',</pre>
<pre>        plist=plist,</pre>
<pre>    )),</pre>
<pre>)</pre>
<p>In the above file, <span class="code">MinBundleVersion</span> and <span class="code">MaxBundleVersion</span> can keep your code from being loaded if an untested version of the application is running. I have more-or-less dummy values there, don&#8217;t treat them as the right thing to do. The <span class="code">SIMBLTargetApplications</span> key holds a list, so if you want your code to load in other applications, add more dictionaries to the list.</p>
<p>Also note that you can build your bundle with python <span class="code">setup.py py2app -A</span> to create a development version (can&#8217;t ship it that way) that is all symlinks, so you can edit TabDump.py to make changes without having to rebuild the plugin. If you modify the <span class="code">MinBundleVersion</span> or <span class="code">MaxBundleVersion</span> you will have to rebuild to regenerate the property list (or move the property list to be an external file rather than generating it in setup.py), but that should be an infrequent operation. More importantly, you can put a symlink to your bundle in your <span class="code">~/Library/Application Support/SIMBL/Plugins/</span> directory. Then you can make changes to the python code and test it by simply restarting Safari. <strong>WARNING:</strong> If you have a syntax error in your file, Safari will most likely hang on restart. Just force quit it and check your console for the error to fix.</p>
<h3>The Promise</h3>
<p>Now, if you&#8217;ve followed along with me so far, I&#8217;d like to point out a few things that are <em>really freaking cool</em> about this. Item the first: You now have Python running in Safari. Can you think of anything else you&#8217;d like it to do while you&#8217;re there? I bet you can. Item the second: You can do this in any Cocoa-based application just as easily. Problems in Mail.app? Frustrated by iChat? Just fix it. Take control of your own applications! Make the computer work for you, not the other way around. Item the third: dump-classes gives you the keys to the kingdom. Seriously, the combination of being able to embed Python and get a listing of the objects and methods at will is so powerful that when I got TabDump working late last night and realized what I&#8217;d just done (i.e., these three things), I was barely able to get to sleep after that. The possibilities are endless.</p>
<p>If you use this and do something cool with it, please drop me a line and tell me about it. I&#8217;m really looking forward to hearing about what kind of cool ways we can push our existing applications.</p>
<h3>Correction [2006-08-30]</h3>
<p>The <span class="code">class-dump</span> utility rocks, and you should add it to your arsenal of Cocoa tools, along with Python and PyObjC. Since I&#8217;ve found it it has already become indispensable for examining existing applications that I want to, er, adjust. Here&#8217;s what I&#8217;ve learned so far.</p>
<p>First, I want to update my previous post to talk a little bit more about the command-line utility <span class="code">class-dump</span>. This is a fine tool that lets you introspect a Cocoa bundle (plugin, library, or application) and prints out a header file describing all the objects and methods in that bundle. I didn&#8217;t mention where to get it, and at BarCamp this weekend I gave some mis-information by telling people it came with Apple&#8217;s developer tools, which is not true. I assumed that&#8217;s where it came from, because I didn&#8217;t remember hearing of it before reading Mike Solomon&#8217;s <a href="http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering">Armchair Guide to Cocoa Reverse Engineering</a>, which refers to <span class="code">classdump</span> without any explanation of where to get it. I tried it, found <span class="code">class-dump</span> worked (tab-completion is your friend), and assumed it came with my system, when in fact I had installed it earlier after reading about it on another blog (I&#8217;m afraid I don&#8217;t remember where) meaning to try it out, then forgotten about it. So it was there, waiting for me, when I discovered a need for it.</p>
<p>So the truth is, <a href="http://www.codethecode.com/Projects/class-dump/">class-dump</a> is a utility written by Steve Nygard. He says it provides the same output as the developer tools command <span class="code">otool -ov</span>, but formatted as a header file. Besides the basic output it can also do various kinds of filtering, sorting, and formatting.<br />
So this is my Tool of the Week (and then some): <span class="code">class-dump</span>. Use it, love it, thank Steve.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2006/pastels</id>
    <title type="html"><![CDATA[Pastels]]></title>
    <updated>2008-01-21T04:43:10Z</updated>
    <published>2006-08-20T02:37:58Z</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/08/19/pastels/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2006/08/19/pastels" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[[Update: Thanks to Blake Winton for pointing out that the project page link to the Pastels download was broken, fixed now. Also added a link to the project page.]
Pastels is an example project for creating an OS X screensaver in Python using PyObjC. By extension it could be used as an example for building nearly [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2006/08/19/pastels"><![CDATA[<p>[Update: Thanks to Blake Winton for pointing out that the project page link to the Pastels download was broken, fixed now. Also added a link to the project page.]</p>
<p>Pastels is an example project for creating an OS X screensaver in Python using PyObjC. By extension it could be used as an example for building nearly any plugin or bundle for OS X. It started when I had an idea for drawing a simple squiggle, over and over, while cycling the colours and moving the squiggle around. I was very pleased with how it turned out.</p>
<p>Project page: <a href="http://livingcode.org/project/pastels/">http://livingcode.org/project/pastels/</a></p>
<p>It&#8217;s also my first attempt at hosting an open-source project at Google with their new hosting program. If it works out well I will add more of my projects there, which will save me trying to set up and configure Subversion on Dreamhost for public access (probably not difficult, but one more thing I don&#8217;t have to do means more time for writing example code and tutorials).</p>
<p>I&#8217;m working on the tutorial text to go along with this project, so ask any questions you have and I&#8217;ll try to get to them in the tutorial.</p>
<p>If you are seeing this on my site (as opposed to the Atom feed), there are some changes I&#8217;m making to the site that I&#8217;d like to point out. I&#8217;ve added pages for projects and mini-projects which use the same stylesheet and includes as the rest of the site. I know the stylesheet is uglyless than completely attractive right now&#8211;the first thing was to get everything factored and consistent, then to make it pretty. The projects page only has one item on it (Pastels), but that should be changing now that I have the infrastructure set up the way I want it. Nearly all the projects I mentioned in my presentation at the Vancouver Python Workshop will get their own pages soon. More about that in my next post.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2006/atom-and-microformats-intro</id>
    <title type="html"><![CDATA[Atom and Microformats Intro]]></title>
    <updated>2008-01-21T05:36:50Z</updated>
    <published>2006-06-01T05:05:18Z</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/05/31/atom-and-microformats-intro/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2006/05/31/atom-and-microformats-intro" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[My most recent article at IBM developerWorks is up (part of David Mertz&#8217;s &#8220;XML Matters&#8221; column), discussing the intersection of Atom Syndication Format, Atom Publishing Protocol, and Microformats:
Up And Atom
Actually, it&#8217;s been up for at least a week, but I was out of town at JavaOne (and too tired to post), then off the grid [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2006/05/31/atom-and-microformats-intro"><![CDATA[<p>My most recent article at IBM <a href="http://www-128.ibm.com/developerworks/xml">developerWorks</a> is up (part of David Mertz&#8217;s &#8220;XML Matters&#8221; column), discussing the intersection of <a href="http://www.ietf.org/rfc/rfc4287.txt">Atom Syndication Format</a>, <a href="http://www.ietf.org/internet-drafts/draft-ietf-atompub-protocol-08.txt">Atom Publishing Protocol</a>, and <a href="http://microformats.org/">Microformats</a>:</p>
<p><a href="http://www-128.ibm.com/developerworks/xml/library/x-matters45.html">Up And Atom</a></p>
<p>Actually, it&#8217;s been up for at least a week, but I was out of town at JavaOne (and too tired to post), then off the grid completely taking my daughter&#8217;s school to camp. I&#8217;m still getting caught up, but nearly recovered.</p>
<p>I think I&#8217;ve figured out why my new blog is not being picked up by <a href="http://planet.python.org/">Planet Python</a> too: the planet software has only recently begun to support Atom 1.0, and that version hasn&#8217;t been officially released yet. There should be a 1.0 release of the <a href="http://planetplanet.org/">planet</a> code soon, and hopefully Planet Python will upgrade then and all will be well with the world.</p>
<p>I guess that&#8217;s one downside to developing my own blogging tools to support open standards: I may not have to implement deprecated formats or protocols, but if others are still stuck with legacy systems it can still hurt.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2005/tidbits</id>
    <title type="html"><![CDATA[Tidbits]]></title>
    <updated>2008-01-25T05:51:00Z</updated>
    <published>2005-05-26T05:46: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/25/tidbits/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2005/05/25/tidbits" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[My posts have been infrequent, in part because I&#8217;ve been working on lots of things to talk about. I&#8217;m in the last stages of putting together info on creating NSStatusItems (tools which show up in the menu bar across all applications in OS X) in PyObjC. I&#8217;ve also got some cool Quicktime and iSight tools [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2005/05/25/tidbits"><![CDATA[<p>My posts have been infrequent, in part because I&#8217;ve been working on lots of things to talk about. I&#8217;m in the last stages of putting together info on creating NSStatusItems (tools which show up in the menu bar across all applications in OS X) in PyObjC. I&#8217;ve also got some cool Quicktime and iSight tools coming soon. And I&#8217;ve renamed ZenPaint to DrawingBoard, but it&#8217;s working and just waiting for a little GUI cleanup before I post the first binary and source.</p>
<p>Two of my back-burner projects, better blue-screening, and easy lightsabre effects, have been done by others recently. Inspired by the same BoingBoing piece on rotoscoping your own lightsabres as I was, but <a href="http://www.lamarchefamily.net/nakedsoft/">Naked Software</a> actually sat down and wrote the code. It&#8217;s pretty slick, too. For blue-screen effects (and many more), check out Sam Kass&#8217; <a href="http://www.samkass.com/blog/">Quartz Composer Compositions</a>. Very neat stuff, Tiger-only though [Update: now Leopard]. Some of the compositions require a newer system with a higher-end video card than my three-year-old PowerBook.</p>
<p>But to be honest, the real point of this post is not to tease with coming attractions, but to point out my first paid publication. My friend <a href="http://gnosis.cx/publish/">David Mertz</a> asked me to collaborate with him on his <a href="http://www-128.ibm.com/developerworks/views/xml/libraryview.jsp?search_by=xml+matters:">XML Matters</a> column for IBM developerWorks, and my first column went live last Friday: <a href="http://www-128.ibm.com/developerworks/xml/library/x-matters41.html">Beyond the DOM</a>.</p>
<p>I&#8217;ve wanted to be a writer for as long as I can remember, with poetry notebooks and 200 pages of a novel gathering dust on my bookshelves, so finally getting around to finishing something and having it published leaves me pleased as punch. And more <strong>will</strong> be forthcoming.</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2005/hearing-voices</id>
    <title type="html"><![CDATA[Hearing Voices]]></title>
    <updated>2008-01-25T21:30:34Z</updated>
    <published>2005-02-19T06:10:33Z</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/02/18/hearing-voices/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2005/02/18/hearing-voices" />
    <category scheme="http://livingcode.org" term="News" />
    <summary type="html"><![CDATA[Northern Voices, that is. The local blogging conference is tomorrow and I&#8217;ll be there, along with my friend and co-worker, Michael. While I find the idea of a conference about blogging to be a bit odd, it&#8217;s a good chance to meet some of the people in person who I only know from blogspace, like [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2005/02/18/hearing-voices"><![CDATA[<p><a href="http://northernvoice-ca.canadawebhosting.com/">Northern Voices</a>, that is. The local blogging conference is tomorrow and I&#8217;ll be there, along with my friend and co-worker, <a href="http://www.theirishkid.com/blog/">Michael</a>. While I find the idea of a conference about blogging to be a bit odd, it&#8217;s a good chance to meet some of the people in person who I only know from blogspace, like <a href="http://www.sauria.com/blog">Ted</a> and <a href="http://www.julieleung.com/">Julie,</a> and a chance to catch up with <a href="http://tbray.org/ongoing/">Tim</a> and <a href="http://www.laurenwood.org/anyway/">Lauren</a>, who I almost never see even though we live in the same town</p>
]]></content>
        </entry>
    <entry>
    <id>http://livingcode.org/2004/housekeeping</id>
    <title type="html"><![CDATA[Housekeeping]]></title>
    <updated>2008-01-26T05:27:01Z</updated>
    <published>2004-11-11T05:23:42Z</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/2004/11/10/housekeeping/feed" thr:count="0"  />
    <link rel="alternate" href="http://livingcode.org/2004/11/10/housekeeping" />
    <category scheme="http://livingcode.org" term="Python" />
    <summary type="html"><![CDATA[Various small improvements. Switched the template so code doesn&#8217;t run off the edge so easily. Fixed whitespace, which I forgot to do after switching the template (thanks, Xavier, for pointing that out!). All the code for the renaissance examples is available via cvs from the SourceForge Living Code project, in the somewhat predictable cvs module, [...]]]></summary>
      <content type="html" xml:base="http://livingcode.org/2004/11/10/housekeeping"><![CDATA[<p>Various small improvements. Switched the template so code doesn&#8217;t run off the edge so easily. Fixed whitespace, which I forgot to do after switching the template (thanks, Xavier, for pointing that out!). All the code for the renaissance examples is available via cvs from the SourceForge <a href="http://sourceforge.net/projects/livingcode/">Living Code</a> project, in the somewhat predictable cvs module, <a href="http://cvs.sourceforge.net/viewcvs.py/livingcode/renaissance_examples/">renaissance_examples</a>. As some of the examples grow, I may only publish the highlights in the blog, and put the remainder in CVS. We&#8217;ll se how it goes.</p>
<p>Coming attractions. I&#8217;m researching how to build the Renaissance projects so they can be distributed (I haven&#8217;t forgotten you, Jorjun, I&#8217;m just still figuring it out myself). I can do it now (thanks, Bob!), but I want something more straightforward to build. Hopefully later tonight.</p>
<p>Now that we&#8217;ve got a brower for Renaissance files (see previous post), I wanted to create a markup file to show off most of the widgets and options, but realized there is no markup for tabbed views, so I&#8217;m going to try creating new tags from Python, and show how to do that. When I&#8217;ve got the tags which represent Cocoa widgets that do not yet have Renaissance representations working, then I&#8217;ll put together the demo gsmarkup file.</p>
<p>Then back to the Small Nerd examples and a couple of other applications (ports of existing tools, nothing terribly original yet).</p>
<p>It&#8217;s been nice to hear from people who are enjoying this series. If there are specific things you&#8217;d like to see, let me know, either in the comments, or at dethe(at)livingcode.org</p>
]]></content>
        </entry>
  </feed>
