<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>toxicsoftware.com</title><link>http://toxicsoftware.com/</link><description></description><atom:link href="http://toxicsoftware.com/feeds/rss.xml" rel="self"></atom:link><lastBuildDate>Sat, 02 Feb 2013 00:00:00 -0800</lastBuildDate><item><title>Issue Those Pull Requests</title><link>http://toxicsoftware.com/issuerequests.html</link><description>&lt;blockquote class="twitter-tweet"&gt;&lt;p&gt;Forks without pull requests annoy me. If your changes could be considered useful you should be submitting pull&amp;nbsp;requests.&lt;/p&gt;&amp;mdash; Jonathan Wight (@schwa) &lt;a href="https://twitter.com/schwa/status/297759671710806016"&gt;February 2, 2013&lt;/a&gt;&lt;/blockquote&gt;

&lt;script async src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;

&lt;p&gt;I&amp;#8217;m the maintainer of a few Open Source github projects. Mostly iOS and Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X Cocoa projects. I don&amp;#8217;t open these projects because I&amp;#8217;m expecting contribution from the community. I open them because I feel they may be useful to&amp;nbsp;others.&lt;/p&gt;
&lt;p&gt;That said, people do contribute back and I&amp;#8217;m extremely grateful for these contributions. The main mechanism for contributing is via github pull requests. Unfortunately I see a lot of forks of various projects of mine containing improvements to the original project, improvements that have not had pull requests issued. These improvements will probably be lost unless the author issues a pull&amp;nbsp;request.&lt;/p&gt;
&lt;p&gt;Even if I notice these changes (and I do occasionally go through my project &amp;#8220;network&amp;#8221; to find interesting changes) the chances are the original project has probably divulged significantly since the changes were made. Merging these old changes into the original project becomes far more laborious than it should&amp;nbsp;be.&lt;/p&gt;
&lt;p&gt;Issuing pull requests is a great way of showing your support and thanks to the original project author (or authors). Pull requests are great. Timely, well defined pull requests with limited scope are even&amp;nbsp;better.&lt;/p&gt;
&lt;p&gt;(originally posted on &lt;a href="http://schwatopia.quora.com/Issue-those-Pull-Requests"&gt;schwatopia.quora.com&lt;/a&gt;)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 02 Feb 2013 00:00:00 -0800</pubDate><guid>tag:toxicsoftware.com,2013-02-02:issuerequests.html</guid></item><item><title>Source code</title><link>http://toxicsoftware.com/sourcecode.html</link><description>&lt;p&gt;If you&amp;#8217;re looking for my source code you should look on my github&amp;nbsp;pages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/schwa"&gt;http://github.com/schwa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/touchcode"&gt;http://github.com/touchcode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My various other googlecode and bitbucket repositories are long&amp;nbsp;gone.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 02 Dec 2012 10:48:00 -0800</pubDate><guid>tag:toxicsoftware.com,2012-12-02:sourcecode.html</guid></item><item><title>New Start</title><link>http://toxicsoftware.com/new_start.html</link><description>&lt;p&gt;I got tired of Mysql and Apache2 taking down my server running a blog that I haven&amp;#8217;t updated in a year. So I migrated my Wordpress blog to one of these &lt;a href="http://news.ycombinator.com/item?id=4857473"&gt;new fangled&lt;/a&gt; static blog generators. I&amp;#8217;ve been very slowly writing my own (how hard can it be, it&amp;#8217;s just a bunch of text files?) but in the end couldn&amp;#8217;t be bothered to finish it. So I ended up using &lt;a href="http://getpelican.com"&gt;pelican&lt;/a&gt;. I did use my own wordpress to markdown import script (pelican only does Wordpress to Restructured Text). I&amp;#8217;ll post the script I used on github&amp;nbsp;soon.&lt;/p&gt;
&lt;p&gt;Now I just need to make sure the &lt;a href="http://disqus.com"&gt;disqus&lt;/a&gt; can find all the comments now, the &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds still work, the images work and none of the posts are too corrupted in the&amp;nbsp;conversion.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 12 Jan 2012 15:15:00 -0800</pubDate><guid>tag:toxicsoftware.com,2012-01-12:new_start.html</guid></item><item><title>NSLunch</title><link>http://toxicsoftware.com/nslunch.html</link><description>&lt;p&gt;I haven&amp;#8217;t interacted enough with my fellow Cocoa developers (outside of work that is) since moving to the Bay Area. So I&amp;#8217;ve started &lt;a href="http://bit.ly/NSLunch"&gt;NSLunch&lt;/a&gt; (yes, totally original name). A regular lunchtime meet up with your fellow San Francisco area Cocoa developers. We&amp;#8217;ll see if it&amp;#8217;s a success or if I end up eating lunch&amp;nbsp;alone.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 21 Dec 2011 18:13:13 -0800</pubDate><guid>tag:toxicsoftware.com,2011-12-21:nslunch.html</guid></item><item><title>UIStoryboard Issues</title><link>http://toxicsoftware.com/uistoryboard-issues.html</link><description>&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;In August I joined a new start-up as lead (and only) iOS Developer. I managed to convince the founders that targeting iOS 5 was a good idea and as such I&amp;#8217;ve embraced a lot of new iOS 5 only technologies in the app including &lt;a href="http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboard_Class/Reference/Reference.html"&gt;UIStoryboard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After a few months of development with UIStoryboard I&amp;#8217;ve decided that the technology just isn&amp;#8217;t mature enough to be used in a complex iOS application and have now replaced all* UIStoryboard with traditional&amp;nbsp;NIBs.&lt;/p&gt;
&lt;p&gt;(* I have left in standalone storyboards for parts of the app heavily in flux, but will be replacing this usage with NIBs in the&amp;nbsp;future).&lt;/p&gt;
&lt;h2&gt;Storyboard&amp;nbsp;Editor&lt;/h2&gt;
&lt;p&gt;The storyboard editor in Xcode 4 combines all the problems of the Interface editor (e.g. broken keyboard navigation, somewhat broken selection semantics, amnesia for useful settings like &amp;#8220;show bounds&amp;#8221;, etc) with the inability to edit interfaces on a small (17&amp;#8221;) screen. Once the storyboard expands beyond a half dozen or so view controllers the storyboard editor becomes very hard to use, with constant panning and zooming to find the view controller you want to&amp;nbsp;edit.&lt;/p&gt;
&lt;p&gt;One problem with storyboards with lots of view controllers (my app had around 30 view controllers in a single storyboard) is that everything looks the same. Visually a lot of view controllers end up being some kind of variation on a white rectangle (esp. when zoomed out). I found myself tending to rely on a knowledge of the storyboard &amp;#8220;geography&amp;#8221; to find the view controller I was looking for. And even familiar with the layout of the view controllers I still found myself hunting and pecking for the right view controller (&amp;#8220;oh no wait, that&amp;#8217;s the parent UINavigationController, I must want the child&amp;nbsp;instead&amp;#8221;).&lt;/p&gt;
&lt;p&gt;A somewhat related but inverse problem is that it seems to be impossible to use UITableView static cells &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; prototype cells outside of a storyboard. This seems strange. Being forced to use storyboards if you want to use this very useful feature is serious problem. I have to assume this is an&amp;nbsp;oversight.&lt;/p&gt;
&lt;h2&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Spaghetti&amp;#8221;&amp;nbsp;Segues&lt;/h2&gt;
&lt;p&gt;With moderately complex storyboards the view controllers and their segues begin to resemble spaghetti. I found this especially common when I had multiple &amp;#8220;detail&amp;#8221; view controllers that could be accessible from each other (think of a twitter app - you can view people in a people table and tweets in a tweet table, and drill down in people/tweet detail screens. But you can also access a person detail screen from an individual tweet detail screen and vice versa). I wonder if the master view controller source list (presented on the left of storyboard editor) should not be the primary view for the editor, with the ability to focus on one view controller at a&amp;nbsp;time?&lt;/p&gt;
&lt;h2&gt;Segue&amp;nbsp;Identifiers&lt;/h2&gt;
&lt;p&gt;It becomes readily apparent that the segue identifier field (settable in the editor) is the best way to differentiate between segues in large prepareForSegue: implementations (see more on this later). It would be very handy if Xcode 4 supported a &amp;#8220;warn on missing segue identifier&amp;#8221; option when storyboards are &amp;#8220;compiled&amp;#8221; into individual NIBs. (feature&amp;nbsp;request)&lt;/p&gt;
&lt;h2&gt;View Controller&amp;nbsp;Identifiers&lt;/h2&gt;
&lt;p&gt;It is possible to assign view controllers in a storyboard an identifier. Unfortunately this identifier property is not exposed in the UIViewController class. This makes it very hard to perform safe introspection of the view controller hierarchy at runtime. It would be really nice if identifier was exposed for view controllers as well as for segues. (Feature&amp;nbsp;request)&lt;/p&gt;
&lt;h2&gt;Push-only&amp;nbsp;Segues&lt;/h2&gt;
&lt;p&gt;Segues are by default &amp;#8220;additive&amp;#8221; only: you can push a view controller onto the navigation stack or present it modally but it isn&amp;#8217;t possible to perform other common navigation tasks without resorting to custom segues. For instance you can&amp;#8217;t jump to a view controller further down the navigation stack or change the tab of a tab bar. And the ability to jump to an arbitrary view controller in the view controller hierarchy (without a push) doesn&amp;#8217;t seem possible at&amp;nbsp;all.&lt;/p&gt;
&lt;p&gt;Custom segues do allow you to do some of this. In fact I have written a custom segue to jump to a different tab in UITabBarController, but it was rather hacky code to get around the fact that the segue automatically created a new destination view controller for&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;I think it would be handy if these, more complex segues, were built into the UIStoryboard system by&amp;nbsp;default.&lt;/p&gt;
&lt;h2&gt;Misuse sender&amp;nbsp;field.&lt;/h2&gt;
&lt;p&gt;A common iOS design pattern is to create a new detail view controller, populate it with the relevant detail and then present it (either push onto the navigation stack or present modally). Generally I&amp;#8217;d accomplish this with a custom &amp;#8220;initWithFoo:&amp;#8221; method on the detail view&amp;nbsp;controller.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;CUser&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theUser&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchedResultsController&lt;/span&gt; &lt;span class="n"&gt;objectAtIndexPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;CUserProfileViewController&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theViewController&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;CUserProfileViewController&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;initWithUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;theUser&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;UINavigationController&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theNavigationController&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;UINavigationController&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;initWithRootController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;theViewController&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;presentViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;theNavigationController&lt;/span&gt; &lt;span class="n"&gt;animated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;&lt;span class="caps"&gt;YES&lt;/span&gt;&lt;/span&gt; &lt;span class="n"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;&lt;span class="caps"&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With storyboarding there&amp;#8217;s no clear way to pass data to a detail view controller. The best I could come up with was by abusing the sender parameter to pass the data the detail view controller needs,&amp;nbsp;e.g.:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;CUser&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchedResultsController&lt;/span&gt; &lt;span class="nl"&gt;objectAtIndexPath:&lt;/span&gt;&lt;span class="n"&gt;indexPath&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nl"&gt;performSegueWithIdentifier:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;ID_USER_DETAIL&amp;quot;&lt;/span&gt; &lt;span class="nl"&gt;sender:&lt;/span&gt;&lt;span class="n"&gt;theUser&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The performWithSegue: method would then take the data and hand it to the already created destination view&amp;nbsp;controller:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;prepareForSegue:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UIStoryboardSegue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;segue&lt;/span&gt; &lt;span class="nf"&gt;sender:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;sender&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;segue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt; &lt;span class="nl"&gt;isEqualToString:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;ID_USER_DETAIL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UINavigationController&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theNavigationController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AssertCast_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UINavigationController&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;segue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;destinationViewController&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;CUserProfileViewController&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theViewController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AssertCast_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CUserProfileViewController&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theNavigationController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;topViewController&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;theViewController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;(Note I use my &lt;a href="http://github.com/TouchCode/TouchFoundation/blob/master/Source/Asserts.h"&gt;AssertCast_&lt;/a&gt; macro to make sure my assumptions about the view hierarchy are correct, I&amp;#8217;ve been bitten too many times in the past by bad view controller hierarchy assumptions to not be paranoid&amp;nbsp;here)&lt;/p&gt;
&lt;p&gt;Not only is this a lot of code and complexity to replace something that was rather simple before, it seems to be an abuse of the &amp;#8220;sender&amp;#8221; parameter. Sender should really be (at least according to tradition) the button or the table cell or the map annotation, etc that triggered the segue and not the data the destination view controller needs to configure&amp;nbsp;itself.&lt;/p&gt;
&lt;p&gt;I tried to build my own performSegueWithIdentifier:sender:userInfo: and prepareForSegue:sender:userInfo: methods in a UIViewController category but it was clear it was going to have to do some nasty things (like define a prepareForSegue:sender: in the category in question) and I decided it was a&amp;nbsp;no-go.&lt;/p&gt;
&lt;p&gt;Perhaps I&amp;#8217;m missing something here and there is a better way to accomplish&amp;nbsp;this.&lt;/p&gt;
&lt;h2&gt;Bloated&amp;nbsp;prepareForSegue:&lt;/h2&gt;
&lt;p&gt;My root view controller has become a source view controller for lot of segues and therefore its prepareForSegue: has become a stupidly large method filled with a lot of &amp;#8220;if (segue.identifier isEqualToString:@&amp;#8221;&amp;#8230;&amp;#8221;)&amp;#8221; statements in a row. I don&amp;#8217;t like this. I much preferred the way the same code was distributed to many view controllers&amp;nbsp;instead.&lt;/p&gt;
&lt;p&gt;I find this problem causes the code to become more brittle and less flexible. If I change the view controller hierarchy I need to find the relevant block of code in the source view controller and move it to the new view controller. Previously I didn&amp;#8217;t have to do this at all. This totally eliminates the flexibility that storyboards can&amp;nbsp;provide.&lt;/p&gt;
&lt;h2&gt;No user defined&amp;nbsp;relationships&lt;/h2&gt;
&lt;p&gt;This was really the nail in coffin for storyboards for&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;I needed to create a new container view controller type that could flip between multiple child view controllers (rather like a UITabBarController but with different &lt;span class="caps"&gt;UI&lt;/span&gt; and animation). I implemented the view controller with a child &amp;#8220;viewControllers&amp;#8221; property and got the transitions and &lt;span class="caps"&gt;UI&lt;/span&gt; working and then realised that I couldn&amp;#8217;t wire it up in a UIStoryboard successfully. I quickly realised that only UINavigationController and UITabBarController could have non-segue relationships to other view controllers (*). This basically made it impossible to use one large storyboard and would need to use traditional techniques (static view controller instantiation in this case) and break my single monolithic storyboards up into smaller storyboards that I could load root view controllers from as needed. Unfortunately because of the spaghetti problem I discussed previously this was going to be&amp;nbsp;ugly.&lt;/p&gt;
&lt;p&gt;At this point, combined with the other problems and issues I&amp;#8217;d encountered up to now I decided to rip out my storyboard and replace it with the traditional one (or more) &lt;span class="caps"&gt;NIB&lt;/span&gt; per view&amp;nbsp;controller.&lt;/p&gt;
&lt;h2&gt;No code size&amp;nbsp;benefits&lt;/h2&gt;
&lt;p&gt;I spent almost a day replacing my storyboard (and related code) with NIBs (I am sure I have introduced new bugs into the app in the process that will take further time to find and fix). In doing so I actually reduced the line count by about 400 lines of code. It&amp;#8217;s pretty clear that storyboards wont reduce the total of number of lines code in the app and due to the problems with prepareForSegue: discussed previously I don&amp;#8217;t think storyboards will allow you to iterate designs more quickly than using&amp;nbsp;NIBs.&lt;/p&gt;
&lt;h2&gt;Is this my&amp;nbsp;fault?&lt;/h2&gt;
&lt;p&gt;So I&amp;#8217;m left wondering if this could my fault, that I&amp;#8217;m missing something or just don&amp;#8217;t understand how I should be using storyboards. I don&amp;#8217;t think so. I do think that I could learn to stop worrying about the sender/userInfo issue and perhaps I could work out a smart way to solve the prepareForSegue: bloat problem. But really, I don&amp;#8217;t have the time for this, I need to be able to implement &lt;span class="caps"&gt;UI&lt;/span&gt; in a speedy manner without having to solve the &amp;#8220;how do I make this work with UIStoryboards&amp;#8221;&amp;nbsp;problem.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;I do think the UIStoryboard technology has a lot of potential but as I&amp;#8217;ve discussed there are some rather severe issues with the current implementation that make it burdensome to use. That said I look forward to further iterations of the technology. Also if anyone has worked around these problems or think I&amp;#8217;m doing it wrong please let me&amp;nbsp;know.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 13 Dec 2011 22:39:52 -0800</pubDate><guid>tag:toxicsoftware.com,2011-12-13:uistoryboard-issues.html</guid></item><item><title>Calling a Turd a Turd</title><link>http://toxicsoftware.com/calling-a-turd-a-turd.html</link><description>&lt;p&gt;Apparently my previous post is getting called out as &amp;#8220;defensive&amp;#8221; on the &lt;a href="http://macindie.com/2011/06/when-small-platforms-get-big-big-egos-need-to-get-small"&gt;MacIndie blog&lt;/a&gt;. Well, again I assume it&amp;#8217;s my post because the author so far hasn&amp;#8217;t bothered to mention my post directly. Oh well. We&amp;#8217;ll read between the lines and assume the author is targeting me. I&amp;#8217;m not really worried if the post came over as defensive or not - it was merely stating why I believe that criticising and being open to criticism is a good&amp;nbsp;thing.&lt;/p&gt;
&lt;p&gt;I think the author is going along with Marcus&amp;#8217; original point: in that it is the almost solely senior members of the community who were critical. This is ignoring all the criticism from folks like &lt;a href="http://www.google.com/webhp?sourceid=chrome-instant&amp;amp;ie=UTF-8&amp;amp;ion=1&amp;amp;nord=1#sclient=psy&amp;amp;hl=en&amp;amp;safe=off&amp;amp;nord=1&amp;amp;site=webhp&amp;amp;source=hp&amp;amp;q=site%3Adaringfireball.net%20The%20Daily&amp;amp;aq=&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;pbx=1&amp;amp;fp=bb00a8cd1aea9d79&amp;amp;ion=1&amp;amp;ion=1&amp;amp;bav=on.2,or.r_gc.r_pw.&amp;amp;fp=bb00a8cd1aea9d79&amp;amp;biw=1599&amp;amp;bih=849&amp;amp;ion=1"&gt;John Gruber&lt;/a&gt;, &lt;a href="http://www.subtraction.com/2011/04/06/guessing-at-numbers-for-the-daily"&gt;Khoi Vinh&lt;/a&gt;, &lt;a href="http://www.pcmag.com/article2/0,2817,2383171,00.asp"&gt;&lt;span class="caps"&gt;PC&lt;/span&gt; Mag&lt;/a&gt; (&lt;em&gt;eww&lt;/em&gt;), &lt;a href="http://blogs.telegraph.co.uk/technology/shanerichmond/100006286/the-daily-ipad-app-review-a-complete-failure-of-imagination/"&gt;The Daily Telegraph&lt;/a&gt; (double &lt;em&gt;eww&lt;/em&gt;) and even the App reviews themselves (which as all good developers know - should be utterly ignored out of hand, because the peons know&amp;nbsp;nothing!).&lt;/p&gt;
&lt;p&gt;So this shows that it wasn&amp;#8217;t just the old &amp;#8220;grey beard&amp;#8221; section of the Cocoa dev community(tm) - it was pretty much everybody. The app was wildly slammed by everyone because &lt;em&gt;everyone&lt;/em&gt; saw it. It probably had the largest launch of any iOS app - and everyone saw it to be unpolished, slow, buggy and at the end of the day owned by a psychopath who makes Bond villains look huggable. In comparison the criticism from the old timers was relatively small (and if I recall correctly,&amp;nbsp;tame).&lt;/p&gt;
&lt;p&gt;Anyone parroting the &amp;#8220;grey beard&amp;#8221; line is either forgetting the mainstream criticism or is incapable of critical&amp;nbsp;thinking.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also a little bit confused because, no one officially knew who worked on the The Daily (although I&amp;#8217;d say it was moderately common knowledge a few days after the launch). How can the community be accused of turning on one of its own if we had no clue who worked on the app? As far as we knew Murdoch probably outsourced it to indentured iOS child programmers in the jungles of Peru (no offense to real Peruvian child slave programmers - I&amp;#8217;m sure you do great&amp;nbsp;work).&lt;/p&gt;
&lt;p&gt;A quick thought experiment: let&amp;#8217;s say you were the client paying for the contractors (and sub-contractors) who worked on The Daily. Would you personally have been happy with the state it was in when it was released? I wouldn&amp;#8217;t have been. I would have pushed as much as possible to move the deadline so that the blatant problems could be fixed. The fact that it was released anyway means to me, as is often the case with software, that making the deadline trumped the product&amp;nbsp;quality.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d be really surprised if anyone was happy with the quality of the app when it was released (the same can almost always be said for any software release). So should we shut up when something is released with great fanfare and yet it, well quite frankly, isn&amp;#8217;t very good? These hypothetical kids in Peru have it shit already, they&amp;#8217;re working for the anti-christ as it is. Do they really need all these old timers they look up to and respect shitting on something they&amp;#8217;ve poured their time and energy&amp;nbsp;into?&lt;/p&gt;
&lt;p&gt;The truth is children didn&amp;#8217;t write the app. Grown adults did, adults who should expect and desire criticism from their peers. Not wanting or accepting criticism means you just want false platitudes. You don&amp;#8217;t have to go too far to find them on the internet. Yes, writing software is hard work, we get it — but we all do it. Working as a sub-contractor to the anti-christ sounds like absolutely fucking miserable work, we get that too — but if you&amp;#8217;ve got the stomach for it — good for you. But just because something is hard, or unpleasant to do — doesn&amp;#8217;t mean that the end result doesn&amp;#8217;t deserve criticism if it just isn&amp;#8217;t very&amp;nbsp;good.&lt;/p&gt;
&lt;p&gt;That doesn&amp;#8217;t diminish the fact that criticism is hard to take. It is, I&amp;#8217;m personally awful at taking criticism. And developer egos are very fragile things and easily crushed. Having them crushed by your peers is certainly harder still. But without strong criticism, you end up applauding mediocrity. Fuck that. Give me a snarky bastard developer who tells me what I&amp;#8217;m doing is crap. I&amp;#8217;d take that any day over someone who tells me every single thing I do is&amp;nbsp;wonderful.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll end this post with words from Winston Churchill. who was much better at crafting them than I could ever hope to&amp;nbsp;be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of&amp;nbsp;things.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 05 Jun 2011 17:42:18 -0700</pubDate><guid>tag:toxicsoftware.com,2011-06-05:calling-a-turd-a-turd.html</guid></item><item><title>90% of Everything is Crap</title><link>http://toxicsoftware.com/ninetypercent.html</link><description>&lt;p&gt;Time to bring this blog back from the dead with a little pre-&lt;span class="caps"&gt;WWDC&lt;/span&gt;&amp;nbsp;controversy!&lt;/p&gt;
&lt;p&gt;Apparently there&amp;#8217;s a disturbing trend going on in the Cocoa development community. We old timers aren&amp;#8217;t being excellent to each other &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; newcomers to the community. Marcus Zarra in his blog, &amp;#8220;Cocoa is My Girlfriend&amp;#8221;, declaims against the criticism his work on The Daily iPad app received when it was released and is dismayed this criticism is coming from predominately the &amp;#8220;grey&amp;nbsp;beards&amp;#8221;.&lt;/p&gt;
&lt;p&gt;I think I&amp;#8217;m firmly in the group of &amp;#8220;grey beards&amp;#8221; Marcus rails against, because of two facts: I am a miserable old curmudgeon and when The Daily first came out I was very critical of it (and in fact a critical tweet of mine managed to get the product I work on &lt;a href="http://daringfireball.net/linked/2011/02/04/inkling"&gt;grubered&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;Marcus spends a significant portion of his blog post elaborating on this trend, explaining how the older developers are turning on one another and their creations. For the rest of the blog post Marcus explains, well defends really, his work on The&amp;nbsp;Daily.&lt;/p&gt;
&lt;p&gt;You can read it all on his blog here: &lt;a href="http://www.cimgf.com/2011/06/03/why-so-serious/"&gt;http://www.cimgf.com/2011/06/03/why-so-serious/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think Marcus is wrong. I&amp;#8217;m not going to accept his portrayal of this portion of the Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X/iOS development community. I think the veterans in the community are no more or less critical today than they have ever been. As a general rule I think developers are highly critical by nature and by training, we have to be. And as a flip side to that, developers have to learn not to take all criticism&amp;nbsp;personally.&lt;/p&gt;
&lt;p&gt;We spend all day being told (by a program no less) how many errors we&amp;#8217;ve just made writing a certain piece of code. When we finally fix all the obvious mistakes and can run the software, we hand the fruits of our labours off to folks whose very job is to be painstakingly critical of our work. When they find problems with our work (and they do, guaranteed) we track these mistakes in databases that grow to be huge mountains of preserved&amp;nbsp;failures.&lt;/p&gt;
&lt;p&gt;This is how good software is made. We become very critical of our work and of the software itself. We have to be critical so we know what we can fix and improve. If we took all this criticism personally, software developers would all be nervous wrecks. We learn to treat criticism not as accusation of failure, but as part of the process of making something good. But sometimes it is hard to do this and you get personally attached. That&amp;#8217;s when the criticism feels like an attack on&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;Despite the dangers of taking it personally, I actually like this process. I think strong criticism is a good thing. You can&amp;#8217;t improve something if you think it is perfect and often the creator is too involved with their creation to be able to recognize the flaws. I want to know when something I have worked on is broken, or just isn&amp;#8217;t that great or could be done better. This is how I improve and learn. And I actually think society could benefit from becoming more critical, it seems to have become impolite to be critical. I hate to break it to you but your child is not gifted and&amp;nbsp;talented.&lt;/p&gt;
&lt;p&gt;I think Marcus is taking these criticisms personally, it probably is hard not to. He has poured a lot of time and energy into this product and it was put into the spotlight and promptly demolished by the community. The best thing he, or anyone else this position could do at this point is to prove the critics wrong. Fix the bugs or the performance problems, fix those cosmetic issues, make the software really fucking excellent. Blaming portions of the community for being overly critical is divisive and doesn&amp;#8217;t make you or your software look any&amp;nbsp;better.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t envy Marcus the job though, I&amp;#8217;ve worked as a contractor for large, megalomaniacal corporations and you can&amp;#8217;t always control the outcome. Sometimes you have to shrug your shoulders, smile, nod and just do as the client asks, even if you know it is  going to produce a substandard outcome. That&amp;#8217;s the nature of software&amp;nbsp;consultancy. &lt;/p&gt;
&lt;p&gt;And in the spirit of accepting criticism, comments are on for this post! (Don&amp;#8217;t forget to criticise my indent&amp;nbsp;style!)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 04 Jun 2011 05:30:24 -0700</pubDate><guid>tag:toxicsoftware.com,2011-06-04:ninetypercent.html</guid></item><item><title>I name that UIColor in three!</title><link>http://toxicsoftware.com/uicolor-instrument.html</link><description>&lt;p&gt;You&amp;#8217;re working on a custom iPhoneOS view and you want it to use colours from the standard iPhone &lt;span class="caps"&gt;OS&lt;/span&gt; colour palette. Your first impulse is to check the defined colours in UIInterface.h - but there are only a grand total of five colours defined in that header. Your next and probably last impulse is to break out the colour picker and use the eye-dropper tool to sample the exact &lt;span class="caps"&gt;RGB&lt;/span&gt; value from the screen&amp;nbsp;itself.&lt;/p&gt;
&lt;p&gt;There are two problems with using an eye-dropper tool. The first problem is that by sampling the on screen pixel value you can only get the composited red, green, blue values; you cannot get the alpha value at all. If the original colour had an alpha value then the final colour you might get will not much the original colour at all. The second problem is that you can&amp;#8217;t easily be sure that a colour you sample directly off the screen uses the same colour profile as the&amp;nbsp;original.&lt;/p&gt;
&lt;p&gt;I decided instead to use Intruments to probe the application and find out exactly what &lt;span class="caps"&gt;RGBA&lt;/span&gt; colour was being used by UIKit. I modified my project to display the element I wanted to find out the colour of (in my case it was the colour of a UITableView&amp;#8217;s section footer label) and then ran the application through&amp;nbsp;Intruments.&lt;/p&gt;
&lt;p&gt;After a little trial and error (and some help from &lt;a href="http://twitter.com/eridius"&gt;Kevin Ballard&lt;/a&gt; to work out exactly how to output the &lt;span class="caps"&gt;RGBA&lt;/span&gt; values) I had an Instrument that would display all parameters passed to [UIColor initWithRed:green:blue:alpha] (&lt;a href="/uploads/Screen-shot-2010-07-28-at-16.29.21.png"&gt;Screenshot&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;As you can see from the screenshot, this works almost too well, with Intruments displaying almost too much information. But it is actually quite easy to narrow down the data to exactly what you&amp;#8217;re looking for (&lt;a href="/uploads/Screen-shot-2010-07-28-at-16.29.01.png"&gt;screenshot&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Note that you wont get all colours. Just those created via [UIColor initWithRed:green:blue:alpha:] but the same technique can easily be used to probe for colours created via other methods or even via &lt;span class="caps"&gt;CG&lt;/span&gt; functions. It&amp;#8217;s also pretty easy to use gdb to break on the relevant symbol and print out the parameters - however once you have this instrument in place it&amp;#8217;s really quick and easy to run through an application and capture all colours. You can even export the colours into &lt;span class="caps"&gt;CSV&lt;/span&gt; file for easy&amp;nbsp;manipulation.&lt;/p&gt;
&lt;p&gt;You can download the Instrument &lt;a href="/uploads/3433F2D0_2397_4AAD_AAE8_9362671FD43A.instrument"&gt;here&lt;/a&gt;, copy it to &lt;pre&gt;~/Library/Application Support/Instruments/PlugIns/Instruments&lt;/pre&gt; and then drag the instrument from Instruments Library into your&amp;nbsp;workflow.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 31 Jul 2010 20:41:32 -0700</pubDate><guid>tag:toxicsoftware.com,2010-07-31:uicolor-instrument.html</guid></item><item><title>I wouldn’t hire an iPhone developer who charges less than $999.95/hour</title><link>http://toxicsoftware.com/i-wouldnt-hire-an-iphone-developer-who-charges-less-than-999-95hour.html</link><description>&lt;p&gt;If you followed the link from Mike Lee&amp;#8217;s &amp;#8220;&lt;a href="http://www.atomicwang.org/motherfucker/Index/Entries/2010/6/24_What_money_can_buy.html"&gt;motherfucker&lt;/a&gt;&amp;#8221; blog to here, welcome! You&amp;#8217;re probably looking for the &lt;a href="http://toxicsoftware.com/iPhoneSWPro.html"&gt;iPhoneSWPro link&lt;/a&gt;. There you&amp;#8217;ll be able to find out how to hire competent, professional, ego-free (for certain values of free) iPhone (and iPad) developers (for somewhat south of&amp;nbsp;$1000/hour).&lt;/p&gt;
&lt;p&gt;Of course, if you want the best iOS developer money can buy, then please, hire Mike. Rest assured, you will get the best of the best. Don&amp;#8217;t believe me? Just ask&amp;nbsp;Mike.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 25 Jun 2010 03:50:53 -0700</pubDate><guid>tag:toxicsoftware.com,2010-06-25:i-wouldnt-hire-an-iphone-developer-who-charges-less-than-999-95hour.html</guid></item><item><title>Add to Pinboard</title><link>http://toxicsoftware.com/add-to-pinboard.html</link><description>&lt;p&gt;In my &lt;a href="/uploads/Add%20to%20pinboard.zip"&gt;previous post&lt;/a&gt; I suggested adapting my Python script for use in a Snow Leopard service. I decided to quickly whip this up myself. So &lt;a href="/uploads/Add%20to%20pinboard.zip"&gt;here is&lt;/a&gt; a (Snow Leopard only!) service that can add URLs to &lt;a href="http://pinboard.in"&gt;pinboard.in&lt;/a&gt;. Unzip the file and copy it to ~/Library/Services then run this little shell script to set up a keychain item for your pinboard&amp;nbsp;account:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nv"&gt;&lt;span class="caps"&gt;HOST&lt;/span&gt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api.pinboard.in
&lt;span class="nb"&gt;read&lt;/span&gt; -p &lt;span class="s2"&gt;&amp;quot;Username: &amp;quot;&lt;/span&gt; &lt;span class="caps"&gt;USERNAME&lt;/span&gt;
&lt;span class="nb"&gt;read&lt;/span&gt; -p &lt;span class="s2"&gt;&amp;quot;Password: &amp;quot;&lt;/span&gt; -s &lt;span class="caps"&gt;PASSWORD&lt;/span&gt;
security add-internet-password -U -r http -s &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;HOST&lt;/span&gt;&amp;quot;&lt;/span&gt; -a &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;USERNAME&lt;/span&gt;&amp;quot;&lt;/span&gt; -w &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;PASSWORD&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;And the script also uses the &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup 3rd party&lt;/a&gt; python module to extract the title of the webpage you&amp;#8217;re linking to. You&amp;#8217;ll need to install beautiful&amp;nbsp;soup:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;easy_install&lt;/span&gt; &lt;span class="n"&gt;beautifulsoup&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you&amp;#8217;ve correctly installed the service you can enable/disable it and assign it a keyboard shortcut from the Keyboard preference&amp;nbsp;pane:&lt;/p&gt;
&lt;p&gt;[&lt;img alt="Screen shot 2009-12-17 at 10.09.36" src="http://farm5.static.flickr.com/4044/4192220957_32687ff498_t.jpg" /&gt;][]
When enabled you should be able to see an entry in the application&amp;#8217;s service menu:
[&lt;img alt="Screen shot 2009-12-17 at 10.03.06" src="http://farm3.static.flickr.com/2783/4192209095_7bf4b12223_t.jpg" /&gt;][]
  [&lt;img alt="Screen shot 2009-12-17 at 10.09.36" src="http://farm5.static.flickr.com/4044/4192220957_32687ff498_t.jpg" /&gt;]: http://www.flickr.com/photos/61285556@N00/4192220957 &amp;#8220;View &amp;#8216;Screen shot 2009-12-17 at 10.09.36&amp;#8217; on Flickr.com&amp;#8221;
  [&lt;img alt="Screen shot 2009-12-17 at 10.03.06" src="http://farm3.static.flickr.com/2783/4192209095_7bf4b12223_t.jpg" /&gt;]: http://www.flickr.com/photos/61285556@N00/4192209095 &amp;#8220;View &amp;#8216;Screen shot 2009-12-17 at 10.03.06&amp;#8217; on&amp;nbsp;Flickr.com&amp;#8221;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 17 Dec 2009 15:12:37 -0800</pubDate><guid>tag:toxicsoftware.com,2009-12-17:add-to-pinboard.html</guid></item><item><title>Webloc to Pinboard</title><link>http://toxicsoftware.com/webloc-to-pinboard.html</link><description>&lt;p&gt;If I want to keep a &lt;span class="caps"&gt;URL&lt;/span&gt; around for later I generally drag the &lt;span class="caps"&gt;URL&lt;/span&gt; from Safari&amp;#8217;s &lt;span class="caps"&gt;URL&lt;/span&gt; bar onto the desktop. This creates an &amp;#8220;internet clipping file&amp;#8221; (with a .webloc file extension). These files are like little self contained bookmarks that, when double clicked open the linked webpage in Safari. Because they&amp;#8217;re just ordinary files, you can manage them like any other file, store them in folders, copy them around, delete them,&amp;nbsp;etc.&lt;/p&gt;
&lt;p&gt;Eventually these clippings will get deleted or filed in a folder and forgotten. In the past I&amp;#8217;ve written Spotlight importers to try and gather all these clippings and then export them in a format I could use in a bookmark manager application, such as WebNoteHappy. But most bookmark manager apps tend to be quite limited and I&amp;#8217;ve found online services such as &lt;a href="http://delicious.com"&gt;delicious&lt;/a&gt;, &lt;a href="http://instapaper.com"&gt;instapaper&lt;/a&gt; and now &lt;a href="http://pinboard.in"&gt;pinboard.in&lt;/a&gt; to be far superior to any desktop&amp;nbsp;application.&lt;/p&gt;
&lt;p&gt;But getting from an internet clipping on my desktop to an entry in an online bookmark manager usually involves a lot of manual&amp;nbsp;labour.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve found a great solution using &lt;a href="http://www.noodlesoft.com/hazel.php"&gt;Hazel&lt;/a&gt; and a custom Python script. I have a Hazel rule that finds files with a &amp;#8220;.webloc&amp;#8221; file extension on my desktop. The rule then runs a single python script to add the &lt;span class="caps"&gt;URL&lt;/span&gt; to my pinboard.in account and then moves the file into the trash. Usually Hazel notices the clipping, adds it to pinboard.in and trashes the file within a couple of&amp;nbsp;seconds. &lt;/p&gt;
&lt;p&gt;[&lt;img alt="Screen shot 2009-12-17 at 09.12.35" src="http://farm3.static.flickr.com/2495/4192151805_d5b0ce0737_t.jpg" /&gt;][]&lt;/p&gt;
&lt;p&gt;The python script is where all the magic&amp;nbsp;happens:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Foundation&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;Carbon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Res&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;infoForWebloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inPath&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;theDisplayName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foundation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NSFileManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defaultManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;displayNameAtPath_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FSOpenResourceFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FSGetResourceForkName&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fsRdPerm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseResFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resNum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theResource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get1Resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;url &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theURLFromResource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theResource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="n"&gt;Res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CloseResFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resNum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foundation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NSData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataWithContentsOfFile_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;thePropertyList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foundation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NSPropertyListSerialization&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;propertyListWithData_options_format_error_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theURLFromData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thePropertyList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;span class="caps"&gt;URL&lt;/span&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;theDisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theURLFromResource&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inServer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;theArguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;security&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;find-internet-password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-s&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-g&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;thePipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Popen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theArguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;&lt;span class="caps"&gt;PIPE&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;&lt;span class="caps"&gt;PIPE&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thePipe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;theMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;&amp;quot;acct&amp;quot;&amp;lt;blob&amp;gt;=&amp;quot;(.+)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theOutput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theUsername&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theMatch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;theOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thePipe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;theMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;^password: &amp;quot;(.+)&amp;quot;$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theOutput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;thePassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theMatch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;theUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thePassword&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inDescription&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;password_mgr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPPasswordMgrWithDefaultRealm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;top_level_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;https://api.pinboard.in/v1&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;theUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thePassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;api.pinboard.in&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;password_mgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_level_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theUsername&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thePassword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPBasicAuthHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password_mgr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;opener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;build_opener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;inURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;inDescription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inDescription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://api.pinboard.in/v1/posts/add?url=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;shared=no&amp;amp;replace=yes&amp;amp;description=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inDescription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;theResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;opener&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;thePath&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;theDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;infoForWebloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theDescription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;This script reads the .webloc file to extract the &lt;span class="caps"&gt;URL&lt;/span&gt; (.webloc files store the &lt;span class="caps"&gt;URL&lt;/span&gt; in both the Carbon resource fork and in the data fork in a property list format, this script extracts the &lt;span class="caps"&gt;URL&lt;/span&gt; from both locations but only uses the &lt;span class="caps"&gt;URL&lt;/span&gt; from the resource&amp;nbsp;fork.&lt;/p&gt;
&lt;p&gt;Then script uploads the &lt;span class="caps"&gt;URL&lt;/span&gt; to pinboard.in via pinboard.in&amp;#8217;s delicious style &lt;span class="caps"&gt;API&lt;/span&gt;. The script gets your pinboard.in username and password from your keychain. To add the username and password to your keychain you&amp;#8217;ll want to run this little shell&amp;nbsp;script.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nv"&gt;&lt;span class="caps"&gt;HOST&lt;/span&gt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api.pinboard.in
&lt;span class="nb"&gt;read&lt;/span&gt; -p &lt;span class="s2"&gt;&amp;quot;Username: &amp;quot;&lt;/span&gt; &lt;span class="caps"&gt;USERNAME&lt;/span&gt;
&lt;span class="nb"&gt;read&lt;/span&gt; -p &lt;span class="s2"&gt;&amp;quot;Password: &amp;quot;&lt;/span&gt; -s &lt;span class="caps"&gt;PASSWORD&lt;/span&gt;
security add-internet-password -U -r http -s &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;HOST&lt;/span&gt;&amp;quot;&lt;/span&gt; -a &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;USERNAME&lt;/span&gt;&amp;quot;&lt;/span&gt; -w &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;PASSWORD&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;You can download the Hazel rule &lt;a href="/uploads/Desktop.hazelrules.zip"&gt;here&lt;/a&gt;, but do remember to set up your pinboard.in keychain item before installing&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Instead of using the entire desktop as a sort of a dropbox for URLs you could easily adapt the script and put it into a automator action or perhaps a system&amp;nbsp;service.&lt;/p&gt;
&lt;p&gt;[&lt;img alt="Screen shot 2009-12-17 at 09.12.35" src="http://farm3.static.flickr.com/2495/4192151805_d5b0ce0737_t.jpg" /&gt;]: http://www.flickr.com/photos/61285556@N00/4192151805 &amp;#8220;View &amp;#8216;Screen shot 2009-12-17 at 09.12.35&amp;#8217; on&amp;nbsp;Flickr.com&amp;#8221;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 17 Dec 2009 14:34:40 -0800</pubDate><guid>tag:toxicsoftware.com,2009-12-17:webloc-to-pinboard.html</guid></item><item><title>ICE Amsterdam 09</title><link>http://toxicsoftware.com/ice-amsterdam-09.html</link><description>&lt;p&gt;I just finished giving a talk (in two halves) at the &lt;span class="caps"&gt;ICE&lt;/span&gt; Amsterdam &amp;#8216;09 conference in Amsterdam. As promised here are the PDFs of my two-part talk. &lt;a href="/uploads/Embracing%20the%20iPhone%20SDK%20(Part%201).pdf"&gt;Part One&lt;/a&gt;. &lt;a href="/uploads/Embracing%20the%20iPhone%20SDK%20(Part%202).pdf"&gt;Part Two&lt;/a&gt; (warning: largish&amp;nbsp;PDFs)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 26 Nov 2009 21:42:10 -0800</pubDate><guid>tag:toxicsoftware.com,2009-11-26:ice-amsterdam-09.html</guid></item><item><title>Key-Value Observing Done Right (again)</title><link>http://toxicsoftware.com/kvoblocks.html</link><description>&lt;p&gt;&lt;a href="http://www.mikeash.com"&gt;Mike Ash&lt;/a&gt; posted a &lt;a href="http://www.mikeash.com/?page=pyblog/key-value-observing-done-right.html"&gt;great article&lt;/a&gt; about problems with Cocoa&amp;#8217;s Key Value Observing and provided a better set of classes to work with &lt;span class="caps"&gt;KVO&lt;/span&gt;: &lt;a href="http://www.mikeash.com/svn/MAKVONotificationCenter/"&gt;MAKVONotificationCenter&lt;/a&gt;. I&amp;#8217;ve been using Mike&amp;#8217;s code in various projects over the last few months and am a big&amp;nbsp;fan.&lt;/p&gt;
&lt;p&gt;When I &lt;a href="http://twitter.com/moodevdiary/"&gt;started development&lt;/a&gt; on &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;&lt;span class="caps"&gt;MOO&lt;/span&gt;&lt;/a&gt; I knew I wanted the project to use Mike&amp;#8217;s code but I also wanted to take advantage of Cocoa&amp;#8217;s Garbage Collection and Snow Leopard&amp;#8217;s blocks. I originally tried to retrofit MAKVONotificationCenter to work with &lt;span class="caps"&gt;GC&lt;/span&gt; and with blocks but it rapidly become a very difficult task. So I wrote my own &lt;span class="caps"&gt;KVO&lt;/span&gt; Notification class that was fully &lt;span class="caps"&gt;GC&lt;/span&gt; compatible and worked purely with blocks (no delegate methods at&amp;nbsp;all).&lt;/p&gt;
&lt;p&gt;Jumping as quickly into the code as I can, here is an example showing a &lt;span class="caps"&gt;KVO&lt;/span&gt; block that modifies a CoreAnimation layer&amp;#8217;s position in responses to changes in the application&amp;#8217;s model (example code adapted from &lt;span class="caps"&gt;MOO&lt;/span&gt;&amp;#8217;s &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CGameMapView.m&lt;/a&gt;):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;keyPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CALayer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NSDictionary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;id&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CGPointMake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;viewPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;viewPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modelObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;CALayer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theLayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;...;&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theLayer&lt;/span&gt; &lt;span class="nl"&gt;addKVOBlock:&lt;/span&gt;&lt;span class="n"&gt;theBlock&lt;/span&gt; &lt;span class="nl"&gt;forKeyPath:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;modelObject.position&amp;quot;&lt;/span&gt; &lt;span class="nl"&gt;options:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nl"&gt;identifier:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;KVO_IDENTIFIER_1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theLayer&lt;/span&gt; &lt;span class="nl"&gt;addKVOBlock:&lt;/span&gt;&lt;span class="n"&gt;theBlock&lt;/span&gt; &lt;span class="nl"&gt;forKeyPath:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;viewPoint.scale&amp;quot;&lt;/span&gt; &lt;span class="nl"&gt;options:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="nl"&gt;identifier:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;KVO_IDENTIFIER_2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I find this, blocks based, style of &lt;span class="caps"&gt;KVO&lt;/span&gt; handling much cleaner and easier to both code and maintain. No worrying about selectors and targets and passing whatever data you need into the delegate method. You just declare your block and register it with the &lt;span class="caps"&gt;KVO&lt;/span&gt; Notification&amp;nbsp;Center.&lt;/p&gt;
&lt;p&gt;Clean-up (unregistration) is also straight-forward, although with Garbage Collection enabled applications this isn&amp;#8217;t usually even&amp;nbsp;necessary.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re sharp-eyed you might notice that I&amp;#8217;ve called one of the block parameters &amp;#8220;self&amp;#8221;. By providing my own &amp;#8216;self&amp;#8217; parameter I am obscuring and prevent access to the parent method&amp;#8217;s &amp;#8216;self&amp;#8217; parameter. The reason I am doing this is because I&amp;#8217;ve found it is very common to register for notifications for &amp;#8220;self&amp;#8221; and unless you&amp;#8217;re very careful you can end up with a horrible retain cycle caused memory leak. By providing my own self parameter I obscure the parent method&amp;#8217;s self and make sure these kind of retains cycles don&amp;#8217;t&amp;nbsp;happen.&lt;/p&gt;
&lt;p&gt;The code is released under the &lt;span class="caps"&gt;BSD&lt;/span&gt; License on bitbucket (mercurial): &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://bitbucket.org/schwa/kvoblocknotificationcenter/&lt;/a&gt;. You&amp;#8217;ll obviously need use this on Snow Leopard or possibly with Landon Fuller&amp;#8217;s &lt;a href="http://code.google.com/p/plblocks/"&gt;plblocks toolchain&lt;/a&gt; (although I haven&amp;#8217;t tried that&amp;nbsp;myself).&lt;/p&gt;
&lt;p&gt;(Update: I&amp;#8217;ve posted &lt;a href="http://www.flickr.com/photos/jwight/3826876252/?likes_hd=1"&gt;a movie on flickr&lt;/a&gt; of &lt;span class="caps"&gt;KVO&lt;/span&gt; Block Observing in action)
(update 2: Joachim Bengtsson has posted a great &lt;a href="http://thirdcog.eu/pwcblocks/"&gt;&lt;span class="caps"&gt;HOWTO&lt;/span&gt; guide&lt;/a&gt; for blocks. It also goes into some detail about the &amp;#8220;self&amp;#8221; problem I mentioned and a better solution (__block&amp;nbsp;variables)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 16 Aug 2009 15:36:49 -0700</pubDate><guid>tag:toxicsoftware.com,2009-08-16:kvoblocks.html</guid></item><item><title>24 Hours with the Android Dev Phone 1™</title><link>http://toxicsoftware.com/24g1.html</link><description>&lt;ul&gt;
&lt;li&gt;Unboxing so not porn worthy. Developer unit came in a plain white cardboard&amp;nbsp;box.&lt;/li&gt;
&lt;li&gt;Initially thought it was smaller than my iPhone 3G. Then I realised I have a 3rd-party case on my 3G. I&amp;#8217;d forgotten how slim the iPhone really was. G1 feels like a brick in&amp;nbsp;comparison.&lt;/li&gt;
&lt;li&gt;Slightly rubberised feel to it is&amp;nbsp;good.&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;OMG&lt;/span&gt; &lt;span class="caps"&gt;NEW&lt;/span&gt; &lt;span class="caps"&gt;PHONE&lt;/span&gt; &lt;span class="caps"&gt;SMELL&lt;/span&gt;! (After about 18 hours the smell has all but&amp;nbsp;gone)&lt;/li&gt;
&lt;li&gt;Getting the rear case on to insert the battery and &lt;span class="caps"&gt;SIM&lt;/span&gt; card is a major&amp;nbsp;pain.&lt;/li&gt;
&lt;li&gt;The Mini &lt;span class="caps"&gt;USB&lt;/span&gt; and MicroSD covers are almost impossible to open if you have no&amp;nbsp;fingernails.&lt;/li&gt;
&lt;li&gt;Mini &lt;span class="caps"&gt;USB&lt;/span&gt; for charging and syncing is a huge win. I hate the iPhone/iPod &lt;span class="caps"&gt;USB&lt;/span&gt; cable with a&amp;nbsp;passion.&lt;/li&gt;
&lt;li&gt;No mini headphone jack - headphone has a mini &lt;span class="caps"&gt;USB&lt;/span&gt; plug on the end. &lt;span class="caps"&gt;WTF&lt;/span&gt;&amp;nbsp;people?&lt;/li&gt;
&lt;li&gt;I was led to believe the phone would feel cheap and poorly made. While it isn&amp;#8217;t iPhone quality it feels pretty sturdy considering it has a flip&amp;nbsp;screen.&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;AC&lt;/span&gt; Adaptor is just a generic brick. Apple spoils us with their industrial&amp;nbsp;design.&lt;/li&gt;
&lt;li&gt;Activation didn&amp;#8217;t work out of the box. I failed to find a cardboard insert with the phone describing how to configure the phone&amp;#8217;s &lt;span class="caps"&gt;APN&lt;/span&gt; for activation (did google it myself&amp;nbsp;though).&lt;/li&gt;
&lt;li&gt;Once activated it somehow managed to fetch all my contacts. Which surprised me because I didn&amp;#8217;t think I stored any contact information on Google. Need to&amp;nbsp;investigate.&lt;/li&gt;
&lt;li&gt;The camera is so much better than the iPhone&amp;#8217;s camera it is not even&amp;nbsp;funny.&lt;/li&gt;
&lt;li&gt;Built-in digital compass is really&amp;nbsp;nice.&lt;/li&gt;
&lt;li&gt;Hate hate hate hate the keyboard. At least it is backlit. I like the &amp;#8220;fire and forget&amp;#8221; autocompletion on the iPhone. I love having a keyboard while the screen is in portrait&amp;nbsp;mode.&lt;/li&gt;
&lt;li&gt;I hate flipping out that damned keyboard every 2&amp;nbsp;minutes.&lt;/li&gt;
&lt;li&gt;90% of the time when I flip out the keyboard I accidentally mash the volume control by&amp;nbsp;mistake.&lt;/li&gt;
&lt;li&gt;Volume controls are too soft and will be too prone to being accidentally mashed&amp;nbsp;anyway.&lt;/li&gt;
&lt;li&gt;Not found any use of multitouch yet - but doesn&amp;#8217;t mean it isn&amp;#8217;t&amp;nbsp;there.&lt;/li&gt;
&lt;li&gt;Only found a single app using the accelerometer (3rd party Texas Hold&amp;#8217;em game). Every other app bases screen orientation on whether or not the keyboard is flipped&amp;nbsp;out.&lt;/li&gt;
&lt;li&gt;Turning off the G1 is silly - 4 or 5&amp;nbsp;steps&lt;/li&gt;
&lt;li&gt;Dedicated camera button is silly again - and not re-mappable&amp;nbsp;&lt;span class="caps"&gt;AFAICT&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Too many icons in the status bar. I don&amp;#8217;t know what 1/2 of them&amp;nbsp;mean.&lt;/li&gt;
&lt;li&gt;There are just 3 installed widgets - not found a category in the store to find new&amp;nbsp;widgets.&lt;/li&gt;
&lt;li&gt;I like their &amp;#8220;finder&amp;#8221; more than the iphones. But both seem&amp;nbsp;underdeveloped.&lt;/li&gt;
&lt;li&gt;The browser is shit. You really get used to the double tap and multitouch features of Mobile Safari. I don&amp;#8217;t use Mobile Safari too much (preferring dedicated apps) but it towers over the Android&amp;nbsp;browser.&lt;/li&gt;
&lt;li&gt;The E-mail app is functional - but plain. Cannot swipe to delete mail. To delete mail you seem to have to read it first.&amp;nbsp;Ick.&lt;/li&gt;
&lt;li&gt;In E-mail &amp;#8220;message mode&amp;#8221; so much screen real estate is taken up with buttons. This is the best Google can&amp;nbsp;do?&lt;/li&gt;
&lt;li&gt;Composing e-mail is plain. Again hating the&amp;nbsp;keyboard.&lt;/li&gt;
&lt;li&gt;Built-in calculator is so incredibly shit. This is definitely a huge 3rd party opportunity (whether it is intentional or not is another&amp;nbsp;matter).&lt;/li&gt;
&lt;li&gt;So far the flipout keyboard (and lack of onscreen keyboard) is the single biggest&amp;nbsp;problem.&lt;/li&gt;
&lt;li&gt;Vibrator is really cheap feel. dont know how to explain&amp;nbsp;it.&lt;/li&gt;
&lt;li&gt;Camera seems to have some kind of autofocus, while pointing it it clicks and refocuses, could be software I&amp;nbsp;guess.&lt;/li&gt;
&lt;li&gt;installing an app warns you about what features it uses: e.g. camera, your location, network, your contact info etc. Which is &lt;span class="caps"&gt;REALLY&lt;/span&gt;&amp;nbsp;nice.&lt;/li&gt;
&lt;li&gt;Dumb! Doesn&amp;#8217;t have &lt;span class="caps"&gt;GPS&lt;/span&gt; turned on by default. Have to dig down silly menu system to find it. You would think the Maps app would prompt for&amp;nbsp;it.&lt;/li&gt;
&lt;li&gt;Barcode scanning works well with G1 (3rd party app). Would be impossible with&amp;nbsp;iPhone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s all I have for now. More&amp;nbsp;coming.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 18 Dec 2008 14:42:15 -0800</pubDate><guid>tag:toxicsoftware.com,2008-12-18:24g1.html</guid></item><item><title>TouchCode Donations</title><link>http://toxicsoftware.com/touchcodedonate.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchCode&lt;/a&gt; is mostly a labour of love. I wrote most of the code because it was useful to me at the time I wrote it, or for a forthcoming project. I choose to release it under the an Open Source license because the community as a whole&amp;nbsp;benefits. &lt;/p&gt;
&lt;p&gt;I would like to continue improving and adding to TouchCode, but my time is finite and I&amp;#8217;m unable to work on it as much as I would like. So when I do work on TouchCode, I appreciate that other people rely on the code and as such I make it a priority to fix bugs before adding new features or components. Other contributors to TouchCode have helped a lot. A lot of bugs and memory leaks have been found and fixed. This is all great. But it is obvious that TouchCode needs more work, it especially needs more unit tests and documentation. To help make time available to improve this I&amp;#8217;ve decided to ask TouchCode users for donations via&amp;nbsp;PayPal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You do &lt;span class="caps"&gt;NOT&lt;/span&gt; need to donate to use TouchCode (the code is still Open Source under very permissive&amp;nbsp;licenses).&lt;/li&gt;
&lt;li&gt;TouchCode will always remain Open Source. Donations will not change&amp;nbsp;that.&lt;/li&gt;
&lt;li&gt;Donations will be set aside and will allow me to spend more time working on TouchCode - especially the less sexy fun of TouchCode. I will not be using the funds to buy a new MacBook Pro (however tempting that may&amp;nbsp;be).&lt;/li&gt;
&lt;li&gt;Donations will be made with no strings attached. I will not be adding feature X to component Y just because you&amp;#8217;ve donated to the project. However if you have an urgent need for something in TouchCode (output support in NSXMLDocument perhaps?) &lt;a href="http://toxicsoftware.com/contact.html"&gt;contact me&lt;/a&gt; and we can&amp;nbsp;talk.&lt;/li&gt;
&lt;li&gt;No donation too small, no donation too big. Every donation&amp;nbsp;appreciated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here&amp;#8217;s the PayPal donate&amp;nbsp;button:&lt;/p&gt;
&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_s-xclick"&gt;
&lt;input type="hidden" name="hosted_button_id" value="644832"&gt;
&lt;input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt=""&gt;
&lt;img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"&gt;
&lt;/form&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Oct 2008 15:17:19 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-24:touchcodedonate.html</guid></item><item><title>Obama ‘08 talk @ CocoaHeads Portland on Wednesday 8th October</title><link>http://toxicsoftware.com/obama_cocoaheads_portland.html</link><description>&lt;p&gt;&lt;a href="http://raven.me/2008/10/02/obama-08-for-iphone/"&gt;Raven Zachary&lt;/a&gt; and myself are going to be at the &lt;a href="http://upcoming.yahoo.com/event/1165327"&gt;Wednesday Oct. 8&lt;/a&gt; meeting of &lt;a href="http://cocoaheads.org/us/PortlandOregon/index.html"&gt;Portland Cocoaheads&lt;/a&gt; discussing the &lt;a href="http://www.barackobama.com/iphone/"&gt;Obama &amp;#8216;08 application&lt;/a&gt; and its &lt;a href="http://toxicsoftware.com/obama08.html"&gt;development&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 06 Oct 2008 12:45:14 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-06:obama_cocoaheads_portland.html</guid></item><item><title>TouchMap</title><link>http://toxicsoftware.com/touchmap.html</link><description>&lt;p&gt;I was going to make a more in-depth posting about &lt;a href="http://toxicsoftware.com/touchmap-teaser.html"&gt;TouchMap&lt;/a&gt;, but then something &lt;a href="http://toxicsoftware.com/obama08.html"&gt;kind of big&lt;/a&gt; happened. &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;The code&lt;/a&gt; is however in the TouchCode google code repository. So have at it. (You&amp;#8217;ll probably want to check out all of TouchCode, TouchMap currently depends on other code within the&amp;nbsp;repository).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 06 Oct 2008 00:31:21 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-06:touchmap.html</guid></item><item><title>Looking for iPhone Software Professionals?</title><link>http://toxicsoftware.com/iphoneswpro.html</link><description>&lt;h3&gt;The&amp;nbsp;problem:&lt;/h3&gt;
&lt;p&gt;I make my living by writing iPhone and Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X for hire. I&amp;#8217;ve been doing this for a while with some level of success. But ever since the iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt; was announced earlier this year I&amp;#8217;ve been getting many, many more work enquiries than I could possibly handle. I&amp;#8217;ve often referred enquiries to friends who I have either worked with in the past or whose work I respect. But this ad-hoc system doesn&amp;#8217;t scale very&amp;nbsp;well.&lt;/p&gt;
&lt;h3&gt;The&amp;nbsp;Solution:&lt;/h3&gt;
&lt;p&gt;To try and make this informal referral approach work I&amp;#8217;ve set up a &lt;em&gt;private&lt;/em&gt; invite only Google Group called &amp;#8220;iPhone Software Professionals&amp;#8221;. Currently this group is made up of a handful (more than 10 less than 1000) software developers who specialise in iPhone development (although I&amp;#8217;d say all are equally capable on Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X). The group is made up of either people I have worked with personally (and would love to work with again) or people whose work has generated such a reputation that I would have no problem recommending them to a potential&amp;nbsp;client.&lt;/p&gt;
&lt;p&gt;The list is currently made up of software developers but I would like to open it open it up to any independent professional involved in the production of iPhone software. This includes, but is not limited to usability experts, graphic designers, quality assurance experts and so&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;The group will probably remain quite small, with new members invited and referred only by current members. There is no commission or finder&amp;#8217;s fee involved, the group is just an informal group of professionals forwarding work that would otherwise be&amp;nbsp;rejected.&lt;/p&gt;
&lt;h3&gt;Looking for an iPhone Software&amp;nbsp;Professional?&lt;/h3&gt;
&lt;p&gt;So if you have some iPhone software that needs to be written then I think I might be able to find someone to help you out. I might be able to help you myself, but if I have more work than I can handle (which currently is very likely) I&amp;#8217;ll forward your request to the group. Either way contact me directly at &lt;a href="http://toxicsoftware.com/contact.html"&gt;iphoneswpro@toxicsoftware.com&lt;/a&gt; and I&amp;#8217;ll try make sure your software gets&amp;nbsp;written.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;Please do not request an invite directly via Google Groups. See http://toxicsoftware.com/iphoneswpro/ for information on how to join the group. Essentially it helps if you or your work is known and respected by myself or other members of the group. You can use the email address to send a request directly to&amp;nbsp;me.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re not invited into the group please do not take it personally. I&amp;#8217;m trying to keep a good balance between job leads posted to the group and freelancers able to consume the job leads. If the balance is good (or there are too few job leads) we will not be adding new developers to the&amp;nbsp;group.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 04 Oct 2008 21:33:10 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-04:iphoneswpro.html</guid></item><item><title>Obama 08</title><link>http://toxicsoftware.com/obama08.html</link><description>&lt;p&gt;Well, the &lt;a href="http://www.flickr.com/photos/61285556@N00/2906862481" title="View 'Obama '08 AppStore' on Flickr.com"&gt;
 project&lt;a&gt; I was so &lt;a href="http://toxicsoftware.com/great-excitement.html"&gt;excited about&lt;/a&gt; last week has now officially seen the light of day and is on the iPhone AppStore. The project is the &lt;a href="http://www.barackobama.com/iphone/"&gt;Official iPhone application for the Obama/Biden &amp;#8216;08 campaign&lt;/a&gt; (Direct link to &lt;a href="http://toxicsoftware.com/great-excitement.html"&gt;AppStore&lt;/a&gt;!).&lt;/p&gt;
&lt;p&gt;The application was created in less than three weeks by an all volunteer team of ten developers, artists, web designers, quality assurance specialists and project managers. You can see the name of everyone who worked on it in the &lt;a href="http://www.flickr.com/photos/61285556@N00/2906830739" title="View 'Obama '08 Credits' on Flickr.com"&gt;credits&lt;/a&gt; of the application&amp;nbsp;itself.&lt;/p&gt;
&lt;p&gt;I started work on the application the day after C4&lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=292168926&amp;amp;mt=8"&gt;2&lt;/a&gt; after some very clandestine meetings in Chicago. After about a week of writing TouchRSS code on my own, the project suddenly jumped into high gear, with the indomitable &lt;a href="http://www.atomicwang.org/motherfucker/Index/Index.html"&gt;Mike Lee&lt;/a&gt;, &lt;a href="http://www.otierney.net"&gt;Tristan O&amp;#8217;Tierney&lt;/a&gt; and incredibly talented &lt;a href="http://www.louiemantia.com"&gt;Louie Mantia&lt;/a&gt; (responsible for the application&amp;#8217;s amazing and distinctive&amp;nbsp;look).&lt;/p&gt;
&lt;p&gt;I feel really honoured to have worked with such a great team (see &lt;a href="http://raven.me/2008/10/02/obama-08-for-iphone/"&gt;Raven Zachary&amp;#8217;s blog posting&lt;/a&gt; for links to everyone). The project was a sprint and of course suffered from a lot of ups and downs. But I think we managed to create a really great application in a very short space of&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;Here are some blog postings from the other team&amp;nbsp;members&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.aileenjeffries.com/?p=40"&gt;Aileen&amp;nbsp;Jeffries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iphonedevcamp.org/2008/10/02/obama-08-iphone-app/"&gt;Dom&amp;nbsp;Sagolla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://userfirstweb.com/307/announcing-obama-08-iphone-application/"&gt;Jason&amp;nbsp;Grigsby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://louiemantia.com/blog/?p=31"&gt;Louis&amp;nbsp;Mantia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lyza.com/2008/10/02/obama-iphone-app/"&gt;Lyza Danger&amp;nbsp;Gardner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.atomicwang.org/alison/"&gt;Mike&amp;nbsp;Lee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://raven.me/2008/10/02/obama-08-for-iphone/"&gt;Raven&amp;nbsp;Zachary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Official&amp;nbsp;Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.barackobama.com/iphone/"&gt;http://www.barackobama.com/iphone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=292168926&amp;amp;mt=8"&gt;AppStore&amp;nbsp;Link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 02 Oct 2008 16:17:59 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-02:obama08.html</guid></item><item><title>TouchMap Teaser</title><link>http://toxicsoftware.com/touchmap-teaser.html</link><description>&lt;p&gt;A quick teaser for TouchMap. I&amp;#8217;m hoping to release this on &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchCode&lt;/a&gt; later&amp;nbsp;today.&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/TouchMap.mov"&gt;TouchMap.mov&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 01 Oct 2008 20:58:20 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-01:touchmap-teaser.html</guid></item><item><title>NDA Day</title><link>http://toxicsoftware.com/nda-day.html</link><description>&lt;p&gt;&lt;a href="http://developer.apple.com/iphone/program/"&gt;http://developer.apple.com/iphone/program/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you&amp;nbsp;Apple.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 01 Oct 2008 15:35:55 -0700</pubDate><guid>tag:toxicsoftware.com,2008-10-01:nda-day.html</guid></item><item><title>Great Excitement</title><link>http://toxicsoftware.com/great-excitement.html</link><description>&lt;p&gt;The following tweets are one of reasons why I (despite initial misgivings) really enjoy&amp;nbsp;Twitter.&lt;/p&gt;
&lt;p&gt;I can&amp;#8217;t talk about the actual thing in question until Sunday 28th at the earliest (probably more like Monday). But I&amp;#8217;m very excited (as you can tell by the fact it is four &lt;span class="caps"&gt;AM&lt;/span&gt; and adrenaline is still keeping me awake) about it and can&amp;#8217;t wait for it to be&amp;nbsp;released&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![schwa_normal]&lt;a href="http://twitter.com/schwa"&gt;&lt;/a&gt;[] I want to tweet something of great excitement and interest to many of you. But I can&amp;#8217;t. &lt;span class="caps"&gt;SO&lt;/span&gt; pretend I did and &lt;span class="caps"&gt;JUST&lt;/span&gt; &lt;span class="caps"&gt;CONGRATULATE&lt;/span&gt; &lt;span class="caps"&gt;ME&lt;/span&gt;.\
 &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![lyza_young_normal]&lt;a href="http://twitter.com/lyzadanger"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Ditto.\
 &lt;em&gt;&lt;a href="http://twitter.com/lyzadanger/statuses/933942281"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from web&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![anne_normal]&lt;a href="http://twitter.com/annekate"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Congratulations, ya lucky bastard!\
 &lt;em&gt;&lt;a href="http://twitter.com/annekate/statuses/933943326"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![Uncanny_normal]&lt;a href="http://twitter.com/chockenberry"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; &lt;span class="caps"&gt;YOU&lt;/span&gt; &lt;span class="caps"&gt;ARE&lt;/span&gt; &lt;span class="caps"&gt;AWESOME&lt;/span&gt; &lt;span class="caps"&gt;BIG&lt;/span&gt; &lt;span class="caps"&gt;THUMBS&lt;/span&gt; &lt;span class="caps"&gt;UP&lt;/span&gt; &lt;span class="caps"&gt;FOR&lt;/span&gt; &lt;span class="caps"&gt;YOU&lt;/span&gt;\
 &lt;em&gt;&lt;a href="http://twitter.com/chockenberry/statuses/933943491"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![danimal_icon_normal]&lt;a href="http://twitter.com/SenorDanimal"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; congratulations Jonathan! (payment can be sent to me via check or cash)\
 &lt;em&gt;&lt;a href="http://twitter.com/SenorDanimal/statuses/933943639"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![mara_square_normal]&lt;a href="http://twitter.com/oleoptene"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; and @&lt;a href="http://twitter.com/lyzadanger"&gt;lyzadanger&lt;/a&gt; my most discreet congratulations!\
 &lt;em&gt;&lt;a href="http://twitter.com/oleoptene/statuses/933944431"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from web&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![deslock-avatar_normal]&lt;a href="http://twitter.com/tjw"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Go code tease, go!\
 &lt;em&gt;&lt;a href="http://twitter.com/tjw/statuses/933944734"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![tom-manga_normal]&lt;a href="http://twitter.com/atomicbird"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Congratulations, I&amp;#8217;m sure!\
 &lt;em&gt;&lt;a href="http://twitter.com/atomicbird/statuses/933948146"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![MyEye_normal]&lt;a href="http://twitter.com/mzarra"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Congratulations!!\
 &lt;em&gt;&lt;a href="http://twitter.com/mzarra/statuses/933948908"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![11140704_normal]&lt;a href="http://twitter.com/sherryness"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Nice job! *high five*\
 &lt;em&gt;&lt;a href="http://twitter.com/sherryness/statuses/933949720"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from web&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![BBC_TIKI_normal]&lt;a href="http://twitter.com/bobtiki"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; congratulations!\
 &lt;em&gt;&lt;a href="http://twitter.com/bobtiki/statuses/933949804"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![5-3-03_020_1_normal]&lt;a href="http://twitter.com/hjon"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Congratulations! For nothing. ;-)\
 &lt;em&gt;&lt;a href="http://twitter.com/hjon/statuses/933950540"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![joe_normal]&lt;a href="http://twitter.com/heckj"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Congrats, absolutely and obviously.\
 &lt;em&gt;&lt;a href="http://twitter.com/heckj/statuses/933954016"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![wolfClose_normal]&lt;a href="http://twitter.com/rentzsch"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; . Fault may be resolved upon submission of actual data\
 &lt;em&gt;&lt;a href="http://twitter.com/rentzsch/statuses/933955942"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![Photo_41_normal]&lt;a href="http://twitter.com/bsneed"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; w00!! congrats on [insert neat shit here]!!!\
 &lt;em&gt;&lt;a href="http://twitter.com/bsneed/statuses/933957100"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![Picture_1_normal]&lt;a href="http://twitter.com/brentsimmons"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Congrats!\
 &lt;em&gt;&lt;a href="http://twitter.com/brentsimmons/statuses/933959647"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![Photo_9_normal]&lt;a href="http://twitter.com/rcw3"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Grats!!!\
 &lt;em&gt;&lt;a href="http://twitter.com/rcw3/statuses/933963805"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![ash_normal]&lt;a href="http://twitter.com/ashponders"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; wooo!\
 &lt;em&gt;&lt;a href="http://twitter.com/ashponders/statuses/933967979"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![danimal_icon_normal]&lt;a href="http://twitter.com/SenorDanimal"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; of course this reminds me I need to d/l touchcode before I get on my return flight so I can mess with it.\
 &lt;em&gt;&lt;a href="http://twitter.com/SenorDanimal/statuses/933970427"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![goofy_normal]&lt;a href="http://twitter.com/somegeekintn"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Oh hey, congratulations!\
 &lt;em&gt;&lt;a href="http://twitter.com/somegeekintn/statuses/933970551"&gt;about 3 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![Photo_5_normal]&lt;a href="http://twitter.com/ganyard"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; Who&amp;#8217;s the rock star? You are. You are man. You, you&amp;#8217;re a rock star.\
 &lt;em&gt;&lt;a href="http://twitter.com/ganyard/statuses/933983761"&gt;about 2 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![IMG_2515_normal]&lt;a href="http://twitter.com/natevw"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; [&lt;span class="caps"&gt;REDACTED&lt;/span&gt;]\
 &lt;em&gt;&lt;a href="http://twitter.com/natevw/statuses/933995948"&gt;about 2 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![bob_normal_normal]&lt;a href="http://twitter.com/chicagobob"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/rentzsch"&gt;rentzsch&lt;/a&gt; &amp;#8216;s congratulations to @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; totally &lt;span class="caps"&gt;FTW&lt;/span&gt;\
 &lt;em&gt;&lt;a href="http://twitter.com/chicagobob/statuses/934009280"&gt;about 2 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/rentzsch/statuses/933955942"&gt;in reply to rentzsch&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![318766470_d9340c5b83_normal]&lt;a href="http://twitter.com/dom"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; you are superhuman.\
 &lt;em&gt;&lt;a href="http://twitter.com/dom/statuses/934021183"&gt;about 2 hours ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![scottyavatar_normal]&lt;a href="http://twitter.com/macdevnet"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; that was the most awsome tweet ever man, you&amp;#8217;ve raised the bar for us all, well done\
 &lt;em&gt;&lt;a href="http://twitter.com/macdevnet/statuses/934034746"&gt;about 1 hour ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/933941173"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![Dirk_Schalge_normal]&lt;a href="http://twitter.com/janl"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; &lt;span class="caps"&gt;CONGRATS&lt;/span&gt;!\
 &lt;em&gt;&lt;a href="http://twitter.com/janl/statuses/934044805"&gt;about 1 hour ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitterhelp.blogspot.com/2008/05/twitter-via-mobile-web-mtwittercom.html"&gt;mobile web&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/934024521"&gt;in reply to&amp;nbsp;schwa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![avatar_large_modified_sepia_normal]&lt;a href="http://twitter.com/simX"&gt;&lt;/a&gt;[] @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; is like Bush and his Twitter followers are like the Democratic Congress: he tells them to do things (congratulate him) and they do it &lt;em&gt;&lt;a href="http://twitter.com/simX/statuses/934067332"&gt;24 minutes ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from web&lt;/em&gt; &lt;em&gt;&lt;a href="http://twitter.com/schwa/statuses/934024521"&gt;in reply to schwa&lt;/a&gt;&lt;/em&gt;&amp;nbsp;-&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;![avatar_large_modified_sepia_normal]&lt;a href="http://twitter.com/simX"&gt;&lt;/a&gt;[] &lt;span class="caps"&gt;OH&lt;/span&gt; &lt;span class="caps"&gt;YES&lt;/span&gt; I &lt;span class="caps"&gt;DID&lt;/span&gt; &lt;span class="caps"&gt;GO&lt;/span&gt; &lt;span class="caps"&gt;THERE&lt;/span&gt; I &lt;span class="caps"&gt;JUST&lt;/span&gt; &lt;span class="caps"&gt;SAID&lt;/span&gt; @&lt;a href="http://twitter.com/schwa"&gt;schwa&lt;/a&gt; &lt;span class="caps"&gt;AND&lt;/span&gt; &lt;span class="caps"&gt;BUSH&lt;/span&gt; &lt;span class="caps"&gt;IN&lt;/span&gt; &lt;span class="caps"&gt;THE&lt;/span&gt; &lt;span class="caps"&gt;SAME&lt;/span&gt; &lt;span class="caps"&gt;SENTENCE&lt;/span&gt;. &lt;em&gt;&lt;a href="http://twitter.com/simX/statuses/934067921"&gt;13 minutes ago&lt;/a&gt;&lt;/em&gt; &lt;em&gt;from&amp;nbsp;web&lt;/em&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 25 Sep 2008 08:05:46 -0700</pubDate><guid>tag:toxicsoftware.com,2008-09-25:great-excitement.html</guid></item><item><title>TouchCode Wins Best Open Source Project at iPhoneDevCamp</title><link>http://toxicsoftware.com/touchcode_wins.html</link><description>&lt;p&gt;I&amp;#8217;m really happy to be able to say that &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchCode&lt;/a&gt; won the &amp;#8220;Best Open Source Project&amp;#8221; at &lt;a href="http://www.iphonedevcamp.org"&gt;iPhoneDevCamp&lt;/a&gt; this weekend. The prize was a gift certificate for an iPhone 3G (a big thank you to &lt;a href="http://applephoneshow.com"&gt;Apple Phone Show&lt;/a&gt; for sponsoring this award). Very&amp;nbsp;awesome.&lt;/p&gt;
&lt;p&gt;While it was really gratifying to be recognised by the judges of the competition, it was even more gratifying to see portions of TouchCode in use by the some of other winning contestants. The Taxi application in particular stood out as a great use-case for TouchJSON and I really expect Taxi to sell like hot cakes when it gets uploaded to the&amp;nbsp;AppStore.&lt;/p&gt;
&lt;p&gt;I had a great time talking to other iPhoneDevCamp attendees, some of which wanted to thank me for parts of TouchCode. Other attendees were interested in the project and I relished the chance to tell them all about. Hopefully I&amp;#8217;ll be able to add more projects to my &amp;#8220;&lt;a href="http://toxicsoftware.com/touchcode-usage.html"&gt;who uses TouchCode&lt;/a&gt;&amp;#8221; blog&amp;nbsp;post.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 04 Aug 2008 16:46:17 -0700</pubDate><guid>tag:toxicsoftware.com,2008-08-04:touchcode_wins.html</guid></item><item><title>TouchCode Loving</title><link>http://toxicsoftware.com/touchcode-loving.html</link><description>&lt;p&gt;I&amp;#8217;m at &lt;a href="http://toxicsoftware.com/iphonedevcamp.html"&gt;iPhoneDevCamp&lt;/a&gt; and am entering all three of my TouchCode libaries (TouchJSON, TouchXML and TouchSQL) into the development&amp;nbsp;contest.&lt;/p&gt;
&lt;p&gt;This is a great chance for consumers of these three libraries to show their appreciation by &lt;a href="http://iphone.iusethis.com/tag/touchcode"&gt;voting for them on iUseThis.com&lt;/a&gt;. Please go to the tag page iUseThis.com and mark the libraries you use (or plan on using, or just really dig&amp;nbsp;then). &lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/touchcode-usage.html"&gt;As you can see&lt;/a&gt; there are a few well known users of TouchCode already. I know of a few other well known apps that use TouchCode but for various reasons have not been able to comment in that&amp;nbsp;post.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
&lt;p&gt;Vote here: &lt;a href="http://iphone.iusethis.com/tag/touchcode"&gt;http://iphone.iusethis.com/tag/touchcode&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 03 Aug 2008 18:12:43 -0700</pubDate><guid>tag:toxicsoftware.com,2008-08-03:touchcode-loving.html</guid></item><item><title>Seth’s 2008 PMC Software Auctions</title><link>http://toxicsoftware.com/pmcsoftware.html</link><description>&lt;p&gt;&lt;a href="http://www.truerwords.net/fundraising/pmcsoftware/"&gt;&lt;img
  src="http://media.truerwords.net/images/pmc/donations_wanted_2008_300.png"
  width="300" height="198" align="left" alt="Donate Software, Fight Cancer" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.truerwords.net/fundraising/pmcsoftware/"&gt;Online friend Seth Dillingham&lt;/a&gt; this weekend is &amp;#8220;riding across the state of Massachusetts in the &lt;span class="caps"&gt;PMC&lt;/span&gt;, along with about 5500 other riders. Riding the bike for 300 miles is the easy part. The real challenge is meeting my $10,000 goal for this cancer-care-and-treatment&amp;nbsp;charity.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Much like &lt;a href="http://clickablebliss.com"&gt;Mike Zornek&amp;#8217;s&lt;/a&gt; &lt;a href="http://ironcoder.org/blog/childs-play-day/"&gt;Child&amp;#8217;s Play Day&lt;/a&gt; auction back in 2006 Seth is asking for Indie software developers to donate licenses of their software to him. Seth will then auction off the software on ebay to help raise $10,000 for the&amp;nbsp;charity.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m leaving it a little late to blog about this event, and I&amp;#8217;m sure most of the indie developers already know about the event (there are 126 applications already donated right now) but any more eyeballs I can send Seth&amp;#8217;s way would be&amp;nbsp;appreciated.&lt;/p&gt;
&lt;p&gt;Even if you&amp;#8217;re a developer you can help by donating directly (follow link &lt;a href="http://www.truerwords.net/fundraising/how-to-pmc.html"&gt;here&lt;/a&gt;) or by buying the donated software when it is auctioned, see Seth&amp;#8217;s blog for more&amp;nbsp;information.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 30 Jul 2008 03:13:26 -0700</pubDate><guid>tag:toxicsoftware.com,2008-07-30:pmcsoftware.html</guid></item><item><title>iPhoneDevCamp</title><link>http://toxicsoftware.com/iphonedevcamp.html</link><description>&lt;p&gt;My former co-worker and good friend &lt;a href="http://www.rinzai.com"&gt;Raven Zachary&lt;/a&gt; is hosting the second &lt;a href="http://www.iphonedevcamp.org"&gt;iPhoneDevCamp&lt;/a&gt; event in San Francisco this weekend. I&amp;#8217;m making the trip out to be there. Should be fun. My &lt;a href="http://toxicsoftware.com/contact.html"&gt;contact&lt;/a&gt; info is still in place from&amp;nbsp;&lt;span class="caps"&gt;WWDC&lt;/span&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 28 Jul 2008 23:40:12 -0700</pubDate><guid>tag:toxicsoftware.com,2008-07-28:iphonedevcamp.html</guid></item><item><title>TouchCode Usage</title><link>http://toxicsoftware.com/touchcode-usage.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchCode&lt;/a&gt; is my iPhone Open Source umbrella project encompassing a bunch of technologies that for various reasons Apple decided not to include with Cocoa&amp;nbsp;Touch.&lt;/p&gt;
&lt;p&gt;TouchCode is made up&amp;nbsp;of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchXML&lt;/a&gt; - A document tree &lt;span class="caps"&gt;XML&lt;/span&gt; library with XPath support (based on Cocoa&amp;#8217;s&amp;nbsp;NSXMLDocument)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchJSON&lt;/a&gt; - An extremely fast and memory efficient library for processing and creating &lt;span class="caps"&gt;JSON&lt;/span&gt;&amp;nbsp;data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TouchSQL - Yet another Objective-C lightweight sqlite&amp;nbsp;wrapper.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m going to be adding more sub-projects to TouchCode &lt;strike&gt;now that the iPhone developer &lt;span class="caps"&gt;NDA&lt;/span&gt; seems to be lifted&lt;/strike&gt;. But I&amp;#8217;m curious, how many applications on the appstore are using parts of TouchCode? I know of a handful of applications using parts of TouchCode but would like to find out about the&amp;nbsp;rest.&lt;/p&gt;
&lt;p&gt;If you use any part of TouchCode in an iPhone application that is either on or about to uploaded to the AppStore I would love to know about it. Please feel free to email me (schwa &lt;em&gt;at&lt;/em&gt; this domain) the name of the application and what parts of TouchCode you use, or add a comment to this blog&amp;nbsp;post.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 16 Jul 2008 15:04:29 -0700</pubDate><guid>tag:toxicsoftware.com,2008-07-16:touchcode-usage.html</guid></item><item><title>How I got started programming</title><link>http://toxicsoftware.com/how-i-got-started-programming.html</link><description>&lt;p&gt;Anne at &lt;a href="http://www.randomnonsequitur.com/post/32"&gt;random non sequitur&lt;/a&gt; tagged me to write up a &amp;#8220;How I got started programming&amp;#8221; blog post. I don&amp;#8217;t normally do this kind of thing, but I was very flattered to be included in her list of bloggers tagged and Anne is a really nice person, so I thought what the&amp;nbsp;heck&amp;#8230;&lt;/p&gt;
&lt;h4&gt;How old were you when you started&amp;nbsp;programming?&lt;/h4&gt;
&lt;p&gt;About 10. My teacher in Middle School hauled out a Sinclair &lt;a href="http://en.wikipedia.org/wiki/Sinclair_ZX80"&gt;&lt;span class="caps"&gt;ZX&lt;/span&gt;-80&lt;/a&gt; hooked up to a black &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; white &lt;span class="caps"&gt;TV&lt;/span&gt; and we entered a very simple &lt;span class="caps"&gt;BASIC&lt;/span&gt; program. This was probably the first time I had ever touched a real computer in my life. I also remember arguing with my classmates about how to enter the program using the &lt;span class="caps"&gt;ZX&lt;/span&gt;-80&amp;#8217;s symbol based keyboard, I was obviously a big proponent of egoless programming even&amp;nbsp;then.&lt;/p&gt;
&lt;h4&gt;How did you get started in&amp;nbsp;programming?&lt;/h4&gt;
&lt;p&gt;No Apple &lt;span class="caps"&gt;II&lt;/span&gt; here! My parents bought me a &lt;a href="http://en.wikipedia.org/wiki/Sinclair_ZX81"&gt;&lt;span class="caps"&gt;ZX&lt;/span&gt;-81&lt;/a&gt; in 1981/1982 into which I faithfully typed programs from magazines and books. I ended up doing a lot of tweaking of these programs. First trying to shrink the larger, more complex programs into my meagre &lt;span class="caps"&gt;1KB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt; (later on I got a &lt;span class="caps"&gt;16KB&lt;/span&gt; &lt;span class="caps"&gt;RAM&lt;/span&gt; pack!). And then changing the gameplay and adding features. This soon evolved into writing my own simple games. I remember writing little text based lunar lander games which then evolved into text based flight sims (no, really). I also had great fun writing some rather complex Kingdom/Hammuribi style games (one of which, running on an Amstrad &lt;span class="caps"&gt;PCW&lt;/span&gt; word processor became rather huge and involved and was probably several thousand lines of &lt;span class="caps"&gt;CP&lt;/span&gt;/M&amp;nbsp;pascal).&lt;/p&gt;
&lt;h4&gt;What was your first&amp;nbsp;language?&lt;/h4&gt;
&lt;p&gt;Sinclair Basic. I was a big Sinclair fan, going from &lt;span class="caps"&gt;ZX&lt;/span&gt;-81 to &lt;span class="caps"&gt;ZX&lt;/span&gt;-Spectrum+ to &lt;span class="caps"&gt;ZX&lt;/span&gt;-Spectrum 128. Fortunately I skipped the &lt;span class="caps"&gt;QL&lt;/span&gt; and the&amp;nbsp;C5.&lt;/p&gt;
&lt;h4&gt;What was the first real program you&amp;nbsp;wrote?&lt;/h4&gt;
&lt;p&gt;The first real program that I wrote for other people&amp;#8217;s consumption was a tool for finding the distance between two points on a map of the United Kingdom. I guess I&amp;#8217;ve been writing geographical based programs for a really really long time now. This was my O-Level project at Secondary and was written on the &lt;a href="http://en.wikipedia.org/wiki/BBC_Micro"&gt;&lt;span class="caps"&gt;BBC&lt;/span&gt; Model B&lt;/a&gt; computer. I wonder what kids do for their final year projects in GCSEs now in the &lt;span class="caps"&gt;UK&lt;/span&gt;, program full games written in C++ with&amp;nbsp;OpenGL?&lt;/p&gt;
&lt;h4&gt;What languages have you used since you started&amp;nbsp;programming?&lt;/h4&gt;
&lt;p&gt;In chronological order: Sinclair Basic, Acorn Basic (it had procedures!) Z-80 Assembly (without an assembler I might add, I would translate the program into hex by hand. Slow and tedious.), &lt;span class="caps"&gt;LISP&lt;/span&gt;, &lt;span class="caps"&gt;COBOL&lt;/span&gt; (on &lt;span class="caps"&gt;VAX&lt;/span&gt; &lt;span class="caps"&gt;VMS&lt;/span&gt; and then &lt;span class="caps"&gt;SCO&lt;/span&gt; Xenix box), Pascal (many varieties), 68K Assembly, &lt;span class="caps"&gt;ADA&lt;/span&gt;, C, C++, Python, Objective-C. And lots more that I either can&amp;#8217;t remember, didn&amp;#8217;t get much beyond &amp;#8220;hello world&amp;#8221; level competency, have been trying go forget or don&amp;#8217;t really qualify as a language (javascript! &lt;em&gt;snark&lt;/em&gt;).&lt;/p&gt;
&lt;h4&gt;If there is one thing you learned along the way that you would tell new developers, what would it&amp;nbsp;be?&lt;/h4&gt;
&lt;p&gt;Oh god. How about this? Kind of like how travel is said to broaden the mind, I think learning (or at least dabbling) in a lot of different languages broadens a developer&amp;#8217;s mind. Even if you don&amp;#8217;t end up writing software in a new language it will at least change your perspective a little and stop you from getting stuck in a single language&amp;nbsp;rut.&lt;/p&gt;
&lt;h4&gt;What&amp;rsquo;s the most fun you&amp;rsquo;ve ever had&amp;nbsp;programming?&lt;/h4&gt;
&lt;p&gt;Not sure there&amp;#8217;s a single most fun moment. And if there is, it would be due to the people I was working with, or the situation and so on. I have a lot of great stories about the 15+ years I&amp;#8217;ve been doing this professionally, but that&amp;#8217;s the kind of thing that needs telling over a beer. I do find programming to (generally) be one of the most fun things I can do. External factors aside, I always get a kick out of programming, there&amp;#8217;s something about it that just nourishes my mind. So it&amp;#8217;s always fun, or at least&amp;nbsp;engaging.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 08 Jul 2008 05:30:18 -0700</pubDate><guid>tag:toxicsoftware.com,2008-07-08:how-i-got-started-programming.html</guid></item><item><title>WWDC 08</title><link>http://toxicsoftware.com/wwdc-08.html</link><description>&lt;p&gt;Off to &lt;span class="caps"&gt;WWDC&lt;/span&gt; in a few hours. I&amp;#8217;ve updated my &lt;a href="http://toxicsoftware.com/contact.html"&gt;contact page&lt;/a&gt; with my mobile phone number in case anyone wants to get ahold of me&amp;nbsp;directly.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m going to try attending most of the events conveniently compiled &lt;a href="http://www.iphonedevcamp.org/2008/06/06/wwdc08-meetups/"&gt;here&lt;/a&gt; by iPhoneDevCamp. Hope to see to see you&amp;nbsp;there.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 08 Jun 2008 02:02:42 -0700</pubDate><guid>tag:toxicsoftware.com,2008-06-08:wwdc-08.html</guid></item><item><title>iPhone Development</title><link>http://toxicsoftware.com/iphone_dev.html</link><description>&lt;p&gt;I don&amp;#8217;t need to say too much about the iPhone and the newly released &lt;span class="caps"&gt;SDK&lt;/span&gt;. I have however created a &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Google source code&lt;/a&gt; repository for iPhone/Cocoa Touch related&amp;nbsp;projects. &lt;/p&gt;
&lt;p&gt;So far I&amp;#8217;ve added three projects to the&amp;nbsp;repository:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TouchXML: A Foundation &lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/NSXML_Concepts/NSXML.html"&gt;&lt;span class="caps"&gt;NSXML&lt;/span&gt;&lt;/a&gt; style &lt;span class="caps"&gt;API&lt;/span&gt; for parsing &lt;span class="caps"&gt;XML&lt;/span&gt; files (based on&amp;nbsp;libxml2)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TouchSQL: Yet another library for talking to sqlite databases. This is actually old code that I&amp;#8217;m bringing up to date for 10.5, the iPhone and&amp;nbsp;objc-2.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TouchJSON: My [CocoaJSON] project brought up to&amp;nbsp;date.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m trying to add Unit Tests and documentation to all three projects so they&amp;#8217;ll be suitable for public&amp;nbsp;consumption.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.neontology.com"&gt;Tim Burks&lt;/a&gt; has also graciously added &lt;a href="http://programming.nu"&gt;nu&lt;/a&gt; makefiles and unit tests for each project too. Thanks&amp;nbsp;Tim.&lt;/p&gt;
&lt;p&gt;Oh&amp;nbsp;and&amp;#8230;&lt;/p&gt;
&lt;p&gt;Yes I am potentially interested in iPhone related consulting work. &lt;a href="http://toxicsoftware.com/contact.html"&gt;jwight@mac.com&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 10 Mar 2008 20:50:03 -0700</pubDate><guid>tag:toxicsoftware.com,2008-03-10:iphone_dev.html</guid></item><item><title>AcornImage</title><link>http://toxicsoftware.com/acornimage.html</link><description>&lt;p&gt;It was just your typical InterfaceBuilder 3&amp;nbsp;window&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/acornimageib3.png"&gt;&lt;img alt="AcornImageIB3.png" src="/uploads/acornimageib3.thumbnail.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;with your vanilla&amp;nbsp;NSImageView&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/acornimageview.png"&gt;&lt;img alt="AcornImageView.png" src="/uploads/acornimageview.thumbnail.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;referring to an image file within an Xcode&amp;nbsp;project&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/acorninxcode.png"&gt;&lt;img alt="AcornInXcode.png" src="/uploads/acorninxcode.thumbnail.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.hospitalgowns.com/Buy_Bouffant_Pages/A0822b.htm"&gt;Holy Cow!&lt;/a&gt; An &lt;a href="http://www.flyingmeat.com/acorn/"&gt;Acorn&lt;/a&gt; file? Does that mean I can use Acorn files directly in Interface Builder 3? Does that mean you&amp;#8217;ve written an NSCustomImageRep that understands the Acorn file format? Does that mean I can use Acorn files directly in my Cocoa projects? And that means I no longer have to keep exporting these bloody files as pngs so I can use them in Cocoa, right? Will this give rixstep some ammunition to go apeshit insane&amp;nbsp;about?&lt;/p&gt;
&lt;p&gt;Yes! Yes!! Yes!!! Yes!!!! Yes!!!!! Almost&amp;nbsp;certainly.&lt;/p&gt;
&lt;p&gt;Not only does Gus Mueller generously provide details about the &lt;a href="http://flyingmeat.com/wikka/AcornFileFormat"&gt;Acorn file format&lt;/a&gt;, he has even released the source code to his Acorn Quicklook plugin. This gives me everything I need to convince NSImage to load Acorn&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;You might well be asking yourself why. I was getting annoyed with having to constantly keep exporting original Acorn images as pngs or TIFFs so I could use them in Xcode. I&amp;#8217;m prototyping a new application that uses a lot of custom &lt;span class="caps"&gt;UI&lt;/span&gt; elements. These elements are made up of one or more pngs, some of which needed a lot of tweaking and attention to detail to get right. Acorn is perfect for &lt;span class="caps"&gt;UI&lt;/span&gt; work (although it needs more than 2000% zoom! &lt;em&gt;cough&lt;/em&gt;) but having to export as png (or another format that Cocoa understands natively) and manage two sets of images (original Acorn, exported png) was turning into a&amp;nbsp;pain.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve taken Gus&amp;#8217; QuickLook code and wrapped a small &lt;a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCustomImageRep_Class/Reference/Reference.html"&gt;NSCustomImageRep&lt;/a&gt; around it. Very small. I&amp;#8217;ve repackaged it up as a Framework so you can refer to it from an Interface Builder 3 plugin. This gives you the ability to do&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSImage&lt;/span&gt; &lt;span class="nl"&gt;imageNamed:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;IAmAnAcornFile&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You should be able to use Acorn files anywhere an NSImage is used. Just embed your Acorn files in your XCode project resources and refer to them by name in your NIBs or in&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve put the code on my public googlecode.com subversion &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;repository&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;I&amp;#8217;m currently on the fence about whether it is a good idea or not to ship your application with Acorn images. It certainly makes sense to me to use them during the interface design stage of application development. Once the user interface churn settles down I should be able to finalize the images and convert them to pngs or whatever (keeping the originals of&amp;nbsp;course).&lt;/p&gt;
&lt;p&gt;A best of both worlds solution might be to make a little command line tool that can convert Acorn&amp;nbsp;files:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;AcornImage&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="c"&gt;# Everything else is an exercise for the reader.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;And then automatically convert from Acorn to whatever during the Xcode build process. I might investigate this technique at a later date. But for now - have at&amp;nbsp;it.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 19 Feb 2008 15:05:58 -0800</pubDate><guid>tag:toxicsoftware.com,2008-02-19:acornimage.html</guid></item><item><title>Making Mercurial use the Mac OS X Keychain</title><link>http://toxicsoftware.com/hgkeychain.html</link><description>&lt;p&gt;I&amp;#8217;ve taken the plunge and am in the middle of switching from Subversion to Mercurial for revision control. Subversion has served me relatively faithfully for many years (I&amp;#8217;ve even championed/led the adoption of subversion at two companies I&amp;#8217;ve worked for in the past) but some of the warts and shortcomings were beginning to annoy me (. directories everywhere for example). Dave Dribin&amp;#8217;s &lt;a href="http://www.dribin.org/dave/blog/archives/2007/12/30/why_mercurial/"&gt;series of posts&lt;/a&gt; about the Mercurial &lt;span class="caps"&gt;DVCS&lt;/span&gt; software piqued my interest and I was soon switching  repositories to&amp;nbsp;hg.&lt;/p&gt;
&lt;p&gt;One feature that  added recently that hg lacked was the ability to store repository passwords in the Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X keychain. In fact mercurial lacks the ability to store a repository password anywhere other than in the url used to access the repository (i.e. http://user:password@example.com/path). I think this is a bit of security flaw. The password is stored as plain text within the repository config file (&amp;#8216;.hg/hgrc&amp;#8217;)&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;Fortunately Mercurial provides a simple interface for extension modules. After a little bit of hacking I was able to write an hg extension that stores and retrieves the password from the keychain. I&amp;#8217;ve put the code online for anyone to use.&amp;nbsp;hgkeychain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Download: hgkeychain.tar.bz2&lt;/a&gt;&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Source Code&lt;/a&gt;&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;&lt;span class="caps"&gt;README&lt;/span&gt;&lt;/a&gt;&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And yes the source code is currently hosted in a Subversion repository :-) I did mention I&amp;#8217;m in the middle of transitioning to Mercurial didn&amp;#8217;t&amp;nbsp;I?&lt;/p&gt;
&lt;hr&gt;

&lt;h2&gt;Update&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve update the project for Mercurial 1.1 - it should now work on 1.1 and also 1.0 (and lower). I&amp;#8217;ve also decided to move the code to bitbucket instead: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;https://www.bitbucket.org/schwa/hgkeychain/&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 13 Feb 2008 17:54:10 -0800</pubDate><guid>tag:toxicsoftware.com,2008-02-13:hgkeychain.html</guid></item><item><title>Run Python Script: Amazon S3 Uploader</title><link>http://toxicsoftware.com/s3_uploader.html</link><description>&lt;p&gt;To help illustrate the usefulness of the &amp;#8220;Run Python Script&amp;#8221; Automator Action I blogged about in my &lt;a href="http://toxicsoftware.com/run-python-script.html"&gt;previous post&lt;/a&gt;, here&amp;#8217;s an action that will upload files to the Amazon S3 Web Service. The script is pure Python and uses the extremely cool &lt;a href="http://code.google.com/p/boto/"&gt;boto&lt;/a&gt; Python module to interact with Amazon web services. The script is really a sample of what could be done with The Run Python Script action, but I think it really shows off how the action helps to turn Automator into a great tool for interacting with Web&amp;nbsp;Services.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/61285556@N00/2111429437" title="View 'Amazon S3 Uploader Automator Action' on Flickr.com"&gt;&lt;img alt="Amazon S3 Uploader Automator Action" src="http://farm3.static.flickr.com/2227/2111429437_83ca56bcd9_m.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 15 Dec 2007 04:32:42 -0800</pubDate><guid>tag:toxicsoftware.com,2007-12-15:s3_uploader.html</guid></item><item><title>Run Python Script</title><link>http://toxicsoftware.com/run-python-script.html</link><description>&lt;p&gt;&lt;em&gt;Important&lt;/em&gt; see updates at end of&amp;nbsp;post&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve written an Automator action that allows you to write python scripts directly inside your Automator&amp;nbsp;workflow.&lt;/p&gt;
&lt;p&gt;[&lt;img alt="RunPythonScriptIcon" src="http://farm3.static.flickr.com/2237/2110974754_6e5540298b_o.png" /&gt;][]&lt;/p&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Run Python Script&lt;/a&gt;&amp;#8221; Automator action (catchy title) is written using Python and &lt;a href="http://pyobjc.sourceforge.net"&gt;PyObjC&lt;/a&gt; (now built-in to Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.5). Apple already provides &amp;#8220;Run AppleScript&amp;#8221; and &amp;#8220;Run Shell Script&amp;#8221; actions with Automator which give Automator a high degree of flexibility. However Python is my preferred scripting language and by writing a custom action purely for Python I was able to take advantage of some PyObjC features that in my opinion make my action superior to the provided Apple scripting action. I&amp;#8217;m releasing all the &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;source code&lt;/a&gt; to the action under the &lt;a href="http://www.opensource.org/licenses/bsd-license.php"&gt;&lt;span class="caps"&gt;BSD&lt;/span&gt; Open Source&lt;/a&gt;&amp;nbsp;license.&lt;/p&gt;
&lt;p&gt;One of the main advantages of the action is that Python (with the help of PyObjC) understands the AppleEvent descriptors that Automator uses to pass data between workflow actions. This allows the user to create a custom action that accepts and provides data of any type. In contrast Apple&amp;#8217;s &amp;#8220;Run Shell Script&amp;#8221; action can only accept and provide text (usually limited to file paths). Some work does need to be done to make working with any data (which is represented by NSAppleEventDescriptor objects) more&amp;nbsp;convenient.&lt;/p&gt;
&lt;p&gt;The default Python script for a new action in a workflow&amp;nbsp;follows:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;&amp;#39;&amp;#39;Your script goes here.&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Hello world&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;[&lt;img alt="RunPythonScriptMain" src="http://farm3.static.flickr.com/2286/2110978140_4c336656f7_m.jpg" /&gt;][]&lt;/p&gt;
&lt;p&gt;This is pretty simple. The action will optionally convert the input into Python types (currently limited to converting typeAlias AppleEvent descriptors into path strings) to allow simple processing. Output is (optionally) converted from Python types to native Automator types. See the Examples directory for&amp;nbsp;more.&lt;/p&gt;
&lt;p&gt;The following screenshot shows the action used in a real workflow. This workflow asks the user for a keyword and then the Python action downloads photos from the &lt;a href="http://morguefile.com"&gt;morguefile&lt;/a&gt; public stock photo archive that are related to the keyword. Once download it performs some processing on the files (scales them to 640 by 480) and produces a &lt;span class="caps"&gt;PDF&lt;/span&gt; &amp;#8220;Contact Book&amp;#8221; from the&amp;nbsp;images.&lt;/p&gt;
&lt;p&gt;[&lt;img alt="RunPythonScriptScreenshot" src="http://farm3.static.flickr.com/2169/2110196661_e9f178f475_m.jpg" /&gt;][]&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;source code&lt;/a&gt; uses a 10.5 specific technique to create Python based bundles. It also has a simple Python syntax colouring NSTextView (using Python itself to colourise the&amp;nbsp;source).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m calling the Action a 0.1 release and have some plans/ideas for further releases. See the &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;&lt;span class="caps"&gt;TODO&lt;/span&gt; list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: I&amp;#8217;ve added a &lt;a href="http://toxicsoftware.com/s3_uploader.html"&gt;sample script&lt;/a&gt; showing how to upload files to Amazon S3 from within a&amp;nbsp;workflow.&lt;/p&gt;
&lt;p&gt;The code in subversion is a lot newer than the binary I&amp;#8217;m linking to. If possible do a checkout and build the plugin&amp;nbsp;yourself.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: This Automator action has issues on Snow Leopard and some Leopard versions. Use at your own&amp;nbsp;risk.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Automator&amp;#8217;s &amp;#8220;Run Terminal Script&amp;#8221; looks like it supports and understands Python native. That means, although my .action was better (syntax highlighting, better control of input and output, better logging, etc), I probably won&amp;#8217;t bother to update it to Snow&amp;nbsp;Leopard.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screen shot 2009-10-16 at 11.02.36 AM.png" src="/uploads/Screen-shot-2009-10-16-at-11.02.36-AM.png" /&gt;&lt;/p&gt;
&lt;p&gt;[&lt;img alt="RunPythonScriptIcon" src="http://farm3.static.flickr.com/2237/2110974754_6e5540298b_o.png" /&gt;]: http://www.flickr.com/photos/61285556@N00/2110974754 &amp;#8220;View &amp;#8216;RunPythonScriptIcon&amp;#8217; on Flickr.com&amp;#8221;
  [&lt;img alt="RunPythonScriptMain" src="http://farm3.static.flickr.com/2286/2110978140_4c336656f7_m.jpg" /&gt;]: http://www.flickr.com/photos/61285556@N00/2110978140 &amp;#8220;View &amp;#8216;RunPythonScriptMain&amp;#8217; on Flickr.com&amp;#8221;
  [&lt;img alt="RunPythonScriptScreenshot" src="http://farm3.static.flickr.com/2169/2110196661_e9f178f475_m.jpg" /&gt;]: http://www.flickr.com/photos/61285556@N00/2110196661 &amp;#8220;View &amp;#8216;RunPythonScriptScreenshot&amp;#8217; on&amp;nbsp;Flickr.com&amp;#8221;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 14 Dec 2007 16:14:16 -0800</pubDate><guid>tag:toxicsoftware.com,2007-12-14:run-python-script.html</guid></item><item><title>A Special Kind Of Idiot</title><link>http://toxicsoftware.com/a-special-kind-of-idiot.html</link><description>&lt;p&gt;This Thanksgiving I truly have something to be thankful for. It isn&amp;#8217;t my Wife, my home, my family, my friends, my health or my business. Although I am thankful for all those things. What I&amp;#8217;m most thankful for this Thanksgiving is: I got me a&amp;nbsp;stalker!!!&lt;/p&gt;
&lt;p&gt;Yep. I&amp;#8217;ve got my very own nutjob on the internet who has decided he is going to go out of his way to fling poo at me! Seems like I did something to offend the, dare I say &lt;em&gt;infamous&lt;/em&gt;, Rick&amp;nbsp;Downes.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;OK&lt;/span&gt;. I must admit when they were handing out the stalkers I wasn&amp;#8217;t at the front of the queue. No Glenn Close (when she was still pretty darn hot) style femme fatales are after me alas. Instead I get some bitter, semi-retired Swedish geek who has oddly decided that I needed to be brought to task, for whatever it is I did to get his&amp;nbsp;goat.&lt;/p&gt;
&lt;p&gt;So who is this Rick Downes character? From his &lt;a href="http://rixstep.com/1/0/20060307,01.shtml"&gt;own site&lt;/a&gt;: &lt;em&gt;&amp;#8220;Rick Downes is an internationally acclaimed and respected computer scientist, long specialising in taking care of the &amp;#8216;common man&amp;#8217; and in defending the rights of the common man against corporate and political abuses of power.&amp;#8221;&lt;/em&gt; Go on, google him now, it should be easy to find some positive information on this person for who &lt;em&gt;&amp;#8220;&lt;strong&gt;hundreds of thousands&lt;/strong&gt; of individuals worldwide know and well respect&amp;#8221;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Rick, who has a extraordinary fondness for using ©, ® and ™ symbols for ironic emphasis, apparently runs a software company in Cyprus where he likes to release &lt;a href="http://perversiontracker.com/archives/000186.html"&gt;poetry inspiring Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X software&lt;/a&gt; (&lt;em&gt;if you only follow one link from this blog post follow that one&lt;/em&gt;), has been &lt;a href="http://www.fairtrialsabroad.org/?m=View&amp;amp;action=DocumentContent&amp;amp;L1=5&amp;amp;L2=19&amp;amp;id=441&amp;amp;secId=5&amp;amp;PHPSESSID=38da2d2af746ef438b8ecf6e8c587013"&gt;arrested&lt;/a&gt; for &lt;a href="http://www.theregister.co.uk/2005/11/02/rixstep_spam_case_probe/"&gt;commercial spamming&lt;/a&gt; and &lt;a href="http://rixstep.com/1/0/20060307,01.shtml"&gt;drug trafficking&lt;/a&gt; and has absolutely nothing positive to say about &lt;a href="http://rixstep.com/4/2/marsedit,00.shtml"&gt;other&lt;/a&gt; &lt;a href="http://rixstep.com/4/2/bbe,00.shtml"&gt;people&amp;#8217;s&lt;/a&gt; Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X &lt;a href="http://rixstep.com/4/2/podworks,00.shtml"&gt;software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Apparently I am in good company. Rick isn&amp;#8217;t frugal with his diatribes against, well apparently lots of things. Rick dislikes a &lt;em&gt;whole&lt;/em&gt; lot of things. And people. And software. And &lt;span class="caps"&gt;TIFF&lt;/span&gt; files. Rick &lt;em&gt;especially&lt;/em&gt; dislikes &lt;span class="caps"&gt;TIFF&lt;/span&gt; files. Oh and bloat. He &lt;em&gt;really&lt;/em&gt; doesn&amp;#8217;t like&amp;nbsp;bloat.&lt;/p&gt;
&lt;p&gt;And what does Rick say about things he doesn&amp;#8217;t like? Why, you get your very own page on &lt;a href="http://rixstep.com"&gt;rixstep.com&lt;/a&gt; where Rick will lay into you about how un-optimised your &lt;span class="caps"&gt;TIFF&lt;/span&gt; files are. He might even accuse of you of being a Texan (yes, really he believes someone who spells optimise with an S is Texan)! Or maybe he&amp;#8217;ll call you a tool. Or try to disparage the work you&amp;#8217;re doing helping to teach technology to&amp;nbsp;children.&lt;/p&gt;
&lt;p&gt;Rick seems to think he can use the internet and his professional web-site to attack whatever it is he doesn&amp;#8217;t like. Generally he limits his attacks to software but occasionally he decides individuals are fair game. Unfortunately for Rick these attacks have done nothing more than turn him into a &lt;a href="http://twitter.com/rentzsch/statuses/384831722"&gt;laughing&lt;/a&gt; &lt;a href="http://twitter.com/buzz/statuses/434871892"&gt;stock&lt;/a&gt; amongst the developer&amp;nbsp;community.&lt;/p&gt;
&lt;p&gt;So what did I do to deserve the wrath of such a vengeful spirit? Well I participated in the comment thread of a blog post about software optimisation (yes, &lt;a href="http://lipidity.com/apple/ctgradient-code-bloat/"&gt;&lt;em&gt;that&lt;/em&gt; blog post&lt;/a&gt;). That&amp;#8217;s all it takes to unleash the bile and slobbering attacks. I may have also referred to Rick as a &lt;a href="http://lipidity.com/apple/ctgradient-code-bloat/comment-page-3/#comment-39457"&gt;&lt;em&gt;&amp;#8220;911 conspiracy theory-level fucking nutter.&amp;#8221;&lt;/em&gt;&lt;/a&gt; My bad. But then in my defence I was linking to this &lt;a href="http://www.rixstep.com/2/1/20071121,00.shtml"&gt;posting of Rick&amp;#8217;s&lt;/a&gt; where he seems to go slightly off the rails about some conspiracy of the imaginary elite Mac developers, the so called &lt;em&gt;&amp;#8220;&lt;a href="http://www.rixstep.com/2/1/20071121,00.shtml"&gt;Landed Gentry of Mac Development™&lt;/a&gt;&amp;#8221;&lt;/em&gt; (note that the United States Patent and Trademark Office &lt;a href="http://tess2.uspto.gov/bin/showfield?f=toc&amp;amp;state=8sake9.1.1&amp;amp;p_search=searchss&amp;amp;p_L=50&amp;amp;BackReference=&amp;amp;p_plural=yes&amp;amp;p_s_PARA1=&amp;amp;p_tagrepl%7E%3A=PARA1%24LD&amp;amp;expr=PARA1+AND+PARA2&amp;amp;p_s_PARA2=Landed+Gentry+of+Mac+Development&amp;amp;p_tagrepl%7E%3A=PARA2%24COMB&amp;amp;p_op_ALL=AND&amp;amp;a_default=search&amp;amp;a_search=Submit+Query&amp;amp;a_search=Submit+Query"&gt;doesn&amp;#8217;t seem to have that trademark on file yet&lt;/a&gt;, I can only assume the application is in the&amp;nbsp;mail).&lt;/p&gt;
&lt;p&gt;Rick started on me gently, merely (and quite randomly I might point out) mentioning me in his totally unbiased review of &lt;a href="http://rixstep.com/4/2/marsedit,00.shtml"&gt;MarsEdit&lt;/a&gt;, calling me an &lt;em&gt;&amp;#8220;insufferable blogger&amp;#8221;&lt;/em&gt;, amongst other things. I emailed Rick at this point to see if we could resolve this seemingly bizarre issue. But the chances are that my e-mail got deleted by his rather &lt;a href="http://rixstep.com/0/contact.shtml"&gt;paranoid email filters&lt;/a&gt; (for a company that claims to pride itself on serving the customer I find it odd that e-mail from such large providers as gmail and mac.com are summarily&amp;nbsp;discarded).&lt;/p&gt;
&lt;p&gt;But then the big guns came out. Rick devoted a &lt;a href="http://rixstep.com/1/1/20071121,01.shtml"&gt;whole blog post&lt;/a&gt; to just me, or rather to &lt;em&gt;&amp;#8220;Johnathan Right&amp;#8221;&lt;/em&gt; (a misspelling I can only assume Rick is intentionally making to be just that &lt;em&gt;extra&lt;/em&gt; bit juvenile), linking to it from his &lt;a href="http://rixstep.com/1/"&gt;Industry Watch&lt;/a&gt; page (yes really, slagging off a fellow developer is considered &lt;em&gt;&amp;#8220;Industry Watch&amp;#8221;&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;In the blog post Rick posts select quotes from a what was believed to be private conversation between myself and a 3rd party. Not quite sure what this has to do with, well anything really, but when someone takes the time and energy to write a whole blog post trying to character assassinate someone, rationality isn&amp;#8217;t a priority. For some reason Rick seems to think a comparison between his qualifications and mine are in order. Bizarre! Batshit insane bizarre? Well go read the blog post. You be the judge. And of course Rick dredges up two applications that have long since been abandoned. Rick is nothing if not swift. By the way, Rick, have you ever considered abandoning some of your apps? Funny Haiku&amp;#8217;s aside, some of your apps could really do with being taken out back and put out of their&amp;nbsp;misery.&lt;/p&gt;
&lt;p&gt;The funniest quote of the whole bizarre episode is &lt;em&gt;&amp;#8220;Ah Texas boy. We can relax. Texas has produced some ace programmers over the years. Like George Walker Bush.&amp;#8221;&lt;/em&gt; Ignoring the half-arsed attempt at a Bush joke, Rick obviously spent 2 minutes searching my blog trying to find more mud to sling. And the best he could come up with is that I&amp;#8217;m a Texan. Which of course, &lt;a href="http://en.wikipedia.org/wiki/Portsmouth%2C_England"&gt;just happens not to be where I&amp;#8217;m from at&amp;nbsp;all.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I thought the Mac developer community had some oddballs in it before. But Rick totally takes the cake. A Mac software publisher whose catalog is so awful that there exists Haiku extolling their awfulness. A blogger who takes great pride in picking apart apps and slurring the developers of said apps with insults and ad-hominem attacks. Encouraging script-kiddies to deface websites. And let&amp;#8217;s not forget the spamming and drug trafficking&amp;nbsp;arrests.&lt;/p&gt;
&lt;p&gt;So while I&amp;#8217;m disappointed that my stalker isn&amp;#8217;t a leggy blonde unafraid to do cruel things to bunnies, I must admit that as nutjobs go I think I&amp;#8217;ve attracted one of &lt;a href="http://en.wikipedia.org/wiki/Timecube"&gt;timecubesque&lt;/a&gt;&amp;nbsp;magnitude.&lt;/p&gt;
&lt;p&gt;Of course I&amp;#8217;ve committed the the biggest blunder on the internet: &lt;em&gt;&amp;#8220;Do not feed the trolls!&amp;#8221;&lt;/em&gt;. Guilty I&amp;#8217;m afraid. But maybe someone will hit this page while googling for Rick and realise what kind of person he&amp;nbsp;is.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 22 Nov 2007 16:03:51 -0800</pubDate><guid>tag:toxicsoftware.com,2007-11-22:a-special-kind-of-idiot.html</guid></item><item><title>What’s in a name?</title><link>http://toxicsoftware.com/whats-in-a-name.html</link><description>&lt;p&gt;You&amp;#8217;d think that a rather uncommon last name like &amp;#8220;&lt;a href="http://en.wikipedia.org/wiki/Wight"&gt;Wight&lt;/a&gt;&amp;#8221; would be a relatively easy name for others to spell correctly. It is uncommon enough that I&amp;#8217;ve never met any other Wights outside of &amp;#8220;&lt;a href="http://en.wikipedia.org/wiki/James_Herriot"&gt;my family&lt;/a&gt;&amp;#8220;. And yet people seem to have trouble with it. People seem to think that it should be spelled more conventionally as &amp;#8220;White&amp;#8221;, or maybe with an extra &amp;#8220;R&amp;#8221; as &amp;#8220;Wright&amp;#8221;, or they wrongly spell it&amp;nbsp;&amp;#8220;Right&amp;#8221;.&lt;/p&gt;
&lt;p&gt;As anyone with a rather uncommon name can probably attest to, you just have to get used to people spelling or pronouncing your name incorrectly. Of course you can do your best to correct mistakes; back home I used to always say &amp;#8220;Like the &lt;a href="http://en.wikipedia.org/wiki/Isle_of_wight"&gt;Isle of Wight&lt;/a&gt;&amp;#8221; to help prevent error, but here in the &lt;span class="caps"&gt;USA&lt;/span&gt; that isn&amp;#8217;t really so useful. My wife still gets annoyed at people spelling her last name incorrectly, but I&amp;#8217;ve long gotten past that. Most people are happy to fix their errors when corrected and rarely make the same mistake more than&amp;nbsp;once.&lt;/p&gt;
&lt;p&gt;And of course there is occasional humour in someone intentionally misspelling or mispronouncing your name. Being referred to as &amp;#8220;Jonathan &lt;a href="http://en.wikipedia.org/wiki/Widget_%28beer%29"&gt;Widget&lt;/a&gt;&amp;#8221; never gets old. No really, it never gets old.&amp;nbsp;Honest.&lt;/p&gt;
&lt;p&gt;And still there are a plethora of alternative spellings for Jonathan too (all of them inferior of course) with &amp;#8220;Jonathon&amp;#8221; and &amp;#8220;Johnathan&amp;#8221; being perhaps the most common alternatives. But of course you pick your&amp;nbsp;battles.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;d think on the internet these mistakes would be less common. You certainly can&amp;#8217;t blame these mistakes on mishearing the name. Generally the name is there, in &lt;span class="caps"&gt;ASCII&lt;/span&gt; form for you to see (or copy &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; paste), clear as day. But of course mistakes happen. On more than one occasion I have been confused online with Jonathan Wright, apparently an &lt;span class="caps"&gt;AI&lt;/span&gt; programmer at &lt;a href="http://www.idsoftware.com/business/team/"&gt;id Software&lt;/a&gt;. I would to think that Jonathan Wright has been mistaken for me in return. During a recent interview about &lt;a href="http://ironcoder.org"&gt;Ironcoder&lt;/a&gt; I was quoted as &amp;#8220;Jason Wright&amp;#8221;, go&amp;nbsp;figure.&lt;/p&gt;
&lt;p&gt;It would take a special kind of Internet idiot to misspell a name more than say, a dozen&amp;nbsp;times&amp;#8230; &lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 22 Nov 2007 16:03:14 -0800</pubDate><guid>tag:toxicsoftware.com,2007-11-22:whats-in-a-name.html</guid></item><item><title>R.I.P Toxic Progress Indicator</title><link>http://toxicsoftware.com/rip_toxic_progress_indicator.html</link><description>&lt;p&gt;Thanks to &lt;a href="http://mattgemmell.com/2007/10/28/get-rid-of-your-code-with-leopard"&gt;Matt Gemmell&lt;/a&gt; for pointing out that Apple has finally provided a pie chart style NSProgressIndicator for the circular/determinate modes. This style is new to Leopard. This means my &lt;a href="http://toxicsoftware.com/toxic_progress_indicator.html"&gt;Toxic Progress Indicator&lt;/a&gt; class can be retired, at least for 10.5+ only applications. Leopard has really helped to retire a lot of my code (for example my QuickTime Sequence Grabber code can probably be retired too) and I expect this trend to&amp;nbsp;continue.&lt;/p&gt;
&lt;p&gt;Toxic Progress Indicator should still be used on apps that need to run on 10.4, but I wont be supporting the class any more (not that it is really needed any&amp;nbsp;support&amp;#8230;)&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;img src="http://toxicsoftware.comcocoapiechart.png" alt="CocoaPieChart.png" border="0" width="429" height="407" /&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 30 Oct 2007 13:17:26 -0700</pubDate><guid>tag:toxicsoftware.com,2007-10-30:rip_toxic_progress_indicator.html</guid></item><item><title>Ironcoder NEEDS You!</title><link>http://toxicsoftware.com/ironcoder-needs-you.html</link><description>&lt;p&gt;&lt;a href="http://ironcoder.org/blog/2007/10/16/in-the-grim-future-there-is-only-ironcoder/"&gt;&lt;img alt="needs you.jpg" src="/uploads/needs-you.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ask not what Ironcoder can do for&amp;nbsp;you…&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 16 Oct 2007 20:51:27 -0700</pubDate><guid>tag:toxicsoftware.com,2007-10-16:ironcoder-needs-you.html</guid></item><item><title>SpaceNavigator controlled Lego Mindstorms NXT</title><link>http://toxicsoftware.com/spacenavigatornxt.html</link><description>&lt;p&gt;It&amp;#8217;s my second year of coaching a &lt;a href="http://www.firstlegoleague.org"&gt;First Lego League&lt;/a&gt; team. The experience has been fantastic, I&amp;#8217;m teaching 4th and 5th grade children about robots and computers, and teaching them to build and program their own robots. This year the kids are going to be learning how to use the new &lt;a href="http://www.amazon.com/gp/product/B000E4FDAE?ie=UTF8&amp;amp;tag=toxicsoftware-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000E4FDAE"&gt;Lego Mindstorms &lt;span class="caps"&gt;NXT&lt;/span&gt;&lt;/a&gt; robot; therefore I happen to have an &lt;span class="caps"&gt;NXT&lt;/span&gt; robot in the house. One of the cool features of the &lt;span class="caps"&gt;NXT&lt;/span&gt; is that it can communicate to a Mac (or even another &lt;span class="caps"&gt;NXT&lt;/span&gt; robot) via Bluetooth. So I thought it might be fun to take the &lt;a href="http://www.amazon.com/gp/product/B000LB41BM?ie=UTF8&amp;amp;tag=toxicsoftware-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000LB41BM"&gt;3Dconnexion SpaceNavigator&lt;/a&gt; controller device I used in my &lt;a href="http://toxicsoftware.com/the-intersection-of-cool-and-awesome.html"&gt;previous blog post&lt;/a&gt; and use it to control an &lt;span class="caps"&gt;NXT&lt;/span&gt; Robot. Here is the&amp;nbsp;result:&lt;/p&gt;
&lt;p&gt;[&lt;img alt="SpaceNavigatorNXTPreview.png" src="/uploads/spacenavigatornxtpreview.png" /&gt;][]&lt;/p&gt;
&lt;p&gt;Although the SpaceNavigator support six degrees of freedom, I&amp;#8217;m only using two (Y axis for forwards/reverse and &lt;span class="caps"&gt;RZ&lt;/span&gt; for turning), that leaves plenty of room for expansion (perhaps hooking up a third motor to another controller&amp;nbsp;axis).&lt;/p&gt;
&lt;p&gt;Although the video doesn&amp;#8217;t show it too well, the SpaceNavigator does allow for very fine grained control over the robot (as long as the robot has fresh batteries!). The controller is extremely sensitive and with practice the robot can be controlled quite&amp;nbsp;delicately.&lt;/p&gt;
&lt;p&gt;Currently only one axis is dominant at a time (that&amp;#8217;s actually a preference in the SpaceController System Preferences screen) but it is be possible to control robot steering and speed/direction at the same time. I&amp;#8217;ll be trying that out&amp;nbsp;soon.&lt;/p&gt;
&lt;p&gt;There doesn&amp;#8217;t seem to be much in the way of Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X APIs for controlling &lt;span class="caps"&gt;NXT&lt;/span&gt; via Bluetooth, so I&amp;#8217;m putting my code onto my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;public subversion server&lt;/a&gt; and releasing it (like everything else in my public repository) under the &lt;a href="http://en.wikipedia.org/wiki/Bsd_license"&gt;&lt;span class="caps"&gt;BSD&lt;/span&gt; License&lt;/a&gt;. The code is Leopard only (although all I&amp;#8217;m using are some &lt;a href="http://developer.apple.com/leopard/overview/tools.html"&gt;Objective-C 2.0&lt;/a&gt; features, such as properties and the new for loop). The code uses Cocoa bindings/&lt;span class="caps"&gt;KVC&lt;/span&gt; and has a rather simple&amp;nbsp;interface:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;robot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;CNXTRobot&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;autorelease&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;CNXTMotor&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;robot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="nl"&gt;objectForKey:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;theMotor1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;CNXTMotor&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;robot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ports&lt;/span&gt; &lt;span class="nl"&gt;objectForKey:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;theMotor2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The sample &lt;span class="caps"&gt;NXT&lt;/span&gt; project relies on my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;ToxicWarped&lt;/a&gt; framework. ToxicWarped was originally created for my &lt;a href="http://toxicsoftware.com"&gt;Geode&lt;/a&gt; project and is designed to help write simple but flexible Object Oriented protocol&amp;nbsp;stacks.&lt;/p&gt;
&lt;p&gt;The &lt;span class="caps"&gt;NXT&lt;/span&gt; code is barely a day old, so it is very rough and ready but I&amp;#8217;ll be tinkering with the &lt;span class="caps"&gt;NXT&lt;/span&gt; and SpaceNavigator code over the next few weeks (in my spare time) but if anyone has a use for the code and would like to contribute back that would be&amp;nbsp;fantastic.&lt;/p&gt;
&lt;p&gt;Update: Couldn&amp;#8217;t stand awful &lt;a href="http://www.youtube.com/watch?v=H4zct49Dv6Y"&gt;Youtube&lt;/a&gt; image quality any longer. Videos are now on amazon&amp;nbsp;s3.&lt;/p&gt;
&lt;p&gt;[&lt;img alt="SpaceNavigatorNXTPreview.png" src="/uploads/spacenavigatornxtpreview.png" /&gt;]:&amp;nbsp;http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorNXT.mp4&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 27 Sep 2007 02:50:04 -0700</pubDate><guid>tag:toxicsoftware.com,2007-09-27:spacenavigatornxt.html</guid></item><item><title>The Intersection of Cool and Awesome</title><link>http://toxicsoftware.com/the-intersection-of-cool-and-awesome.html</link><description>&lt;p&gt;&lt;a href="http://www.3dconnexion.com"&gt;3Dconnexion&lt;/a&gt; (a division of &lt;a href="http://logitech.com"&gt;Logitech&lt;/a&gt;) produces the coolest named device ever: The &lt;a href="http://www.amazon.com/gp/product/B000LB41BM?ie=UTF8&amp;amp;tag=toxicsoftware-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B000LB41BM"&gt;3Dconnexion SpaceNavigator&lt;/a&gt; . This is a 3D input device with &lt;a href="http://en.wikipedia.org/wiki/6_Degrees_Of_Freedom"&gt;6 degrees of freedom&lt;/a&gt;, meaning you can move and rotate it through the X, Y and Z planes. I bought it originally on a whim (hey only 50 bucks!) for use with &lt;a href="http://sketchup.google.com"&gt;Google Sketchup&lt;/a&gt; and &lt;a href="http://earth.google.com"&gt;Google Earth&lt;/a&gt;. It took about twenty minutes to get competent with the device and I was soon whizzing around Manhattan inside Google Earth. The device is designed to use in your off hand with a mouse in your primary hand. This gives you a fantastic level of control in 3D&amp;nbsp;applications.&lt;/p&gt;
&lt;p&gt;![3dx_spacenavigator.jpg][] [3dx_spacenavigator.jpg][3dx_spacenavigator.jpg]:&amp;nbsp;/images/3dx-spacenavigator.jpg&lt;/p&gt;
&lt;p&gt;The software that comes with the SpaceNavigator is functional, but like a lot of hardware related software is rough around the edges. You can provide customised settings for specific applications or use global settings. You can set up macros to fire when either of the SpaceNavigator&amp;#8217;s two buttons are pressed. Understandibly the SpaceNavigator will not appear to applications as a standard input device, so 3Dconnexion provide an &lt;a href="http://www.3dconnexion.com/docs/3DxMacWareSDK.dmg"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; to allow 3rd party developers to use the device. This opens up a host of opportunities for 3rd party developers. The Space Navigator could be used in third-party applications as a jog wheel, kind of like the &lt;a href="http://www.griffintechnology.com/products/powermate/"&gt;Griffin Powermate&lt;/a&gt; and also as a 2D scroll wheel at the same&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;This leads me onto &lt;a href="http://flyingmeat.com/acorn/"&gt;Acorn&lt;/a&gt;, Acorn is &lt;a href="http://gusmueller.com/blog/"&gt;Gus Mueller&amp;#8217;s&lt;/a&gt; newest application. It is an awesome 2D image editor, with a healthy list of features. I consider it to be a &amp;#8220;Photoshop for the rest of us&amp;#8221;, and has quickly become my image editor of choice. Like Gus&amp;#8217; &lt;a href="http://www.flyingmeat.com/voodoopad/"&gt;VoodooPad&lt;/a&gt;, Acorn also supports a &lt;a href="http://flyingmeat.com/acorn/plugin.shtml"&gt;plug-in architecture&lt;/a&gt;. This allow developers to extend the applications in ways Gus wouldn&amp;#8217;t have dreamt of (although considering Gus wrote FlyGesture I&amp;#8217;m sure he has some pretty funky dreams). I&amp;#8217;ve created a plug-in for Acorn that uses the SpaceNavigator &lt;span class="caps"&gt;API&lt;/span&gt; to zoom and scroll around the image you&amp;#8217;re editing. Rotating the SpaceNavigator causes the image to rotate (using the CoreImage affine transformation filter). This just touches the surface of the cool things you can do with the SpaceNavigator and an application that supports&amp;nbsp;plug-ins.&lt;/p&gt;
&lt;p&gt;Now for the money shots, two movies of the plug-in in&amp;nbsp;action:&lt;/p&gt;
&lt;p&gt;[&lt;img alt="SpaceNabvigatorAcornPreview.png" src="http://toxicsoftware.comspacenabvigatoracornpreview.png" /&gt;][]&lt;/p&gt;
&lt;p&gt;[&lt;img alt="SpaceNabvigatorAcorn2Preview.png" src="http://toxicsoftware.comspacenabvigatoracorn2preview.png" /&gt;][]&lt;/p&gt;
&lt;p&gt;Source code for the plug-in is on my Google public repository &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;link&lt;/a&gt;, I&amp;#8217;ve also written a Cocoa wrapper for the 3Dconnextion &lt;span class="caps"&gt;API&lt;/span&gt; (required by the Acorn plug-in): &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;link&lt;/a&gt;. My Cocoa wrapper provides a much simpler interface to the device, and also provides more functionality (such as emulating a scroll wheel). I&amp;#8217;ll be working on the wrapper more in the&amp;nbsp;future.&lt;/p&gt;
&lt;p&gt;All this code is a work in progress and you will probably need to massage the Xcode project to get it to compile. You&amp;#8217;ll also need the 3Dconnexion &lt;span class="caps"&gt;API&lt;/span&gt; (and of course a&amp;nbsp;SpaceController).&lt;/p&gt;
&lt;p&gt;And hey look - I&amp;#8217;m blogging&amp;nbsp;again!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: I got daringfireballed, so I&amp;#8217;ve moved the movies onto youtube - quality sucks, but now the server seems responsive again. Links to source code&amp;nbsp;fixed.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Movies now on Amazon S3. Youtube quality sucks so much. (videos still on Youtube &lt;a href="http://www.youtube.com/watch?v=mad0UJOlo9Y"&gt;here&lt;/a&gt; and &lt;a href="http://www.youtube.com/watch?v=SQKb4qM3D5U"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;[&lt;img alt="SpaceNabvigatorAcornPreview.png" src="http://toxicsoftware.comspacenabvigatoracornpreview.png" /&gt;]: http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorAcorn.mp4
  [&lt;img alt="SpaceNabvigatorAcorn2Preview.png" src="http://toxicsoftware.comspacenabvigatoracorn2preview.png" /&gt;]:&amp;nbsp;http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorAcorn2.mp4&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 25 Sep 2007 17:37:24 -0700</pubDate><guid>tag:toxicsoftware.com,2007-09-25:the-intersection-of-cool-and-awesome.html</guid></item><item><title>I am not spamming you!</title><link>http://toxicsoftware.com/i-am-not-spamming-you.html</link><description>&lt;p&gt;It looks like spammers are using fake email addresses at the toxicsoftware.com domain as a return address for their vile&amp;nbsp;spam.&lt;/p&gt;
&lt;p&gt;Toxicsoftware is &lt;em&gt;not&lt;/em&gt; spamming you, we&amp;#8217;re just as much a victim of this as the recipients of the spam. In fact the toxicsoftware catchall email account has received over 6000 bounced emails in the last hour. I&amp;#8217;ll be turning off the catchall account temporarily until this spam-storm is over. You can reach me directly at&amp;nbsp;jwight@toxicsoftware.com&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 14 Aug 2007 14:27:38 -0700</pubDate><guid>tag:toxicsoftware.com,2007-08-14:i-am-not-spamming-you.html</guid></item><item><title>Subversion Moved</title><link>http://toxicsoftware.com/subversion-moved.html</link><description>&lt;p&gt;I&amp;#8217;ve had a lot of emails asking where the subversion repository has&amp;nbsp;gone.&lt;/p&gt;
&lt;p&gt;The simple answer is I&amp;#8217;ve stopped hosting my public subversion repository on DreamHost and have now created a Google Project for it. The project &lt;span class="caps"&gt;URL&lt;/span&gt;&amp;nbsp;is:&lt;/p&gt;
&lt;p&gt;http://code.google.com/p/toxic-public/&lt;/p&gt;
&lt;p&gt;And the subversion root is&amp;nbsp;here:&lt;/p&gt;
&lt;p&gt;http://toxic-public.googlecode.com/&lt;/p&gt;
&lt;p&gt;Google will be a lot more reliable than DreamHost ever will be. I also get bug tracking and easy user&amp;nbsp;maintenance.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll update the broken links when I get a&amp;nbsp;chance.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 04 Aug 2007 15:27:08 -0700</pubDate><guid>tag:toxicsoftware.com,2007-08-04:subversion-moved.html</guid></item><item><title>View man pages in Xcode script</title><link>http://toxicsoftware.com/manoxcode.html</link><description>&lt;p&gt;I really ought to start blogging&amp;nbsp;again..&lt;/p&gt;
&lt;p&gt;So here&amp;#8217;s a quick and simple shell script to open Man pages in Xcode. I&amp;#8217;ve been using the very nice &amp;#8220;&lt;a href="http://www.clindberg.org/projects/ManOpen.html"&gt;manopen&lt;/a&gt;&amp;#8221; utility to view man pages in a &lt;span class="caps"&gt;GUI&lt;/span&gt; application. But that tool is having difficulties with a certain new &lt;a href="http://www.apple.com/macosx/leopard/"&gt;big cat&lt;/a&gt;. So I was looking for a replacement tool but it turns out Xcode has a very nice Man page viewer built in. With the aid of a little shell/Applescript hybrid scripting I can now open Man pages in Xcode from the command line. This little tool isn&amp;#8217;t fool proof but in a pinch can replace &lt;a href="http://www.clindberg.org/projects/ManOpen.html"&gt;manopen&lt;/a&gt; and also &lt;a href="http://bruji.com/bwana/"&gt;bwana&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This script should work on 10.4 with Xcode 2.4 (and maybe even older versions of Xcode). Because the script uses &amp;#8220;System Events&amp;#8221; to drive the &lt;span class="caps"&gt;GUI&lt;/span&gt; you will need &amp;#8220;Enable Access for assistive devices&amp;#8221; turned on within your Universal Access system preference. To install just copy and paste the script into a file, make the script file executable and make sure it is in your &lt;span class="caps"&gt;PATH&lt;/span&gt; (I keep my scripts in &lt;code&gt;~/bin&lt;/code&gt;). I call the script &amp;#8220;&lt;code&gt;manoxcode&lt;/code&gt;&amp;#8221; (so that bash autocompletion and muscle memory continue to work&amp;nbsp;together).&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# manoxcode&lt;/span&gt;
&lt;span class="c"&gt;# Real simple tool to show man pages in xcode. Uses &lt;span class="caps"&gt;UI&lt;/span&gt; Scripting so &amp;quot;Enable Access for assistive devices&amp;quot; needs to be on.&lt;/span&gt;
osascript - &lt;span class="s2"&gt;&amp;quot;$1&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt; &lt;span class="caps"&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class="s"&gt;-- Inline AppleScript starts here...&lt;/span&gt;
&lt;span class="s"&gt;on run argv&lt;/span&gt;
&lt;span class="s"&gt;    tell application &amp;quot;Xcode&amp;quot; to activate&lt;/span&gt;
&lt;span class="s"&gt;    tell application &amp;quot;System Events&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;        tell process &amp;quot;Xcode&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;            click menu item &amp;quot;Open man page...&amp;quot; of menu 1 of menu bar item &amp;quot;Help&amp;quot; of menu bar 1&lt;/span&gt;
&lt;span class="s"&gt;            tell window &amp;quot;Open Manual Page&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;                set value of text field 1 to item 1 of argv&lt;/span&gt;
&lt;span class="s"&gt;                click button &amp;quot;&lt;span class="caps"&gt;OK&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;            end tell&lt;/span&gt;
&lt;span class="s"&gt;        end tell&lt;/span&gt;
&lt;span class="s"&gt;    end tell&lt;/span&gt;
&lt;span class="s"&gt;end run&lt;/span&gt;
&lt;span class="s"&gt;-- Inline Applescript ends here. Keep the &lt;span class="caps"&gt;EOF&lt;/span&gt;&lt;/span&gt; text in place!
&lt;span class="caps"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 28 Jul 2007 16:31:01 -0700</pubDate><guid>tag:toxicsoftware.com,2007-07-28:manoxcode.html</guid></item><item><title>WWDC 2007</title><link>http://toxicsoftware.com/wwdc-2007.html</link><description>&lt;p&gt;Adding to the plethora of &lt;span class="caps"&gt;WWDC&lt;/span&gt; 2007 blog postings and ending my posting drought. Leaving for &lt;span class="caps"&gt;WWDC&lt;/span&gt; this weekend. Should be an interesting &lt;span class="caps"&gt;WWDC&lt;/span&gt; and am looking forward to finding out what&amp;#8217;s new with&amp;nbsp;10.5.&lt;/p&gt;
&lt;p&gt;See you&amp;nbsp;there.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 08 Jun 2007 15:21:44 -0700</pubDate><guid>tag:toxicsoftware.com,2007-06-08:wwdc-2007.html</guid></item><item><title>Tiilt! Source Code</title><link>http://toxicsoftware.com/tiilt-source-code.html</link><description>&lt;p&gt;Source code for &lt;a href="http://toxicsoftware.com/tiilt.html"&gt;Tiilt!&lt;/a&gt; is now up on my public  server. &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Grab it while it&amp;#8217;s&amp;nbsp;hot.&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 25 Jan 2007 19:01:46 -0800</pubDate><guid>tag:toxicsoftware.com,2007-01-25:tiilt-source-code.html</guid></item><item><title>MacFUSE with Objective-C</title><link>http://toxicsoftware.com/macfuse-with-objective-c.html</link><description>&lt;p&gt;&lt;a href="http://code.google.com/p/macfuse/"&gt;MacFUSE&lt;/a&gt; has been taking the Mac development community by storm. I&amp;#8217;ve been hoping for a while that &lt;a href="http://fuse.sourceforge.net"&gt;Fuse&lt;/a&gt; would get ported to Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X, and &lt;a href="http://www.kernelthread.com"&gt;Amit Singh&lt;/a&gt; fortunately obliged. I won&amp;#8217;t bother elaborating on what MacFUSE is, Amit does a &lt;a href="http://googlemac.blogspot.com/2007/01/taming-mac-os-x-file-systems.html"&gt;fine job&lt;/a&gt; of that himself, however I would like to present my Objective-C wrapper for&amp;nbsp;MacFUSE:&lt;/p&gt;
&lt;p&gt;[http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Projects/Misc/FuseTest/][]&amp;nbsp;(Subversion)&lt;/p&gt;
&lt;p&gt;The code allows you to write a &lt;span class="caps"&gt;FUSE&lt;/span&gt; file system just by subclassing the &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CFileSystem&lt;/a&gt; class and providing concrete implementations for some or all of the CFileSystem&amp;#8217;s&amp;nbsp;methods.&lt;/p&gt;
&lt;p&gt;The code is (as always) a work in a progress and about 3/4 of the &lt;span class="caps"&gt;FUSE&lt;/span&gt; operations have been wrapped as methods. Currently the code is missing all the extended attribute operations and a handful of other operations - but nothing crucial that should prevent a useful file system from being&amp;nbsp;created.&lt;/p&gt;
&lt;p&gt;To test my code I have created a &amp;#8220;ShadowFS&amp;#8221; file system that creates a file system that acts as a clone or shadow of a specified directory. The ShadowFS class is pretty short, currently just over 200 lines of code to implement a file&amp;nbsp;system.&lt;/p&gt;
&lt;p&gt;If you have MacFUSE installed (I installed it via the unofficial disk image at &lt;span class="caps"&gt;XXXX&lt;/span&gt;) then you should be able to checkout the &amp;#8220;FuseTest&amp;#8221; project, and build and run the &amp;#8220;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;ShadowFS&lt;/a&gt;&amp;#8221; target. This will create a mount point in &amp;#8220;/tmp/ShadowFS_XXXXXXXX&amp;#8221; and mount a volume called &amp;#8220;Test&amp;#8221; that is a copy of your &amp;#8220;\~/Movies&amp;#8221; directory. A volume called &amp;#8220;Test&amp;#8221; (with a generic network share icon) should be mounted on your desktop. Ejecting the volume will allow the ShadowFS process to&amp;nbsp;quit.&lt;/p&gt;
&lt;p&gt;I hope this code can be used to jump start other people developing MacFUSE file systems and to help I&amp;#8217;m releasing my code under the &lt;span class="caps"&gt;BSD&lt;/span&gt; license (the &lt;span class="caps"&gt;FUSE&lt;/span&gt; client library itself is under the &lt;span class="caps"&gt;LGPL&lt;/span&gt;). I&amp;#8217;m hoping to see some cool Mac file systems in the near future and have a few good ideas&amp;nbsp;myself.&lt;/p&gt;
&lt;p&gt;I imagine there will be other Objective-C MacFUSE implementations soon but if anyone is interested in contributing to this project= please let me&amp;nbsp;know.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 17 Jan 2007 05:11:47 -0800</pubDate><guid>tag:toxicsoftware.com,2007-01-17:macfuse-with-objective-c.html</guid></item><item><title>The Real Week Of Independent Mac Developer</title><link>http://toxicsoftware.com/the-real-week-of-independent-mac-developer.html</link><description>&lt;p&gt;As part of &amp;#8220;&lt;a href="http://carpeaqua.com/archives/2006/12/11/support-developers/"&gt;The Real Week Of Independent Mac Developers&lt;/a&gt;&amp;#8221; I&amp;#8217;ve bought a copy of &lt;a href="http://www.x-tables.eu/more/overview.html"&gt;Tables&lt;/a&gt; (€39.00), a fine spreadsheet application for Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X. I&amp;#8217;m not sure what other software I&amp;#8217;m in the market for right now (I just paid for an upgrade for &lt;a href="http://macrabbit.com/cssedit/"&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; Edit&lt;/a&gt; a few days&amp;nbsp;ago).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m happy to buy shareware at full price and support the developers who create such cool software. I&amp;#8217;d rather give my money direct to the developers and not to middlemen who add no value to the product itself. Some middlemen we are stuck with (e.g. payment processors) but some we &lt;a href="http://maczot.com"&gt;shouldn&amp;#8217;t&lt;/a&gt; &lt;a href="http://macheist.com"&gt;be&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 13 Dec 2006 03:36:42 -0800</pubDate><guid>tag:toxicsoftware.com,2006-12-13:the-real-week-of-independent-mac-developer.html</guid></item><item><title>Tiilt!</title><link>http://toxicsoftware.com/tiilt.html</link><description>&lt;p&gt;I don&amp;#8217;t own a Wii. But as of today I do own a Wii Remote (and a nunchuk). And I&amp;#8217;ve had a lot of fun using the &lt;a href="http://sourceforge.net/projects/darwiin-remote/"&gt;Wiimote.framework&lt;/a&gt; to hack up this&amp;nbsp;app:&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/Tiilt.mp4"&gt;Tiilt.mp4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This screencast shows a simple Quartz Composer composition being manipulated by the Wii remote. If there is interest I&amp;#8217;ll put the source&amp;nbsp;online.&lt;/p&gt;
&lt;p&gt;Source is now &lt;a href="http://toxicsoftware.com/tiilt-source-code.html"&gt;online&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 12 Dec 2006 04:04:42 -0800</pubDate><guid>tag:toxicsoftware.com,2006-12-12:tiilt.html</guid></item><item><title>Child’s Play Day</title><link>http://toxicsoftware.com/childs-play-day.html</link><description>&lt;p&gt;[&lt;img alt="ChildsPlayDayBadge.png" src="/uploads/ChildsPlayDayBadge.png" /&gt;][]&lt;a href="http://mikezornek.com/2006/12/06/childs-play-day/"&gt;Mike Zornek&lt;/a&gt;, friend, fellow #macsb-er and Mac entrepreneur is organising Child&amp;#8217;s Play Day. Ironcoder is hosting a page with information on the event: [http://ironcoder.org/blog/childs-play-day/][&lt;img alt="ChildsPlayDayBadge.png" src="/uploads/ChildsPlayDayBadge.png" /&gt;]&lt;/p&gt;
&lt;p&gt;(Thanks to &lt;a href="http://www.mere-mortal-software.com"&gt;Mere Mortal Software&lt;/a&gt; for the badge&amp;nbsp;icon)&lt;/p&gt;
&lt;p&gt;[&lt;img alt="ChildsPlayDayBadge.png" src="/uploads/ChildsPlayDayBadge.png" /&gt;]:&amp;nbsp;http://ironcoder.org/blog/childs-play-day/&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 06 Dec 2006 14:49:32 -0800</pubDate><guid>tag:toxicsoftware.com,2006-12-06:childs-play-day.html</guid></item><item><title>iSight Trick NOT a Security Flaw</title><link>http://toxicsoftware.com/isight-trick-not-a-security-flaw.html</link><description>&lt;p&gt;Over the last couple of days there have been a &lt;a href="http://www.josephcrawford.com/2006/11/11/scary-isight-trick/"&gt;plethora&lt;/a&gt; of &lt;a href="http://www.macintouch.com"&gt;posts&lt;/a&gt; about web pages with embedded QuickTime movies accessing a Mac&amp;#8217;s iSight camera. Surrounding these posts have been many comments from people worried about the security implications of this functionality. And of course once the story hit &lt;a href="http://digg.com/apple/Scary_iSight_Trick"&gt;digg.com&lt;/a&gt; all the idiots came out of the woodwork and acted as if the sky was&amp;nbsp;falling.&lt;/p&gt;
&lt;p&gt;Needless to say this isn&amp;#8217;t a security flaw and isn&amp;#8217;t even new; see the &lt;a href="http://www.oreillynet.com/mac/blog/2005/07/quartz_composer_isight_prank.html"&gt;O&amp;#8217;Reilly Mac DevCenter Blog&lt;/a&gt; from over a year&amp;nbsp;ago.&lt;/p&gt;
&lt;p&gt;This isn&amp;#8217;t a security problem because the video from the iSight camera never leaves your local machine. In fact the data is just display inside the web page and discarded. For proof of this you can use the network bandwidth monitor feature of Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X&amp;#8217;s Activity Monitor. Open a page with a &amp;#8220;trick&amp;#8221; iSight movie and watch the &amp;#8220;Data Sent/sec&amp;#8221; field: it should not increase due to the iSight video. Take a look at this video of mine: &lt;a href="/uploads/QuartzComposer.mp4"&gt;QuartzComposer.mp4&lt;/a&gt;, the data sent varies between 0 and 180 bytes per second. For contrast take a look at a similar video but this time using Flash webcam software to transmit video to &lt;a href="http://stickam.com"&gt;stickam.com&lt;/a&gt; (you know, the &lt;a href="http://forums.somethingawful.com/showthread.php?s=0daf000fb7d3e9dd3936d093e38afec9&amp;amp;threadid=2124242&amp;amp;perpage=40&amp;amp;pagenumber=1"&gt;shoes on head&lt;/a&gt; place): &lt;a href="/uploads/Stickam.mp4"&gt;Stickam.mp4&lt;/a&gt;. This video shows that stickam.com is receiving around &lt;span class="caps"&gt;30KB&lt;/span&gt; a second. Yes, I need a&amp;nbsp;shave.&lt;/p&gt;
&lt;p&gt;While this isn&amp;#8217;t absolute proof that the iSight trick isn&amp;#8217;t up to no good it is a good indicator that things are fine. There are other methods, for example using a healthily paranoid outgoing firewall like &lt;a href="http://www.obdev.at/products/littlesnitch/index.html"&gt;Little Snitch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To put your mind at rest, here&amp;#8217;s a quick screencast tutorial (&lt;a href="/uploads/iSightTrickScreencast.mp4"&gt;iSightTrickScreencast.mp4&lt;/a&gt;, 3.&lt;span class="caps"&gt;3MB&lt;/span&gt; &lt;span class="caps"&gt;MP4&lt;/span&gt;) on how to create a QuickTime movie that will embed video from your iSight using Quartz Composer. Note at no point do I add any Quartz Composer nodes to transmit this video data anywhere. Try it&amp;nbsp;yourself.&lt;/p&gt;
&lt;p&gt;Here are the files created during the screencast: &lt;a href="/uploads/My%20Composition.qtz"&gt;My Composition.qtz&lt;/a&gt; and &lt;a href="/uploads/My%20Composition.mov"&gt;My&amp;nbsp;Composition.mov&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can use the following snippet of &lt;span class="caps"&gt;HTML&lt;/span&gt; to embed the video into a web page (code stolen from the &lt;a href="http://www.oreillynet.com/mac/blog/2005/07/quartz_composer_isight_prank.html"&gt;O&amp;#8217;Reilly Mac DevCenter Blog&lt;/a&gt;):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text-align:left;color:#000000; background-color:#ffffff; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; &amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;color:#881280;&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;html&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
    &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;body&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
        &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;object classid=&amp;quot;clsid:&lt;span class="caps"&gt;02BF25D5&lt;/span&gt;-8C17-4B23-&lt;span class="caps"&gt;BC80&lt;/span&gt;-&lt;span class="caps"&gt;D3488ABDDC6B&lt;/span&gt;&amp;quot; width=&amp;quot;640&amp;quot; height=&amp;quot;480&amp;quot; codebase=&amp;quot;http://www.apple.com/qtactivex/qtplugin.cab&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
            &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;param name=&amp;quot;src&amp;quot; value=&amp;quot;file:///Users/schwa/Desktop/My Composition.mov&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
            &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;param name=&amp;quot;autoplay&amp;quot; value=&amp;quot;true&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
            &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;param name=&amp;quot;controller&amp;quot; value=&amp;quot;false&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
            &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;embed src=&amp;quot;file:///Users/schwa/Desktop/My Composition.mov&amp;quot; width=&amp;quot;320&amp;quot; height=&amp;quot;240&amp;quot; autoplay=&amp;quot;true&amp;quot; controller=&amp;quot;false&amp;quot; pluginspage=&amp;quot;http://www.apple.com/quicktime/download/&amp;quot;&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
        &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/object&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
    &lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/body&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/html&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;One interesting thing about this is that WebKit based browsers (e.g. Safari and OmniWeb amongst others) used to be able to display these kinds of Quartz Composer movies directly. Now when trying to load a iSight using Quartz Composer file in a browser you&amp;#8217;ll see this error message: &lt;a href="/uploads/UnsafeComposition.png"&gt;UnsafeComposition.png&lt;/a&gt;. You can try it yourself by opening the &lt;a href="/uploads/My%20Composition.qtz"&gt;Quartz Composer file&lt;/a&gt; created for the webcast. Quartz Composer files that don&amp;#8217;t use the iSight will load as seen here: &lt;a href="/uploads/BasicComposition.qtz"&gt;BasicComposition.mp4&lt;/a&gt;. So what&amp;#8217;s going on here? Well I think Apple is rightfully being extremely cautious. Quartz Composer files and specifically Quartz Composer based QuickTime movies have had security advisories issues against them: &lt;a href="http://www.frsirt.com/english/advisories/2005/0531"&gt;http://www.frsirt.com/english/advisories/2005/0531&lt;/a&gt;, &lt;a href="http://docs.info.apple.com/article.html?artnum=301714"&gt;http://docs.info.apple.com/article.html?artnum=301714&lt;/a&gt; with more detailed information: &lt;a href="http://72.14.209.104/search?q=cache:S68dpiJeRoEJ:remahl.se/david/vuln/018/%3F__session_just_started__%3D1+http://remahl.se/david/vuln/018/&amp;amp;hl=en&amp;amp;gl=us&amp;amp;ct=clnk&amp;amp;cd=1&amp;amp;client=safari"&gt;http://remahl.se/david/vuln/018/&lt;/a&gt; (currently Google cached due to problems with their server). However the information that could have been leaked is limited to small textual information (produced by other Quartz Composer nodes) and not the video data&amp;nbsp;itself.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; From crazy to ridiculous. Make is publishing a hopefully &lt;a href="http://www.makezine.com/blog/archive/2006/11/how_to_secure_y.html?CMP=OTC-0D6B48984890"&gt;humorous article&lt;/a&gt; explaining how to build a shield for your&amp;nbsp;iSight.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 14 Nov 2006 19:13:15 -0800</pubDate><guid>tag:toxicsoftware.com,2006-11-14:isight-trick-not-a-security-flaw.html</guid></item><item><title>Second Hand Smoke</title><link>http://toxicsoftware.com/second-hand-smoke.html</link><description>&lt;p&gt;So &amp;#8216;&lt;a href="http://discoapp.com"&gt;Disco&lt;/a&gt;&amp;#8216; (you know, that Disc burning program that does a fraction of what Disk Utility does but actually costs money) is now available as a &lt;a href="http://discoapp.com/blog/?p=30"&gt;public beta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the most controversial &amp;#8220;features&amp;#8221; of the program is the fact that the main window actually smokes when a disc is being burnt. Poking inside the bundle of Disco.app I came across &lt;a href="/uploads/SmokeFramework.png"&gt;Smoke.framework&lt;/a&gt; with what looks like full headers&amp;nbsp;included.&lt;/p&gt;
&lt;p&gt;Ignoring the dangers of passive smoking for a moment I decided it would be fun to try and use the smoke effect in a test&amp;nbsp;application.&lt;/p&gt;
&lt;p&gt;&lt;img alt="SecondHandSmoke.png" src="/uploads/SecondHandSmoke.png" /&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;#8217;s a quick movie to illustrate the pretty smoke&amp;nbsp;animation:&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/SecondHandSmoke.mp4"&gt;SecondHandSmoke.mp4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now you too can add the smoke effect to your own applications. Download the public beta of Disco (version 1.0b3 according to the Finders &amp;#8220;Get Info&amp;#8221; window). Be quick. I&amp;#8217;d imagine that the next release of Disco wont include headers for the framework. Move the application to your /Applications folder. Then download my test application here: &lt;a href="/uploads/SecondHandSmoke.zip"&gt;SecondHandSmoke.zip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You should be able to compile and run &amp;#8220;SecondHandSmoke&amp;#8221; (it will warn that it cannot find OSXHIGuidelines.pdf - but do like the Disco authors did and ignore that warning). If your hardware is capable enough you should be able to see the smoke effect rising from the top of the window. (It might take 10 to 20 seconds for the smoke to&amp;nbsp;appear).&lt;/p&gt;
&lt;p&gt;You can change the smoke parameters by using the smoke settings window (dialog? pane? view?) within Disco. Then just copy Disco&amp;#8217;s prefs (com.discoapp.Disco.plist) to SecondHandSmoke&amp;#8217;s prefs&amp;nbsp;(com.example.SecondHandSmoke.plist).&lt;/p&gt;
&lt;p&gt;Feel free to add smoke to your own applications, Brent - &lt;span class="caps"&gt;NNW&lt;/span&gt; users expect the main window to Smoke now. Dan, don&amp;#8217;t feel left behind, Sandvox needs to smoke. All the cool kids are doing it. Peer pressure is a&amp;nbsp;bitch.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; Predictably the guys at DiscoApp have removed the headers from the framework. Of course they refrained from rev-ing the version number of the beta. So now there are two 1.0b3 versions of DiscoApp in the wild. 1.0b3 (with headers) and 1.0b3 (without). Bad developer. No&amp;nbsp;cookie.&lt;/p&gt;
&lt;p&gt;Of course removing the headers does nothing to stop you from using &lt;a href="http://www.codethecode.com/Projects/class-dump/"&gt;class-dump&lt;/a&gt; to generate your own headers (and pretty cool headers they are - look at all those CIFilter subclasses). I&amp;#8217;ve just uploaded an &lt;a href="/uploads/SecondHandSmoke2.zip"&gt;amended project&lt;/a&gt; that includes a class-dumped header. You&amp;#8217;ll need to install Disco 1.0b3 (sans headers) into /Applications as&amp;nbsp;before.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Update 2&lt;/strong&gt; Just had a nice &lt;span class="caps"&gt;AIM&lt;/span&gt; conversation with Austin Sarner, one of the authors of Disco, and he seems to be quite amused by this little hack. Although I really don&amp;#8217;t like the use of the smoke effect in Disco, I completely support their attempts to&amp;nbsp;innovate.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Update 3&lt;/strong&gt; I took 15 minutes to hack the Smoke framework into a &lt;span class="caps"&gt;SIMBL&lt;/span&gt; plugin so that any application can have the smoke effect (why wait for developers to innovate?). I&amp;#8217;m not distributing this project as it requires a modification of the Smoke framework itself, but here&amp;#8217;s a movie: &lt;a href="/uploads/HolySmokesMovie.mp4"&gt;HolySmokesMovie.mp4&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Update 4&lt;/strong&gt; Reduce size of movie to 640x480 to keep people with smaller screens&amp;nbsp;happy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 5&lt;/strong&gt; My code no longer works. For an updated description of how to get the smoke working see: &lt;a href="http://dev.lipidity.com/feature/tutorial/now-this-is-hot-cocoa"&gt;dev.lipidity.com&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 30 Oct 2006 14:11:23 -0800</pubDate><guid>tag:toxicsoftware.com,2006-10-30:second-hand-smoke.html</guid></item><item><title>I would like to thank…</title><link>http://toxicsoftware.com/i-would-like-to-thank.html</link><description>&lt;p&gt;Cripes.&lt;/p&gt;
&lt;p&gt;I just won &lt;a href="http://ironcoder.org/blog/2006/10/29/we-have-a-winner-jonathan-wight/"&gt;Ironcoder&lt;/a&gt;. I now join the esteemed ranks previous winners: &lt;a href="http://lucaseckels.blogspot.com"&gt;Lucas Eckels&lt;/a&gt;, &lt;a href="http://gusmueller.com/blog/"&gt;Gus Mueller&lt;/a&gt; and &lt;a href="http://www.borkware.com/miniblog/"&gt;Mark Dalyrmple&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A big thank-you to Mark for hosting and judging &lt;a href="http://ironcoder.org"&gt;Ironcoder&lt;/a&gt;. As we&amp;#8217;ve learnt over the previous contests, judging Ironcoder is a tough and time consuming job (although Lucas had it easy). And coming up with interesting APIs and themes isn&amp;#8217;t easy either. Now I have been &amp;#8220;rewarded&amp;#8221; with this task for the next&amp;nbsp;Ironcoder.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll post more about my winning entry &amp;#8220;&lt;a href="http://ironcoder.org/entries/ironcoder_4/jwight_spacecam_11.zip"&gt;spacecam&lt;/a&gt;&amp;#8221; later. I was actually quite surprised I won after seeing some of the other entries, all of which were rather&amp;nbsp;cool.&lt;/p&gt;
&lt;p&gt;Ironcoder started off as pet project of the #macsb irc channel (itself an offshoot of the &amp;#8220;&lt;a href="http://groups.yahoo.com/group/macsb/"&gt;Mac Small Business Mailing List&lt;/a&gt;&amp;#8220;). And as such many of the usual suspects from #macsb are amongst the entrants. However I get a big kick out of all the Ironcoder entries that were from people I&amp;#8217;ve never heard of and have never seen in&amp;nbsp;irc.&lt;/p&gt;
&lt;p&gt;Jeff Smykil from &lt;a href="http://arstechnica.com"&gt;Ars Technica&lt;/a&gt; has taken an interest in Ironcoder and has posted an &lt;a href="http://arstechnica.com/journals/apple.ars/2006/10/27/5772"&gt;article&lt;/a&gt; on Friday announcing it. It is good to see outside interest in Ironcoder and I hope this trend&amp;nbsp;continues.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 30 Oct 2006 03:06:03 -0800</pubDate><guid>tag:toxicsoftware.com,2006-10-30:i-would-like-to-thank.html</guid></item><item><title>C4</title><link>http://toxicsoftware.com/c4.html</link><description>&lt;p&gt;Off to &lt;a href="http://c4.rentzsch.com"&gt;C4&lt;/a&gt; in just over an hour. See my &lt;a href="http://toxicsoftware.com/contact.html"&gt;contact&lt;/a&gt; page if you want to get a hold of my while I&amp;#8217;m away. I&amp;#8217;ll be staying in the Rosemont area with everyone else and letting the train take the strain. See you&amp;nbsp;there.&lt;/p&gt;
&lt;p&gt;And the hardware gods have decided to shine down on me. My black Macbook has begun to do the spontaneous shutdown thing this morning. Perfect timing there hardware&amp;nbsp;gods!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 20 Oct 2006 10:56:38 -0700</pubDate><guid>tag:toxicsoftware.com,2006-10-20:c4.html</guid></item><item><title>Mac OS Custom Icons and subversion don’t mix</title><link>http://toxicsoftware.com/mac-os-custom-icons-and-subversion-dont-mix.html</link><description>&lt;p&gt;I had some big trouble with subversion today. I had upgraded to subversion 1.4 on both client and server a few days ago and today something went tits up with the repository on the server. I wont go into more detail here until I&amp;#8217;ve reproduced and isolated the problem but suffice to say I deemed it worthwhile to try and restore my subversion repository from a recent dump file. Try was the operative&amp;nbsp;word: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;schwa&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;umbriel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Dumps&lt;/span&gt;$ &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;schwa&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;umbriel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Dumps&lt;/span&gt;$&lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;dumpfile&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;vnadmin: Invalid control character &amp;#39;&lt;/span&gt;0&lt;span class="n"&gt;x0d&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;trunk/Path/To/Some/Directory/Icon&amp;lt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;My attempt to recover from a dumpfile failed because my repository contained a folder with a custom icon. Crickey. I find it odd that subversion lets me check these bad files into subversion in the first place. But whatever, I had to recover this dump file. Fortunately there is a tool called &amp;#8216;dumpfilter&amp;#8217; that can be used to filter arbitrary paths in dump files. But after removing the first bad Icon file I found this particular repository had more than one. Instead of removing them by hand I started to write a shell script to automate the filtering process. Of course my shellfu is too low so I switched to&amp;nbsp;Python: &lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;commands&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="n"&gt;theInputFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;theOutputFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;theOutputFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;thePattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;^Node-path: (.+/Icon\r)$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;thePaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;thePattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theLine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theLine&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theInputFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;thePattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theLine&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;theOutputFile&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Found the following paths:&amp;#39;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;thePath&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thePaths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t\&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;thePath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;theCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;dumpfilter exclude &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt; &amp;lt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt; &amp;gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s"&gt; % thePath for thePath in thePaths]), theInputFile, theOutputFile)&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getstatusoutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theCommand&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;This script, when passed a path to an existing subversion dump file, will list all paths within the dump that contain custom icons. When passed a path to an existing dump file and the name of a new dump file it will remove all paths containing custom icons. You can then use this new dump file to populate your subversion repository without those pesky files. Update: From the comments, a link to Ryan Wilcox&amp;#8217;s blog page concerning the problem (and a more detailed description of the solution): &lt;a href="http://www.wilcoxd.com/blog/howto-get-out-the-icon-files-in-a-subversion-repo.html"&gt;http://www.wilcoxd.com/blog/howto-get-out-the-icon-files-in-a-subversion-repo.html&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 21 Sep 2006 00:30:03 -0700</pubDate><guid>tag:toxicsoftware.com,2006-09-21:mac-os-custom-icons-and-subversion-dont-mix.html</guid></item><item><title>FlexTime 1.0 finished</title><link>http://toxicsoftware.com/flextime-10-finished.html</link><description>&lt;p&gt;Daniel Jalkut of &lt;a href="http://www.red-sweater.com"&gt;Red Sweater&lt;/a&gt; &lt;a href="http://www.red-sweater.com/blog/136/insane-in-the-ui-brain"&gt;infamy&lt;/a&gt; has &lt;a href="http://www.red-sweater.com/blog/171/flextime-10"&gt;released&lt;/a&gt; &lt;a href="http://www.red-sweater.com/flextime/"&gt;FlexTime&lt;/a&gt;, a Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X timer application. Of interest to me is that FlexTime might well be the first released Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X application to make used of my &lt;a href="http://toxicsoftware.com/toxic_progress_indicator.html"&gt;Toxic Progress Indicator&lt;/a&gt; Cocoa Widget, as seen in the following screenshot: &lt;img alt="FlexTime.png" src="/uploads/FlexTime.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 17 Aug 2006 16:48:56 -0700</pubDate><guid>tag:toxicsoftware.com,2006-08-17:flextime-10-finished.html</guid></item><item><title>Obligatory WWDC Wrap-Up and Leopard Analysis</title><link>http://toxicsoftware.com/wwdc06.html</link><description>&lt;p&gt;&lt;a href="http://www.google.com/search?q=wwdc+wrap+up"&gt;Everyone&lt;/a&gt; &lt;a href="http://gusmueller.com/blog/archives/2006/08/wwdc06.html"&gt;else&lt;/a&gt; is &lt;a href="http://www.stuffonfire.com/2006/08/11/wwdc-wrap-up/"&gt;doing&lt;/a&gt; &lt;a href="http://blogs.roguesheep.com/?p=13"&gt;it&lt;/a&gt; so I figure I ought&amp;nbsp;to.&lt;/p&gt;
&lt;p&gt;This was my seventh &lt;span class="caps"&gt;WWDC&lt;/span&gt; and was definitely the most social one I&amp;#8217;ve attended by far. I met a tonne of people (mostly guys from #macsb who I&amp;#8217;d known virtually for almost year or so) including a lot of developers whose work I really&amp;nbsp;respect.&lt;/p&gt;
&lt;p&gt;Buzz&amp;#8217;s &lt;a href="http://weblog.scifihifi.com/2006/07/23/party-time-excellent/"&gt;weblogger&amp;#8217;s party&lt;/a&gt; was a great success, and I managed to stay mostly sober this time. I&amp;#8217;d really like to thank Buzz and co. for doing such a great job and I hope this remains a Monday night &lt;span class="caps"&gt;WWDC&lt;/span&gt;&amp;nbsp;tradition.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gusmueller.com/blog/"&gt;Gus Mueller&lt;/a&gt; did a great job introducing me (and everyone else) to every single attendee at &lt;span class="caps"&gt;WWDC&lt;/span&gt; (all 4000+ of them). The list of everyone I met this year is too long to post (or&amp;nbsp;remember).&lt;/p&gt;
&lt;p&gt;I can&amp;#8217;t talk too much about Leopard (that dreary &lt;span class="caps"&gt;NDA&lt;/span&gt; thing gets in the way) but it looks really great so far. From a user&amp;#8217;s perspective Leopard is good (Time Machine is something we&amp;#8217;ve wanted for a long time), but from a developer&amp;#8217;s perspective, &lt;span class="caps"&gt;WOW&lt;/span&gt;. I spent the first day after the Keynote and the &amp;#8220;State of the Union&amp;#8221; sessions being stunned and overwhelmed by all the new technology. There are so many goodies in 10.5 for developers that Apple have made it a very hard for developers to continue supporting 10.4. It will be a constant struggle to keep my head out of the clouds and remember that the end-users are still running 10.4 and won&amp;#8217;t be upgrading en-masse for a long while (excluding those who have &amp;#8220;found&amp;#8221; a copy on&amp;nbsp;bittorrent).&lt;/p&gt;
&lt;p&gt;However, predictably Apple has gone and stomped on my toes. A few of the &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;frameworks&lt;/a&gt; and Cocoa classes I&amp;#8217;ve developed over the years have been superseded or replaced by code in 10.5. This is generally a good thing, once 10.5 ships it&amp;#8217;ll be relatively easy to switch to Apple&amp;#8217;s code and then abandon my code (probably into my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;code graveyard&lt;/a&gt;). Supporting my own code has some advantages, mainly I can support 10.4 and older OSes if needed be. I&amp;#8217;m still trying to decide what to do with my public code that has been duplicated by Apple, should I support it - or abandon it now? There is certainly a lot of life in my code before Leopard&amp;nbsp;ships.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 17 Aug 2006 02:22:08 -0700</pubDate><guid>tag:toxicsoftware.com,2006-08-17:wwdc06.html</guid></item><item><title>WWDC 2006</title><link>http://toxicsoftware.com/wwdc-2006.html</link><description>&lt;p&gt;I&amp;#8217;m heading off to &lt;a href="http://developer.apple.com/wwdc/"&gt;&lt;span class="caps"&gt;WWDC&lt;/span&gt;&lt;/a&gt; on Sunday August 6th arriving around midday. I&amp;#8217;ll be at &amp;#8220;Zeitgeist&amp;#8221; on Sunday evening for the &amp;#8220;[Unofficial #macsb pre-&lt;span class="caps"&gt;WWDC&lt;/span&gt; dinner][]&amp;#8221; and Buzz&amp;#8217;s Monday night &amp;#8220;&lt;a href="http://upcoming.org/event/93479/"&gt;Webloggers party&lt;/a&gt;&amp;#8220;. Should be&amp;nbsp;fun.&lt;/p&gt;
&lt;p&gt;If anyone wants to get in &lt;a href="http://toxicsoftware.com/contact.html"&gt;contact with me&lt;/a&gt; before, during or after &lt;span class="caps"&gt;WWDC&lt;/span&gt; feel&amp;nbsp;free.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 28 Jul 2006 21:43:09 -0700</pubDate><guid>tag:toxicsoftware.com,2006-07-28:wwdc-2006.html</guid></item><item><title>Macbook Tarnishing</title><link>http://toxicsoftware.com/macbook-tarnishing.html</link><description>&lt;p&gt;My brand new white &lt;a href="http://www.apple.com/macbook/macbook.html"&gt;Macbook&lt;/a&gt; has weird tarnishing on the battery, and the bottom left third of the lower case up to and including some of the ports on the left hand side of the computer. The tarnishing looks as if the case has been smeared in a strong acid and the surface has been etched&amp;nbsp;away.&lt;/p&gt;
&lt;p&gt;It seems to be similar but not quite the same as the &lt;a href="http://docs.info.apple.com/article.html?artnum=304058"&gt;yellowing&lt;/a&gt; of the &lt;a href="http://news.com.com/2061-10793_3-6083486.html"&gt;top cases&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jwight/sets/72157594203439243/"&gt;Flickr photoset showing the surface of the battery.&lt;/a&gt; (I wish I had taken more&amp;nbsp;photos).&lt;/p&gt;
&lt;p&gt;Apple is blaming the damage on a &amp;#8220;chemical spill&amp;#8221; and so far getting them to repair it is proving difficult. To be honest I think this well could be a flaw with the machine and it would be to Apple&amp;#8217;s benefit (as well as mine obviously) for them to get to the bottom of exactly what caused. The computer hasn&amp;#8217;t left my side since we bought it, so I think I might have noticed a &amp;#8220;chemical&amp;nbsp;spill&amp;#8221;.&lt;/p&gt;
&lt;p&gt;If anyone is experiencing this or has heard of anything like it please let me&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;I was hoping that purchasing a Macbook would mean I wouldn&amp;#8217;t be affected by the &lt;a href="http://www.google.com/search?ie=utf8&amp;amp;oe=utf8&amp;amp;q=macbook+pro+problems"&gt;slew&lt;/a&gt; of &lt;a href="http://www.red-sweater.com/blog/113/macbook-pro-the-whining-user"&gt;problems&lt;/a&gt; affecting the Macbook Pros. But it seems like the Macbooks have &lt;a href="http://fraserspeirs.livejournal.com/1056810.html"&gt;problems&lt;/a&gt; of their&amp;nbsp;own.&lt;/p&gt;
&lt;p&gt;Update:&lt;/p&gt;
&lt;p&gt;Thanks to Alan for pointing me at &lt;a href="http://discussions.apple.com/thread.jspa?threadID=579368"&gt;this thread&lt;/a&gt; on the Apple discussions board. Looks like i am not alone. Hopefully the fact that someone else is seeing this problem will mean Apple won&amp;#8217;t try to blame me for exposing the Macbook to a &amp;#8220;chemical spill&amp;#8221; any&amp;nbsp;longer.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 28 Jul 2006 17:35:35 -0700</pubDate><guid>tag:toxicsoftware.com,2006-07-28:macbook-tarnishing.html</guid></item><item><title>Ironcoder 2 Aftermath</title><link>http://toxicsoftware.com/ironcoder-2-aftermath.html</link><description>&lt;p&gt;Wow &lt;a href="http://ironcoder.org/blog/2006/07/21/the-api-and-theme-is/"&gt;Ironcoder 2&lt;/a&gt; had a grand total of &lt;a href="http://ironcoder.org/blog/2006/07/23/ironcoder-2-or-is-it-3-is-over/"&gt;23 entries&lt;/a&gt;. The previous two contests had a total of 11. All off the entries were great (well ok, one was only four lines of code, but what four lines they&amp;nbsp;were!).&lt;/p&gt;
&lt;p&gt;I think we can definitely consider Ironcoder 2 a&amp;nbsp;success.&lt;/p&gt;
&lt;p&gt;Thanks to everyone who entered, there were definitely some great entries - a few of which might make good products in their own&amp;nbsp;rights.&lt;/p&gt;
&lt;p&gt;A big thanks to the &lt;a href="http://ironcoder.org/blog/2006/07/18/ironcoder-loot/"&gt;plethora of sponsors&lt;/a&gt;. I doubt the contest would have been such as a success without the lure of&amp;nbsp;booty.&lt;/p&gt;
&lt;p&gt;And Ironcoder &lt;a href="http://gusmueller.com/blog/"&gt;Gus Mueller&lt;/a&gt; deserves the biggest thanks for the astounding effort he put in to make Ironcoder 2 such a success. Gus single-handledly rounded up the sponsors, picked an awesome theme and &lt;span class="caps"&gt;API&lt;/span&gt; and then spent several hours judging the entries and organising the&amp;nbsp;awards.&lt;/p&gt;
&lt;p&gt;Scoring was extremely close but the overall winner of Ironcoder was &lt;a href="http://borkware.com/miniblog/"&gt;Mark Dalyrmple&lt;/a&gt;. I&amp;#8217;m looking forwarding to finding out what &lt;span class="caps"&gt;API&lt;/span&gt; and theme Mark chooses for the next contest in a few months&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;My Ironcoder entry was a &lt;a href="http://fallingsand.com"&gt;Falling Sand&lt;/a&gt; inspired toy called &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Sands of Time&lt;/a&gt;. I&amp;#8217;ll be posting more about this later. Source code is available from my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;subversion repository&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 24 Jul 2006 02:37:23 -0700</pubDate><guid>tag:toxicsoftware.com,2006-07-24:ironcoder-2-aftermath.html</guid></item><item><title>Tattoo Removal for Cory</title><link>http://toxicsoftware.com/tattoo-removal-for-cory.html</link><description>&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Cory_doctorow"&gt;Cory Doctorow&lt;/a&gt;, of &lt;a href="http://boingboing.net"&gt;boingboing&lt;/a&gt; fame and a longtime Apple Mac user, is &lt;a href="http://www.boingboing.net/2006/06/29/mark_pilgrims_list_o.html"&gt;switching from Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X to Ubuntu Linux&lt;/a&gt;. He also has an Apple logo tattooed on his &lt;a href="http://www.boingboing.net/2005/07/31/apple_to_add_trusted.html"&gt;right bicep&lt;/a&gt;. I&amp;#8217;d like to help Cory remove what will surely become a source of embarressment from his body. I&amp;#8217;ve started a &lt;a href="http://www.dropcash.com/campaign/schwa/tattoo_removal_for_cory/"&gt;dropcash account&lt;/a&gt; to help fund the&amp;nbsp;procedure.&lt;/p&gt;
&lt;p&gt;If Cory decides not to accept the donation for the procedure I will find a suitable charity to donate the proceeds&amp;nbsp;towards.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve guesstimated, the cost to be \$1000 for a single tattoo, based on information found on &lt;a href="http://www.faqs.org/qa/qa-12393.html"&gt;faqs.org&lt;/a&gt;, but if anyone knows how much the removal will cost in the &lt;span class="caps"&gt;L.A.&lt;/span&gt; area please let me&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="http://blogebrity.com/blog/2005/08/doctorow-has-mac-tattoo.php"&gt;slight chance&lt;/a&gt; this campaign raises enough money but Cory refuses to part with his Apple Logo I will donate the money to a worthy charity. Suggestions welcome in&amp;nbsp;comments.&lt;/p&gt;
&lt;p&gt;Links: &lt;a href="http://www.dropcash.com/campaign/schwa/tattoo_removal_for_cory/"&gt;Dropcash&amp;nbsp;campaign&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update: So far the campaign has collected \$0 / \$1000. At this rate we&amp;#8217;ll have that procedure funded in no time! Just hang on Cory, we&amp;#8217;re here for&amp;nbsp;you.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 29 Jun 2006 23:06:47 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-29:tattoo-removal-for-cory.html</guid></item><item><title>‘Discrete’ NSLevelIndicatorCell too slow</title><link>http://toxicsoftware.com/discrete-nslevelindicatorcell-too-slow.html</link><description>&lt;p&gt;I recently needed to embed the &amp;#8216;Discrete&amp;#8217; variant of the &lt;a href="http://www.devworld.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSLevelIndicatorCell_Class/Reference/Reference.html"&gt;NSLevelIndicatorCell&lt;/a&gt; into an NSTableView. The discrete cell looks like&amp;nbsp;this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Discrete.png" src="/uploads/Discrete.png" /&gt; Unfortunately adding the cell caused drawing of the table&amp;#8217;s window to slow to crawl. The spinning beachball of death would often appear when I was merely resizing the window. After some quick experimented I narrowed it down to something within the &amp;#8216;Discrete&amp;#8217; variant of the NSLevelIndicatorCell, the other variants had no such performance&amp;nbsp;problems.&lt;/p&gt;
&lt;p&gt;It didn&amp;#8217;t take an expert in &lt;a href="http://developer.apple.com/tools/sharkoptimize.html"&gt;Shark&lt;/a&gt; to realise what was going&amp;nbsp;on:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/uploads/Shark.png" /&gt; It looked like NSLevelIndicatorCell was perform an expensive gaussian blur per cell, possibly even for each discrete block within each cell. For a single NSLevelIndicatorCell that shouldn&amp;#8217;t be a real problem, but for a whole table column full of them it could create major performance&amp;nbsp;problems.&lt;/p&gt;
&lt;p&gt;Some quick google searches showed that people had complained about poor NSLevelIndicatorCell performance before but failed to find a&amp;nbsp;solution.&lt;/p&gt;
&lt;p&gt;Switching to another variant of NSLevelIndicatorCell wasn&amp;#8217;t an option, the &amp;#8216;Discrete&amp;#8217; variant was just too sexy. So the obvious solution was to create a subclass of NSLevelIndicatorCell that posed as the real thing, but cached the drawing code of its parent class into NSImages. So I present to the the world the imaginatively titled &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CCachingLevelIndicatorCell&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;CCachingLevelIndicatorCell is designed to pose as NSLevelIndicatorCell but shouldn&amp;#8217;t require any other configuration. The class will only cache images for the &amp;#8216;Discrete&amp;#8217; variant and will use a dictionary of NSImage objects to cache the drawing (one image per discrete value the cell can display). If any other attribute of the cell is changed the class will discard the cache and attempt to recache the drawing at the next&amp;nbsp;opportunity.&lt;/p&gt;
&lt;p&gt;Just so you can compare the differences in speed I&amp;#8217;ve created two stand-alone test applications so you can compare the speed without CCachingLevelIndicatorCell and with it posing as NSLevelIndicatorCell. The binaries are checked into my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;public subversion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Radar bug: &lt;a href="rdar://problem/4601201"&gt;rdar://problem/4601201&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 24 Jun 2006 16:30:44 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-24:discrete-nslevelindicatorcell-too-slow.html</guid></item><item><title>Grab that Invocation</title><link>http://toxicsoftware.com/grab-that-invocation.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CInvocationGrabber&lt;/a&gt; is a Cocoa class to help with creating &lt;a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/index.html#//apple_ref/doc/uid/TP40003671"&gt;NSInvocation&lt;/a&gt;&amp;nbsp;objects.&lt;/p&gt;
&lt;p&gt;NSInvocation objects are Cocoa&amp;#8217;s equivalent of &amp;#8220;&lt;a href="http://en.wikipedia.org/wiki/Function_object"&gt;functors&lt;/a&gt;&amp;#8221; and are extremely handy. But unfortunately creating them is often a pain. For example, take the following code showing how to create a simple&amp;nbsp;NSInvocation:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;NSInvocation&lt;/span&gt; &lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;theInvocation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSInvocation&lt;/span&gt; &lt;span class="n"&gt;invocationWithMethodSignature&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="n"&gt;theString&lt;/span&gt; &lt;span class="n"&gt;methodSignatureForSelector&lt;/span&gt;&lt;span class="p"&gt;:@&lt;/span&gt;&lt;span class="n"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;insertString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;atIndex&lt;/span&gt;&lt;span class="p"&gt;:)]];&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theInvocation&lt;/span&gt; &lt;span class="n"&gt;setSelector&lt;/span&gt;&lt;span class="p"&gt;:@&lt;/span&gt;&lt;span class="n"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;insertString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;atIndex&lt;/span&gt;&lt;span class="p"&gt;:)];&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theInvocation&lt;/span&gt; &lt;span class="n"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;theString&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;\*&lt;/span&gt;&lt;span class="n"&gt;theFirstArgument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;Hello&lt;/span&gt; &lt;span class="n"&gt;World&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theInvocation&lt;/span&gt; &lt;span class="n"&gt;setArgument&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;theFirstArgument&lt;/span&gt; &lt;span class="n"&gt;atIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;2&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="n"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;theSecondArgument&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; 42&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theInvocation&lt;/span&gt; &lt;span class="n"&gt;setArgument&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;theFirstArgument&lt;/span&gt; &lt;span class="n"&gt;atIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;3&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The code to create the same NSInvocation using my CInvocationGrabber class looks like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;CInvocationGrabber&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theGrabber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CInvocationGrabber&lt;/span&gt; &lt;span class="n"&gt;invocationGrabber&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;\
 &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;theGrabber&lt;/span&gt; &lt;span class="nl"&gt;prepareWithInvocationTarget:&lt;/span&gt;&lt;span class="n"&gt;theString&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;insertString:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;Hello World&amp;quot;&lt;/span&gt; &lt;span class="nl"&gt;atIndex:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;\
 &lt;span class="n"&gt;NSInvocation&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theInvocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theGrabber&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Obviously the primary benefit is that there is a lot less code. A secondary benefit is that you don&amp;#8217;t have to store your parameters on the heap and can just pass them into the &amp;#8216;grabbed&amp;#8217;&amp;nbsp;method.&lt;/p&gt;
&lt;p&gt;Now that I&amp;#8217;ve been using CInvocationGrabber for a few months I find I am using NSInvocations more and more. I&amp;#8217;m using them in places where I would normally have written a little delegate method. For example just today I needed to write code that called a method after a time delay. Normally I would have wrapped it up in a NSTimer delegate method, but with CInvocationHelper I just used the invocation variant of NSTimer. Although I wasn&amp;#8217;t saving many lines of code in this example, I was reducing the clutter in the&amp;nbsp;class.&lt;/p&gt;
&lt;p&gt;Cocoa developers with a keen eye might spot the similarity between CInvocationGrabber and Cocoa&amp;#8217;s NSUndoManager APIs. This code is directly inspired by NSUndoManager&amp;#8217;s prepareWithInvocation&amp;nbsp;method.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 24 Jun 2006 00:25:43 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-24:grab-that-invocation.html</guid></item><item><title>Toxic Progress Indicator Updated</title><link>http://toxicsoftware.com/toxic-progress-indicator-updated.html</link><description>&lt;p&gt;Thanks to &lt;a href="http://red-sweater.com/blog/"&gt;Daniel Jalkut&lt;/a&gt; for submitting a patch to &lt;a href="http://toxicsoftware.com/toxic_progress_indicator.html"&gt;Toxic Progress Indicator&lt;/a&gt;. The patches fixes a couple of silly bugs with setMinValue/setMaxValue and also makes the code a little bit more generic. I&amp;#8217;ve updated &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;subversion&lt;/a&gt; with the patch, which is recommended for all uses of ToxicProgressIndicator (both of&amp;nbsp;you).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 21 Jun 2006 14:37:27 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-21:toxic-progress-indicator-updated.html</guid></item><item><title>Lineform 1.1</title><link>http://toxicsoftware.com/lineform-11.html</link><description>&lt;p&gt;I wrote &lt;a href="http://toxicsoftware.com/pettysvg.html"&gt;PettySVG&lt;/a&gt; almost a year ago as a minimal &lt;span class="caps"&gt;SVG&lt;/span&gt; renderer framework for Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X. As such it works relatively well, although bugs still remain and the set of &lt;span class="caps"&gt;SVG&lt;/span&gt; functionality supported is rather low (PettySVG might be better suited as a &lt;a href="http://www.w3.org/TR/SVGMobile/"&gt;&lt;span class="caps"&gt;SVG&lt;/span&gt; Tiny or &lt;span class="caps"&gt;SVG&lt;/span&gt; Basic&lt;/a&gt;&amp;nbsp;renderer).&lt;/p&gt;
&lt;p&gt;However today I received an e-mail from &lt;a href="http://will.thimbleby.net"&gt;Will Thimbleby&lt;/a&gt;, who has just released version 1.1 of his drawing program, &lt;a href="http://www.tribarsw.net/lineform/news.php"&gt;Lineform&lt;/a&gt;. Lineform 1.1 adds, amongst other new features, &lt;span class="caps"&gt;SVG&lt;/span&gt; importing and exporting. This is fantastic news. I had looked at Lineform back when it was still a 1.0 application and found I couldn&amp;#8217;t use it mainly because it lacked &lt;span class="caps"&gt;SVG&lt;/span&gt;&amp;nbsp;support.&lt;/p&gt;
&lt;p&gt;Version 1.1 also adds support for CoreImage filters. This is full fledged CoreImage support inside a mature and robust drawing tool. Lineform isn&amp;#8217;t a &lt;a href="http://www.stone.com/iMaginator/iMaginator.html"&gt;toy application&lt;/a&gt; that simply lets you apply filters to image files. Lineform is quite possibly a &amp;#8220;killer app&amp;#8221; for CoreImage and with its addition Lineform could well become an &lt;a href="http://www.adobe.com/products/illustrator/"&gt;Adobe Illustrator&lt;/a&gt;&amp;nbsp;competitor.&lt;/p&gt;
&lt;p&gt;What is rewarding to me, is that Will used my PettySVG to help him develop the &lt;span class="caps"&gt;SVG&lt;/span&gt; import/export in&amp;nbsp;Lineform:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was very helpful in getting an understanding for how &lt;span class="caps"&gt;NSXML&lt;/span&gt; worked and getting started on my own &lt;span class="caps"&gt;SVG&lt;/span&gt; code. [&amp;#8230;] In any case you have my thanks for providing the code, it would have taken me much much longer to get to grips with &lt;span class="caps"&gt;NSXML&lt;/span&gt; without&amp;nbsp;it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I find e-mails (or blog comments) such as this extremely&amp;nbsp;gratifying.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 19 Jun 2006 14:11:41 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-19:lineform-11.html</guid></item><item><title>Quickies</title><link>http://toxicsoftware.com/quickies.html</link><description>&lt;ul&gt;
&lt;li&gt;Daniel Jalkut of &lt;a href="http://www.red-sweater.com/blog"&gt;Red-Sweater&lt;/a&gt; scores a hat-trick with three &lt;a href="http://www.red-sweater.com/blog/146/blog-redesign"&gt;very&lt;/a&gt; &lt;a href="http://www.red-sweater.com/blog/145/another-ui-bites-the-dust"&gt;interesting&lt;/a&gt; &lt;a href="http://www.red-sweater.com/blog/144/take-the-money-and-run"&gt;blog&lt;/a&gt; posts. Of special interest to me, is his posting about the &lt;a href="http://www.red-sweater.com/blog/146/blog-redesign"&gt;redesign of his blog&lt;/a&gt; using &lt;a href="http://nodebox.net"&gt;NodeBox&lt;/a&gt;. I actually introduced Daniel to NodeBox, little did I know he&amp;#8217;d do so much with it. Very&amp;nbsp;cool.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thekip.com/Site/about%20kip.html"&gt;The Kip&lt;/a&gt; is a strange tool for archiving, indexing and displaying &lt;span class="caps"&gt;PDF&lt;/span&gt; files. The interface is quite distinctive and a mixture between iPhoto and &lt;a href="http://del.icio.us"&gt;del.icio.us&lt;/a&gt;. I really like the embedding scanner functionality. See Apple? Not every scanner application has to suck. The Kip is given a yellow card for uploading a bunch of PDFs to my .mac account without asking my permission and unencrypted to&amp;nbsp;boot!&lt;/li&gt;
&lt;li&gt;&lt;a href="/uploads/wxHelloWorld.zip"&gt;wxHelloWorld&lt;/a&gt; is the canonical &lt;a href="http://wxWidgets.org"&gt;wxWidgets&lt;/a&gt; &amp;#8220;&lt;a href="http://wxwidgets.org/docs/tutorials/hello.htm"&gt;Hello World&lt;/a&gt;&amp;#8221; application inside an XCode project. This version is built using the DarwinPorts wxWidgets installation. I had to struggle to work out how to build wxWidgets based applications inside XCode (although in retrospect it is quite simple). Hopefully this little project will save other people from some of the struggle I went&amp;nbsp;through.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://atomicbird.com"&gt;Tom Harrington&lt;/a&gt; has announced &lt;a href="http://ironcoder.org/blog/2006/06/14/sparkle-plus/"&gt;Sparkle Plus&lt;/a&gt;. This is a fork of Andy Matuschak’s &lt;a href="http://andymatuschak.org/pages/sparkle"&gt;Sparkle&lt;/a&gt; auto-update framework for Cocoa. SparklePlus is hosted on &lt;a href="http://ironcoder.org"&gt;ironcoder.org&lt;/a&gt; and becomes the first Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X open source project hosted by&amp;nbsp;Ironcoder.&lt;/li&gt;
&lt;li&gt;An application I&amp;#8217;ve been working on has finally left &lt;span class="caps"&gt;QA&lt;/span&gt; and has entered beta today. And there was much rejoicing (until the big reports start rolling in of&amp;nbsp;course).&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 16 Jun 2006 00:42:07 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-16:quickies.html</guid></item><item><title>AquaticPrime Aftermath</title><link>http://toxicsoftware.com/aquaticprime-aftermath.html</link><description>&lt;p&gt;Well it turned out that my &lt;a href="http://toxicsoftware.com/aquaticprime-warning.html"&gt;posting&lt;/a&gt; yesterday caused quite a storm in a teacup. The macsb mailing list has probably seen more activity in a day that it does in a&amp;nbsp;month.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve learnt quite a few things from&amp;nbsp;this:&lt;/p&gt;
&lt;p&gt;AquaticPrime works just as intended. The flaw I highlighted yesterday isn&amp;#8217;t a flaw because AquaticPrime wasn&amp;#8217;t designed to defeat attacks of the kind described. Although nowhere on the AquaticPrime website or inside the documentation will you find any of this discussed. We can generously put this down to an innocent&amp;nbsp;omission.&lt;/p&gt;
&lt;p&gt;Even though this isn&amp;#8217;t a flaw it seems great efforts are made in people&amp;#8217;s code to prevent runtime attacks. Remember, it isn&amp;#8217;t a flaw, it is a design&amp;nbsp;decision.&lt;/p&gt;
&lt;p&gt;Paradoxically, even though my posting failed to identify a flaw in AquaticPrime (so no harm done right?), several people are rather quite angry that I have discussed it in the open. Apparently openly criticising open source software is not allowed. In fact I have been called some very nasty names from one particular AquaticPrime supporter over&amp;nbsp;this.&lt;/p&gt;
&lt;p&gt;It seems that some developers have given up the fight with pirates over runtime/binary attacks. Granted this is a really tough fight to fight, but i find it very interesting that the recommended tactic is to just give up. I think this is wildly underestimating pirates and especially the more casual pirates. The argument seems to be that the casual pirates will not bother finding/installing/running runtime cracks. And that spending effort trying to defeat the hardcore pirate is a waste of&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;However, with all the file sharing sites/software available to anyone today, casual pirates will be able to find cracks rather easily. And casual pirates probably won&amp;#8217;t have any problems running these cracks on their machines (after all they&amp;#8217;re probably already running keygens for their stolen Adobe software). Giving this fight up seems to be giving up a little too&amp;nbsp;easily.&lt;/p&gt;
&lt;p&gt;So finally be really careful when claiming that the &amp;#8220;emperor has no clothes&amp;#8221;. Such claims will never be received in a positive manner, regardless of whether the emperor is indeed stark naked or in fact wearing the latest, most advanced, invisible&amp;nbsp;wardrobe.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 09 Jun 2006 02:36:07 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-09:aquaticprime-aftermath.html</guid></item><item><title>AquaticPrime Warning</title><link>http://toxicsoftware.com/aquaticprime-warning.html</link><description>&lt;p&gt;&lt;a href="http://www.aquaticmac.com"&gt;AquaticPrime&lt;/a&gt; is a &amp;#8220;secure registration method for your shareware applications, released as free open-source&amp;nbsp;software&amp;#8221;.&lt;/p&gt;
&lt;p&gt;AquaticPrime uses &amp;#8220;&lt;span class="caps"&gt;RSA&lt;/span&gt; encryption to provide excellent security - the same that is used to protect government documents&amp;#8221;. This makes it sound like AquaticPrime is a great solution for Software Developers wanting to prevent piracy by adopting a software licensing scheme. A lot of &lt;a href="http://groups.yahoo.com/group/macsb/"&gt;Macintosh Small Business&lt;/a&gt; developers are using or are considering using&amp;nbsp;AquaticPrime.&lt;/p&gt;
&lt;p&gt;Unfortunately for them, AquaticPrime is incredibly easy to crack. I am not a &lt;a href="http://en.wikipedia.org/wiki/Computer_security"&gt;computer security&lt;/a&gt; expert and I am definitely not a &lt;a href="http://en.wikipedia.org/wiki/Cracker_%28computing%29"&gt;software cracker&lt;/a&gt;, but I was able to crack an application that used AquaticPrime in less than thirty minutes with almost no preparation time. In fact, I am pretty sure that my crack will work with almost all applications that use&amp;nbsp;AquaticPrime.&lt;/p&gt;
&lt;p&gt;Aquatic Prime uses a technique similar to one discussed by Allan Odgaard on his &lt;a href="http://macromates.com/sigpipe/archives/2004/09/05/using-openssl-for-license-keys/#comment-82"&gt;blog&lt;/a&gt;. &lt;a href="http://en.wikipedia.org/wiki/Public_key_cryptography"&gt;Public Key cryptography&lt;/a&gt; techniques are used to generate linked public and a private keys. The private key is kept by the software developer and the public key is shipped inside the application&amp;#8217;s binary. When a user buys a copy of the software, a license file is signed using the private key. The software can then use its public key to verify that the license key was signed by the public key. Someone trying to steal a copy of the software would be unable to forge their own license files because the public key works with one and only one private&amp;nbsp;key.&lt;/p&gt;
&lt;p&gt;The technique I used to defeat AquaticPrime involved creating my own private and public keys (using the AquaticPrime utility itself) and then generating a fake license key (registered to a &amp;#8220;John Doe&amp;#8221;) using the new private key. The trick then was cracking the test application and convincing it to use my public key instead of the real&amp;nbsp;key.&lt;/p&gt;
&lt;p&gt;To track the application, I needed a way of writing code that could be executed by the targeted application. Fortunately, there are a plethora of methods to do that on Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X: &lt;a href="http://www.unsanity.com/haxies/ape"&gt;Application Enhancer&lt;/a&gt;, &lt;a href="http://rentzsch.com/mach_inject/"&gt;MachInject&lt;/a&gt;, &lt;a href="http://www.cocoadev.com/index.pl?InputManager"&gt;InputManagers&lt;/a&gt;, and &lt;a href="http://culater.net/software/SIMBL/SIMBL.php"&gt;&lt;span class="caps"&gt;SIMBL&lt;/span&gt;&lt;/a&gt; plugins are just some of the many ways of forcing third-party applications to run foreign code. I chose to use a &lt;span class="caps"&gt;SIMBL&lt;/span&gt; plugin because I had never used &lt;span class="caps"&gt;SIMBL&lt;/span&gt; before and wanted to learn a little about it. Creating a &lt;span class="caps"&gt;SIMBL&lt;/span&gt; plug-in turned out to be incredibly easy and I had my code running inside the targeted application in just a few minutes. In a couple of minutes more, I had created an object that was masquerading as an &lt;a href="http://aquaticmac.com/guide/validate.php"&gt;AquaticPrime&lt;/a&gt; object. The final step was to make my masquerading object ignore the application&amp;#8217;s public key and use my fake public key instead. Once this was achieved I loaded my (or rather John Doe&amp;#8217;s) fake license key into the application and found that I had cracked the&amp;nbsp;application.&lt;/p&gt;
&lt;p&gt;It really was as simple as that. Of course there were a few &lt;span class="caps"&gt;WTF&lt;/span&gt; moments and application crashes, but nothing unusual during development (especially development of this kind). The code currently only works with AquaticPrime&amp;#8217;s Objective-C interface, but the same principles can be used for the pure C interface too. I have tried this technique on two shareware applications and it worked fine with both. I am reasonably confident that it should work with most AquaticPrime using&amp;nbsp;applications.&lt;/p&gt;
&lt;p&gt;The method used to defeat AquaticPrime isn&amp;#8217;t particularly obscure, and in fact is just one of many methods that could be used to defeat it. However this method is particularly nice in that you&amp;#8217;re not really hacking the application using a more brute force method. You&amp;#8217;re merely providing it with bad data, which it then uses to validate your bad license (kind of like Garbage In, Garbage out), in all other ways AquaticPrime is working as normal and is blissfully unaware that it has been cracked. This means that some of the techniques that developers can use to find out if their software has been cracked are&amp;nbsp;impossible.&lt;/p&gt;
&lt;p&gt;AquaticPrime is a well written, documented and marketed piece of software. But it suffers from this huge design flaw. AquaticPrime is exceptionally easy to crack, either with this method or with a variety of other, possibly cruder methods. Many of these methods are equally applicable to other registration schemes, so it is somewhat unfair to single AquaticPrime out. But because AquaticPrime provides all the source code and headers to anyone, it makes it really easy for anyone to crack. Although hiding the source code would have been a form of &amp;#8220;&lt;a href="http://en.wikipedia.org/wiki/Security_through_obscurity"&gt;security through obscurity&lt;/a&gt;&amp;#8220;, this would have at least slowed me down considerable. As it was, I was handed everything I needed to crack this software on a plate. And if I can crack this software in less than 30 minutes, I am sure crackers who do this thing professionally would have had even less&amp;nbsp;trouble.&lt;/p&gt;
&lt;p&gt;Even more worrying, this technique doesn&amp;#8217;t just work on a single application, it will work on all applications that use AquaticPrime. I don&amp;#8217;t know how many applications out there use AquaticPrime, but each is vulnerable to the same crack and all would be cracked essentially &amp;#8220;for free&amp;#8221;. There are some things a developer could do to shore up this vulnerability, but in reality most solutions are probably just as easily&amp;nbsp;cracked.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 08 Jun 2006 02:24:55 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-08:aquaticprime-warning.html</guid></item><item><title>Internet Clippings to XBEL</title><link>http://toxicsoftware.com/internet-clippings-to-xbel.html</link><description>&lt;p&gt;I have thousands of Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X url clippings files on my mac. These little files are reported by the finder as &amp;#8220;Web Internet Location&amp;#8221; files. They&amp;#8217;re sometimes known as &amp;#8220;weblocs&amp;#8221; (due to their file extension) and look like this: &lt;img alt="Webloc.png" src="/uploads/Webloc.png" /&gt;&lt;/p&gt;
&lt;p&gt;The reason I have so many of these things is that I switch browsers relatively frequently (bouncing between Safari and OmniWeb and occasionally Firefox) and I find weblocs are more permanent and just more convenient than browser&amp;nbsp;bookmarks.&lt;/p&gt;
&lt;p&gt;Mostly they&amp;#8217;re &amp;#8220;organised&amp;#8221; into a single folder and I use Spotlight to find the ones I am interested in at that moment. However Spotlight doesn&amp;#8217;t have a default webloc metadata importer, and this is where Toxic Software stands up to fill the gap. My &lt;a href="http://toxicsoftware.com/spotlight-importer-collection.html"&gt;Spotlight Importer Collection&lt;/a&gt; package includes three importers, one of which as luck would have it is a webloc importer (in fact it also imports a plethora of other internet clipping files: afploc, fileloc, ftploc, inetloc, mailloc, urlloc and&amp;nbsp;webloc).&lt;/p&gt;
&lt;p&gt;After installing Toxic &lt;span class="caps"&gt;URL&lt;/span&gt; Importer and waiting for Spotlight to index your volumes each webloc (if you&amp;#8217;re in a rush use mdimport to force Spotlight to index files immediately) you&amp;#8217;ll be able to view a webloc&amp;#8217;s &lt;span class="caps"&gt;URL&lt;/span&gt; directly in the finder: &lt;img alt="WeblocInfo.png" src="/uploads/WeblocInfo.png" /&gt;&lt;/p&gt;
&lt;p&gt;From Terminal.app you can use mdls to inspect the extra metadata added to the file by Toxic &lt;span class="caps"&gt;URL&lt;/span&gt;&amp;nbsp;Importer: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;schwa&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;cobweb&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Desktop&lt;/span&gt;$ &lt;span class="n"&gt;mdimport&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Bookmark&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Exchange&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Language&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Resource&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webloc&lt;/span&gt; 
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;schwa&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;cobweb&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Desktop&lt;/span&gt;$ &lt;span class="n"&gt;mdls&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Bookmark&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Exchange&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Language&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Resource&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webloc&lt;/span&gt; 
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/span&gt; &lt;span class="n"&gt;Bookmark&lt;/span&gt; &lt;span class="n"&gt;Exchange&lt;/span&gt; &lt;span class="n"&gt;Language&lt;/span&gt; &lt;span class="n"&gt;Resource&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webloc&lt;/span&gt; &lt;span class="o"&gt;-------------&lt;/span&gt;
&lt;span class="n"&gt;kMDItemContentType&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toxicsoftware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webloc&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;kMDItemContentTypeTree&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &amp;quot;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toxicsoftware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webloc&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; 
    &amp;quot;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toxicsoftware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlloc&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; 
    &amp;quot;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; 
    &amp;quot;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; 
    &amp;quot;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&amp;quot;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;kMDItemDisplayName&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;XML&lt;/span&gt;&lt;/span&gt; &lt;span class="n"&gt;Bookmark&lt;/span&gt; &lt;span class="n"&gt;Exchange&lt;/span&gt; &lt;span class="n"&gt;Language&lt;/span&gt; &lt;span class="n"&gt;Resource&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webloc&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;kMDItemID&lt;/span&gt;                             &lt;span class="p"&gt;=&lt;/span&gt; 17168962
&lt;span class="n"&gt;kMDItemKind&lt;/span&gt;                           &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;Web&lt;/span&gt; &lt;span class="n"&gt;Internet&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;kMDItemURL&lt;/span&gt;                            &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;pyxml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sourceforge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;topics&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xbel&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;org_spotlightdev_digest_sha1&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;794043&lt;span class="n"&gt;e7673e525d654e7b8e4115636408182528&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;org_spotlightdev_metadata_mdimporters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toxicsoftware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;importer&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;org_spotlightdev_metadata_url_host&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;pyxml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sourceforge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;org_spotlightdev_metadata_url_scheme&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;http&lt;/span&gt;&amp;quot;
&lt;span class="n"&gt;org_spotlightdev_metadata_urls&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;pyxml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sourceforge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;topics&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xbel&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can then search for weblocs by host or by scheme or a by any text in the url. Very&amp;nbsp;handy:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Spotlight.png" src="/uploads/Spotlight.png" /&gt; On the whole using weblocs and Spotlight together is a great solution. But I think I&amp;#8217;ve found a better one. Luis de la Rosa&amp;#8217;s &lt;a href="http://www.happyapps.com"&gt;WebNote Happy&lt;/a&gt; is a fantastic application for managing bookmarks. It allows me to manage my bookmarks in a single window (like my folder of weblocs) and integrates really well with &lt;a href="http://del.icio.us"&gt;del.icio.us&lt;/a&gt;. As fast as Spotlight searching is, WebNoteHappy beats it hands down with lightning fast&amp;nbsp;searches.&lt;/p&gt;
&lt;p&gt;Unfortunately WebNoteHappy doesn&amp;#8217;t yet import or export webloc files (Luis is a very responsive developer and am sure will be making up for this minor deficiency in later releases). But fortunately WebNoteHappy does import &lt;a href="http://pyxml.sourceforge.net/topics/xbel/"&gt;&lt;span class="caps"&gt;XBEL&lt;/span&gt;&lt;/a&gt; files, which as I&amp;#8217;ve already written about in my post about &lt;a href="http://toxicsoftware.com/converting-omniweb-bookmarks-to-xbel-for-webnotehappy.html"&gt;OmniWeb and &lt;span class="caps"&gt;XBEL&lt;/span&gt;&lt;/a&gt; is a very handy intermediate file&amp;nbsp;format.&lt;/p&gt;
&lt;p&gt;As it turns out I have almost all the tools necessary to get my thousands of weblocs files into WebNoteHappy. I have &lt;a href="http://toxicsoftware.com/mdfind2-updated.html"&gt;mdfind2&lt;/a&gt;, which like its little cousin &lt;a href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/mdfind.1.html"&gt;mdfind&lt;/a&gt; can perform Spotlight searches from the terminal. However mdfind2 can also export an &lt;span class="caps"&gt;XML&lt;/span&gt; file describing the metadata of the found items. All I needed to do was use mdfind2 to find all my webloc files and then transform the &lt;span class="caps"&gt;XML&lt;/span&gt; into &lt;span class="caps"&gt;XBEL&lt;/span&gt; via a custom written&amp;nbsp;&lt;span class="caps"&gt;XSLT&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Here is the &lt;span class="caps"&gt;XSLT&lt;/span&gt; file&amp;nbsp;&amp;#8220;mdfind2_to_xbel.xsl&amp;#8221;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-1&amp;quot;?&amp;gt;&lt;/span&gt;  
&lt;span class="k"&gt;&amp;lt;xsl:stylesheet&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;  
    &lt;span class="na"&gt;xmlns:xsl=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/1999/&lt;span class="caps"&gt;XSL&lt;/span&gt;/Transform&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="k"&gt;&amp;lt;xsl:output&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;xml&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;indent=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;doctype-public=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;+//&lt;span class="caps"&gt;IDN&lt;/span&gt; python.org//&lt;span class="caps"&gt;DTD&lt;/span&gt; &lt;span class="caps"&gt;XML&lt;/span&gt; Bookmark Exchange Language 1.0//&lt;span class="caps"&gt;EN&lt;/span&gt;//&lt;span class="caps"&gt;XML&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;doctype-system=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.python.org/topics/xml/dtds/xbel-1.0.dtd&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="k"&gt;&amp;lt;xsl:strip-space&lt;/span&gt; &lt;span class="na"&gt;elements=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="k"&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class="na"&gt;match=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
        &lt;span class="nt"&gt;&amp;lt;xbel&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
            &lt;span class="k"&gt;&amp;lt;xsl:apply-templates&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;  
        &lt;span class="nt"&gt;&amp;lt;/xbel&amp;gt;&lt;/span&gt;  
    &lt;span class="k"&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;  
    &lt;span class="k"&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class="na"&gt;match=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
        &lt;span class="nt"&gt;&amp;lt;bookmark&amp;gt;&lt;/span&gt;  
            &lt;span class="k"&gt;&amp;lt;xsl:attribute&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;href&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;attributes/attribute[@key=&amp;#39;kMDItemURL&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;/span&gt;  
            &lt;span class="k"&gt;&amp;lt;xsl:attribute&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;_&lt;span class="k"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;attributes/attribute[@key=&amp;#39;kMDItemID&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;/span&gt;           &lt;span class="k"&gt;&amp;lt;xsl:attribute&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;added&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;attributes/attribute[@key=&amp;#39;kMDItemContentCreationDate&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;/span&gt;  
            &lt;span class="k"&gt;&amp;lt;xsl:attribute&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;modified&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;attributes/attribute[@key=&amp;#39;kMDItemContentModificationDate&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;/span&gt;  
            &lt;span class="k"&gt;&amp;lt;xsl:attribute&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;visited&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;attributes/attribute[@key=&amp;#39;kMDItemLastUsedDate&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;/xsl:attribute&amp;gt;&lt;/span&gt;  
            &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;/title&amp;gt;&lt;/span&gt;  
        &lt;span class="nt"&gt;&amp;lt;/bookmark&amp;gt;&lt;/span&gt;  
    &lt;span class="k"&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;  
    &lt;span class="k"&gt;&amp;lt;xsl:template&lt;/span&gt; &lt;span class="na"&gt;match=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text()&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And here is the tiny snippet of shell script needed to tie it all&amp;nbsp;together:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;mdfind2&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;kMDItemContentTypeTree&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;com.toxicsoftware.urlloc&amp;#39;&lt;/span&gt;&amp;quot; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;  
&lt;span class="n"&gt;xsltproc&lt;/span&gt; &lt;span class="n"&gt;mdfind2_to_xbel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xsl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And here is the final resulting &lt;span class="caps"&gt;XBEL&lt;/span&gt; file (limited to just a single entry) ready to be imported in&amp;nbsp;WebNoteHappy:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/span&gt;  
&lt;span class="cp"&gt;&amp;lt;!&lt;span class="caps"&gt;DOCTYPE&lt;/span&gt; xbel &lt;span class="caps"&gt;PUBLIC&lt;/span&gt; &amp;quot;+//&lt;span class="caps"&gt;IDN&lt;/span&gt; python.org//&lt;span class="caps"&gt;DTD&lt;/span&gt; &lt;span class="caps"&gt;XML&lt;/span&gt; Bookmark Exchange Language 1.0//&lt;span class="caps"&gt;EN&lt;/span&gt;//&lt;span class="caps"&gt;XML&lt;/span&gt;&amp;quot; &amp;quot;http://www.python.org/topics/xml/dtds/xbel-1.0.dtd&amp;quot;&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;xbel&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
  &lt;span class="nt"&gt;&amp;lt;bookmark&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.txrollergirls.com/teams.htm&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_9799996&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;added=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2005-02-17 13:54:05 -0500&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;modified=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2005-02-17 13:54:05 -0500&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;visited=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2005-02-17 13:54:05 -0500&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;texas rollergirls &lt;span class="caps"&gt;TEAMS&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;  
  &lt;span class="nt"&gt;&amp;lt;/bookmark&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;/xbel&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After running the script I now have all my weblocs safely imported into WebNoteHappy, with duplicates removed (in fact they were never imported in the first place). I can tag them and add them to del.ici.ous with just a click, and I can now import my current Safari bookmarks into the list and manage &lt;em&gt;all&lt;/em&gt; my bookmarks in one&amp;nbsp;place.&lt;/p&gt;
&lt;p&gt;Using a little bit of custom coding (my &lt;span class="caps"&gt;URL&lt;/span&gt; Importer, mdfind2 and the &lt;span class="caps"&gt;XSLT&lt;/span&gt;) I was able to use the extensibility of Spotlight and WebNoteHappy to my advantage. A sure sign of how useful a piece of software is how easy it is to be extended by its end&amp;nbsp;users.&lt;/p&gt;
&lt;p&gt;Subversion Repository: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Misc/mdfind2_to_xbel&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 03 Jun 2006 16:36:05 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-03:internet-clippings-to-xbel.html</guid></item><item><title>mdfind2 updated</title><link>http://toxicsoftware.com/mdfind2-updated.html</link><description>&lt;p&gt;I&amp;#8217;ve just updated &lt;a href="http://toxicsoftware.com/mdfind2.html"&gt;mdfind2&lt;/a&gt;. The most important change is that it is now a universal binary. I&amp;#8217;ve also improved the command-line parsing (it now uses getopt_long) and prints usage information on&amp;nbsp;error.&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;p&gt;Subversion Repository: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Spotlight/mdfind2/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Binary: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Spotlight/mdfind2/Output/mdfind2.tar.bz2&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 03 Jun 2006 15:22:11 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-03:mdfind2-updated.html</guid></item><item><title>WordPressTool</title><link>http://toxicsoftware.com/wordpresstool.html</link><description>&lt;p&gt;Following on from my &lt;a href="http://toxicsoftware.com/expressionengine-to-wordpress.html"&gt;previous post&lt;/a&gt; I&amp;#8217;ve uploaded some &lt;a href="http://python.org"&gt;Python&lt;/a&gt; code that talks directly to a &lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt; server via MySQL and &lt;a href="http://www.sqlobject.org"&gt;Sqlobject&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;WordPressTool&lt;/a&gt; downloads all postings into plain text files (one per posting). You can then treat your postings as regular text files: grep through them, perform global search and replaces, and so on. You can then run the script again (don&amp;#8217;t forget to tweak it to change the import operation to an output) and it will upload all the updated posts to the&amp;nbsp;server.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve just used it to fix all the links to my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;subversion repository&lt;/a&gt; and it works great (&lt;a href="http://barebones.com"&gt;BBEdit&amp;#8217;s&lt;/a&gt; multi-file search and replace worked a&amp;nbsp;treat.)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 02 Jun 2006 04:33:20 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-02:wordpresstool.html</guid></item><item><title>ExpressionEngine to WordPress</title><link>http://toxicsoftware.com/expressionengine-to-wordpress.html</link><description>&lt;p&gt;I &lt;a href="http://toxicsoftware.com/blog-updates.html"&gt;recently&lt;/a&gt; migrated this blog from ExpressionEngine to WordPress. This was rather a daunting proposition due to the none existence of tools for doing this. The best I could really hope for was publishing all my content as a large &lt;span class="caps"&gt;RSS&lt;/span&gt; feed and then importing this feed. Doing this would have meant I would have lost all my comments, trackbacks and probably categories and a lot more other&amp;nbsp;information.&lt;/p&gt;
&lt;p&gt;Fortunately I had already written some code to export the content from ExpressionEngine. All I needed to do was write some more code to import the data into&amp;nbsp;WordPress.&lt;/p&gt;
&lt;p&gt;I am posting this code online and briefly describing it so that others in similar situations might be able to transfer their&amp;nbsp;content.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;ExpressionEngineExport.py&amp;#8221;&lt;/a&gt; uses &lt;a href="http://www.sqlobject.org"&gt;Sqlobject&lt;/a&gt; to talk directly to the &lt;span class="caps"&gt;EE&lt;/span&gt; database (in my case via a &lt;span class="caps"&gt;SSH&lt;/span&gt; tunnel because this code was running on my local machine, talking to a firewalled MySQL server). I model as much of &lt;span class="caps"&gt;EE&lt;/span&gt; as I needed with Sqlobject classes then I &amp;#8220;simply&amp;#8221; walk through the sql tables sucking out data, formatting it and fixing it where possible and then writing it to an &lt;span class="caps"&gt;XML&lt;/span&gt;&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;WordPressImporter.py&amp;#8221;&lt;/a&gt; takes the &lt;span class="caps"&gt;XML&lt;/span&gt; file and via Sqlobject imports it directly into WordPress&amp;#8217;s&amp;nbsp;database.&lt;/p&gt;
&lt;p&gt;The code works pretty reliably for me (I had a test server set up and tested the code quite thoroughly before importing the data into my &lt;a href="http://toxicsoftware.com"&gt;&amp;#8220;production&amp;#8221;&lt;/a&gt; server), however I make absolutely no guarantees that it will work for you. I am posting the code &amp;#8220;as-is&amp;#8221; in the hopes that it will be useful but I do not plan on supporting this code in any&amp;nbsp;way.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;code&lt;/a&gt; can be found within my subversion&amp;nbsp;directory.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 02 Jun 2006 02:33:23 -0700</pubDate><guid>tag:toxicsoftware.com,2006-06-02:expressionengine-to-wordpress.html</guid></item><item><title>Spotlight Importer Collection</title><link>http://toxicsoftware.com/spotlight-importer-collection.html</link><description>&lt;p&gt;Today I&amp;#8217;m announcing some code that has actually been on my public subversion repository for some time. The &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Spotlight Importer Collection&lt;/a&gt; is a set of three Spotlight&amp;nbsp;Importers.&lt;/p&gt;
&lt;p&gt;The first importer is &amp;#8220;Toxic Configuration Importer&amp;#8221;. This imports most plain-text based unix config files and Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X plist&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;The second importer is &amp;#8220;Toxic Logfile Importer&amp;#8221;. This imports all &amp;#8220;.log&amp;#8221; files as plain text. You can use Smart Folders to monitor your log files from the Finder. Beware that this is can be very expensive (log files are updated a&amp;nbsp;lot).&lt;/p&gt;
&lt;p&gt;The final importer is &amp;#8220;Toxic &lt;span class="caps"&gt;URL&lt;/span&gt; Importer&amp;#8221;, this code imports &lt;span class="caps"&gt;URL&lt;/span&gt; clippings. These are the files you get when dragging a &lt;span class="caps"&gt;URL&lt;/span&gt; from an application to the Finder. This is probably the most useful importer of the three and I&amp;#8217;ll be making a follow-up post just for this importer&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;Download a &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;disk image&lt;/a&gt; with installers with all three&amp;nbsp;importers.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 29 May 2006 19:46:20 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-29:spotlight-importer-collection.html</guid></item><item><title>Converting OmniWeb Bookmarks to XBEL (for WebNoteHappy)</title><link>http://toxicsoftware.com/converting-omniweb-bookmarks-to-xbel-for-webnotehappy.html</link><description>&lt;p&gt;Long title, small&amp;nbsp;program.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.happyapps.com/webnotehappy/"&gt;WebNoteHappy&lt;/a&gt; is my new favourite bookmark manager. Unfortunately version 1.0 doesn&amp;#8217;t import &lt;a href="http://www.omnigroup.com/applications/omniweb/"&gt;OmniWeb&lt;/a&gt; (a browser for which I have had a tempestuous on again/off again love affair for several years). I happen to know that forthcoming versions of WebNoteHappy will support OmniWeb amongst other browser but I am all about&amp;nbsp;instant-gratification.&lt;/p&gt;
&lt;p&gt;So newly checked into my new subversion repository (which now seems to be up and running fine) is &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;OmniWebToXBEL&lt;/a&gt; (&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;OmniWebToXBEL.zip&lt;/a&gt;). This shell script uses sed, tidy and xsltproc to convert the OmniWeb bookmarks file into an &lt;a href="http://pyxml.sourceforge.net/topics/xbel/"&gt;&lt;span class="caps"&gt;XBEL&lt;/span&gt;&lt;/a&gt; file. You can then import the &lt;span class="caps"&gt;XBEL&lt;/span&gt; document into&amp;nbsp;WebNoteHappy.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 29 May 2006 16:46:23 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-29:converting-omniweb-bookmarks-to-xbel-for-webnotehappy.html</guid></item><item><title>Blog Updates</title><link>http://toxicsoftware.com/blog-updates.html</link><description>&lt;p&gt;If you&amp;#8217;re viewing this entry in a browser you&amp;#8217;ll have noticed a new look for &lt;a href="http://toxicsoftware.com"&gt;toxicsoftware.com&lt;/a&gt;. Not satisfied with just changing the look I&amp;#8217;ve switched weblog software from &lt;a href="http://www.expressionengine.com"&gt;Expression Engine&lt;/a&gt; to &lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt;. And to complete the trifecta I&amp;#8217;ve changed hosts from &lt;a href="http://loopshot.com"&gt;Loopshot&lt;/a&gt; to &lt;a href="http://www.dreamhost.com/r.cgi?183340"&gt;Dreamhost&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am sure there will be some problems during this change-over. For example right now my public source code repository at &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/&lt;/a&gt; is missing. I&amp;#8217;ll be transferring the dump as soon as I can. Also not working, search panel from any non blog page, missing images from blog postings and a plethora of &amp;#8220;hello world&amp;#8221; place holders sprinkled throughout the&amp;nbsp;site.&lt;/p&gt;
&lt;p&gt;The new look for the site was created by Fernando Lucas of &lt;a href="http://www.devixdesign.com"&gt;devixdesign.com&lt;/a&gt;. I think Fernando did a great job making the theme suitably toxic. After receiving the art, stylesheets and &lt;span class="caps"&gt;HTML&lt;/span&gt; I manually converted the &lt;span class="caps"&gt;HTML&lt;/span&gt; into a WordPress theme (I might even make a &lt;a href="http://www.karelia.com/sandvox/"&gt;Sandvox&lt;/a&gt; theme out of&amp;nbsp;it)&lt;/p&gt;
&lt;p&gt;I switched &lt;span class="caps"&gt;CMS&lt;/span&gt;&amp;#8217;s from Expression Engine to WordPress for several reasons. &lt;span class="caps"&gt;EE&lt;/span&gt; does a poor job of integrating with a traditional web-site, making it very hard (practically impossible) for me to mix static pages and dynamic content. By removing this limitation I hope to fix a lot of the things I&amp;#8217;ve been really hating about my blog (like how hard it is to find anything!). &lt;span class="caps"&gt;WP&lt;/span&gt; also has many more useful plug-ins than &lt;span class="caps"&gt;EE&lt;/span&gt;, which should come in handy when trying to defeat spam and integrate other software like &lt;a href="http://haveamint.com"&gt;Mint&lt;/a&gt;. &lt;span class="caps"&gt;EE&lt;/span&gt; is commercial software and actually charges extra to download newer versions of the software you&amp;#8217;ve already bought, I find this gouging to be rather distasteful. Switching from &lt;span class="caps"&gt;EE&lt;/span&gt; to &lt;span class="caps"&gt;MT&lt;/span&gt; was not easy and involved ssh-tunnels to mysql servers and two Python scripts that used &lt;a href="http://www.sqlobject.org"&gt;SQLObject&lt;/a&gt; to export the data from &lt;span class="caps"&gt;EE&lt;/span&gt; into an &lt;span class="caps"&gt;XML&lt;/span&gt; file and then import that data into &lt;span class="caps"&gt;WP&lt;/span&gt;. I also have several &lt;a href="http://httpd.apache.org/docs/2.0/misc/rewriteguide.html"&gt;mod_rewrite&lt;/a&gt; directives that redirect old &lt;span class="caps"&gt;EE&lt;/span&gt; style URLs to the new &lt;span class="caps"&gt;WP&lt;/span&gt; links. I might blog about the process (and put the scripts online to help other people move over) in another&amp;nbsp;posting.&lt;/p&gt;
&lt;p&gt;Finally I switched hosts from &lt;a href="http://loopshot.com"&gt;Loopshot&lt;/a&gt; to &lt;a href="http://www.dreamhost.com/r.cgi?183340"&gt;Dreamhost&lt;/a&gt; simply because I could host multiple domains from a single Dreamhost account. I had already set up &lt;a href="http://ironcoder.org"&gt;Ironcoder.org&lt;/a&gt; on Dreamhost and was impressed with Dreamhost&amp;#8217;s ability to host and manage multiple domains. Loopshot is a great web-host if you need personal attention, its owner Eric Jennings is a great web developer, a very capable (and accommodating) server administrator and an all round good person and great&amp;nbsp;friend.&lt;/p&gt;
&lt;p&gt;And hopefully if you&amp;#8217;re viewing this post in an &lt;span class="caps"&gt;RSS&lt;/span&gt; reader you&amp;#8217;ll be wondering what the heck I am waffling on&amp;nbsp;about.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 26 May 2006 01:08:28 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-26:blog-updates.html</guid></item><item><title>Shaping future Ironcoders</title><link>http://toxicsoftware.com/shaping_future_ironcoders.html</link><description>&lt;p&gt;Anyone interested in shaping future Ironcoder competitions please visit and contribute to &lt;a href="http://ironcoder.org/blog/2006/05/23/ironcoder-future/"&gt;this thread on&amp;nbsp;Ironcoder.org&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 24 May 2006 01:10:30 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-24:shaping_future_ironcoders.html</guid></item><item><title>Stone Design ships Videator</title><link>http://toxicsoftware.com/stone_design_ships_videator.html</link><description>&lt;p&gt;Andrew Stone released &lt;a href="http://www.stone.com/Videator/Videator.html"&gt;Videator&lt;/a&gt; today. I haven&amp;#8217;t really played with it much, but it is like Imaginator but for video. It is a lot like my &lt;a href="http://toxicsoftware.com/toxicmedia_sequencegrabber_stable.html"&gt;Core Video Funhouse and Toxic Media&lt;/a&gt; projects. Of course my projects were just that - projects, Andrew has made a fully fledged product. I&amp;#8217;m actually surprised it took so long for someone to make an app like his, CoreImage and CoreVideo were released with Tiger and that has been shipping since April 05. Well kudos to Andrew for releasing&amp;nbsp;Videator.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 24 May 2006 00:59:13 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-24:stone_design_ships_videator.html</guid></item><item><title>Are you feeling a little Hyper Alert?</title><link>http://toxicsoftware.com/are_you_feeling_a_little_hyper_alert.html</link><description>&lt;p&gt;CHyperAlert is almost a direct clone of AppKit&amp;#8217;s &lt;a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSAlert_Class/index.html" title="NSAlert"&gt;NSAlert&lt;/a&gt; class. The primary difference is that instead of passing plain old strings, you can pass it &lt;span class="caps"&gt;HTML&lt;/span&gt; which will get rendered with WebKit inside the alert. This way you can have clickable URLs inside your alert dialogs. Hell, you can get really fancy and put Flash or QuickTime movies inside your dialogs. Why would you want to do this? The same reason men climb mountains: because they can. And because they&amp;#8217;re probably adrenaline junkies who like to risk their lives in freezing, oxygen poor environments where one mistake can kill&amp;nbsp;you.&lt;/p&gt;
&lt;p&gt;Fortunately no one has ever died using one of my Cocoa classes (although tying yourself to your partner is definitely&amp;nbsp;recommended).&lt;/p&gt;
&lt;p&gt;The &lt;span class="caps"&gt;API&lt;/span&gt; of CHyperAlert is identical to NSAlert and its behaviour is almost identical. The dialog will stretch and grow based on its content. Buttons will get assigned shortcut keys as per NSAlert, and so on. There are two extra methods for passing &lt;span class="caps"&gt;HTML&lt;/span&gt; formated and &lt;span class="caps"&gt;DOM&lt;/span&gt; nodes (representing the body of the &lt;span class="caps"&gt;HTML&lt;/span&gt; document) to the class. Also if passed a plain string it will try to convert URLs to full clickable anchors. Clicked anchors will use NSWorkspace to open the &lt;span class="caps"&gt;URL&lt;/span&gt; in the default &lt;span class="caps"&gt;URL&lt;/span&gt; handler (probably a Web Browser but who&amp;nbsp;knows)&lt;/p&gt;
&lt;p&gt;The code users some neat Carbon Icon family code from &lt;a href="http://red-sweater.com"&gt;Daniel Jalkut.&lt;/a&gt; Thanks&amp;nbsp;Daniel.&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/NSAlert.png" title="Before: plain, old dull NSAlert."&gt;Before: plain, old dull&amp;nbsp;NSAlert.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/CHyperAlert.png" title="After: dynamic, trendy, popular with the ladies CHyperAlert."&gt;After: dynamic, trendy, popular with the ladies&amp;nbsp;CHyperAlert.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html" title="Subversion Repository"&gt;Subversion&amp;nbsp;Repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html" title="Demo Application"&gt;Demo&amp;nbsp;Application&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 19 May 2006 06:45:55 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-19:are_you_feeling_a_little_hyper_alert.html</guid></item><item><title>Toxic Progress Indicator</title><link>http://toxicsoftware.com/toxic_progress_indicator.html</link><description>&lt;p&gt;Here is a sub-class of NSProgressindicator that implements the pie-chart style as seen in Xcode and Mail. This is similar to the spinning progress indicator (formerly the chasing tails indicator) but can be used for those hard to reach stains that need determinate indicators. Heady stuff I&amp;nbsp;know.&lt;/p&gt;
&lt;p&gt;As you can see from the following screenshot it is available in large and small varieties: &lt;img alt="Piecharts" src="http://toxicsoftware.com/sourcecode.html" /&gt;&lt;/p&gt;
&lt;p&gt;The indicator is quite configurable with many attributes being exposed and available for Cocoa binding (you can change colours and other drawing attributes). The progress indicator also has a &amp;#8220;halted&amp;#8221; mode, which when entered will cause it to display a user defined icon. This is very useful for those situations where you need a progress indicator to double as a warning icon (admit it, we&amp;#8217;ve all been&amp;nbsp;there!).&lt;/p&gt;
&lt;p&gt;As mentioned the class is a subclass of NSProgressIndicator and can be used just like that plain, old, boring, non-toxic class. However when you set the indicator to determinate &lt;em&gt;and&lt;/em&gt; set the type to spinning you&amp;#8217;ll get the new sexy&amp;nbsp;piechart.&lt;/p&gt;
&lt;p&gt;The class is completely standalone, a sample application is provided, as is an Interface Builder&amp;nbsp;palette.&lt;/p&gt;
&lt;p&gt;Links: &lt;a href="/uploads/ToxicProgressIndicatorScreenshot.png"&gt;Test Application Screenshot&lt;/a&gt; &lt;a href="/uploads/ToxicProgressIndicatorDemo.mp4"&gt;Test Application Movie (.mp4)&lt;/a&gt;. &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Subversion Repository&lt;/a&gt; &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Pre-built Test Application and Interface Builder&amp;nbsp;Palette&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Special thanks to &lt;a href="http://www.martian.com"&gt;Martian Technologies&lt;/a&gt;, makers of the &lt;a href="http://www.martian.com/SlingShot.html"&gt;Slingshot&lt;/a&gt; file syncing tool for expressing their gratitude by buying me items from my &lt;a href="http://amazon.com/o/redirect?tag=toxicsoftware-20&amp;amp;path=registry/2TZ40XN3TUSB5"&gt;Amazon wishlist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update: Chad Welder is also working on a widget just like this based on his cool &lt;a href="http://blog.oofn.net/2006/08/04/dock-progress/"&gt;CTProgressBadge&lt;/a&gt; code. I&amp;#8217;d let him know by posting a comment to his blog but his captcha isn&amp;#8217;t exactly user&amp;nbsp;friendly.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 19 May 2006 05:29:22 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-19:toxic_progress_indicator.html</guid></item><item><title>Bash weirdness on Mac OS X Intel boxes</title><link>http://toxicsoftware.com/bash_weirdness_on_mac_os_x_intel_boxes1.html</link><description>&lt;p&gt;Just a quickie (to prevent my blog from becoming a dinosaur and eventually fossil&amp;nbsp;fuel…)&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re running bash on an Intel Mac you might see some interesting behavior if you inspect the shell&amp;#8217;s&amp;nbsp;variables:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jwight&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ratatosk&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;jwight&lt;/span&gt;$ &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;TYPE&lt;/span&gt;&lt;/span&gt;
&lt;span class="n"&gt;&lt;span class="caps"&gt;HOSTTYPE&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;powerpc&lt;/span&gt;
&lt;span class="n"&gt;&lt;span class="caps"&gt;MACHTYPE&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;powerpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;0
&lt;span class="n"&gt;&lt;span class="caps"&gt;OSTYPE&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;darwin8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;0
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;PowerPC? Darwin 8.0? On my Quad G5 I get identical results. Checking the bash binary with the &amp;#8216;strings&amp;#8217; command seems to show these values are&amp;nbsp;hardcoded:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jwight&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ratatosk&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;jwight&lt;/span&gt;$ &lt;span class="n"&gt;strings&lt;/span&gt; `&lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;bash&lt;/span&gt;` &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="n"&gt;powerpc&lt;/span&gt;
&lt;span class="n"&gt;powerpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;darwin8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;0
&lt;span class="n"&gt;powerpc&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Looks like the &lt;span class="caps"&gt;OS&lt;/span&gt; version and the processor type is hardcoded into&amp;nbsp;bash.&lt;/p&gt;
&lt;p&gt;Oh and for the record this is what &amp;#8216;uname&amp;#8217;&amp;nbsp;reports:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jwight&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ratatosk&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;jwight&lt;/span&gt;$ &lt;span class="n"&gt;uname&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;Darwin&lt;/span&gt; &lt;span class="n"&gt;ratatosk&lt;/span&gt; 8&lt;span class="p"&gt;.&lt;/span&gt;6&lt;span class="p"&gt;.&lt;/span&gt;1 &lt;span class="n"&gt;Darwin&lt;/span&gt; &lt;span class="n"&gt;Kernel&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; 8&lt;span class="p"&gt;.&lt;/span&gt;6&lt;span class="p"&gt;.&lt;/span&gt;1&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Tue&lt;/span&gt; &lt;span class="n"&gt;Mar&lt;/span&gt;  7 16&lt;span class="p"&gt;:&lt;/span&gt;55&lt;span class="p"&gt;:&lt;/span&gt;45 &lt;span class="n"&gt;&lt;span class="caps"&gt;PST&lt;/span&gt;&lt;/span&gt; 2006&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xnu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;792&lt;span class="p"&gt;.&lt;/span&gt;9&lt;span class="p"&gt;.&lt;/span&gt;22&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;1&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;RELEASE_I386&lt;/span&gt; &lt;span class="n"&gt;i386&lt;/span&gt; &lt;span class="n"&gt;i386&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 15 May 2006 20:33:47 -0700</pubDate><guid>tag:toxicsoftware.com,2006-05-15:bash_weirdness_on_mac_os_x_intel_boxes1.html</guid></item><item><title>Iron Coder - Fin!</title><link>http://toxicsoftware.com/iron_coder_fin.html</link><description>&lt;p&gt;The zeroth Iron Coder contest is now over. We had 10 (possibly 11) entries. So far all of them that we&amp;#8217;ve seen like a lot of&amp;nbsp;fun.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 06 Mar 2006 02:43:32 -0800</pubDate><guid>tag:toxicsoftware.com,2006-03-06:iron_coder_fin.html</guid></item><item><title>Iron Coder - Progress Report 2</title><link>http://toxicsoftware.com/iron_coder_progress_report_2.html</link><description>&lt;p&gt;Second and final progress report. I&amp;#8217;ve uploaded my entry to the ftp site almost an hour before the deadline is up. I spent 3 or so hours last night playing with code from &lt;a href="http://nehe.gamedev.net"&gt;nehe&lt;/a&gt; to make an animated string of Mardi Gras beads, but didn&amp;#8217;t get very far. It probably would have been easier to start from scratch on that. Because that fell through my entry makes almost no use of the theme. I hope to score points on use of &lt;span class="caps"&gt;API&lt;/span&gt; though. The flu is knocking me for six this weekend too, bad timing. However it looks like &lt;a href="http://ironcoder.org"&gt;Ironcoder&lt;/a&gt; has been quite a success and if we decide to run it again I won&amp;#8217;t have the flu to use as an&amp;nbsp;excuse!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 06 Mar 2006 01:20:46 -0800</pubDate><guid>tag:toxicsoftware.com,2006-03-06:iron_coder_progress_report_2.html</guid></item><item><title>Iron Coder - Progress Report 1</title><link>http://toxicsoftware.com/iron_coder_progress_report_1.html</link><description>&lt;p&gt;It has been a little over 6 hours since the &lt;span class="caps"&gt;API&lt;/span&gt; for the ironcoder.org competition was announced. The first 24 hours of Iron Coder were supposed to be used as a familiarisation period to learn the &lt;span class="caps"&gt;API&lt;/span&gt;. Fortunately I&amp;#8217;m not totally unfamiliar with the accessibility &lt;span class="caps"&gt;API&lt;/span&gt; and a year or two ago I created a crude proof of concept for a neat little toy that used the &lt;span class="caps"&gt;API&lt;/span&gt;. So I&amp;#8217;ve actually been coding during since the start of the project. I&amp;#8217;m taking my old toy code and polishing it up and improving upon it. I have some neat ideas for&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Now the real trick will have to happen tomorrow (uh - later today) when I&amp;#8217;ll need to take the Iron Coder theme and apply it to my project. I&amp;#8217;m hoping for a really tacky theme, like Elvis Presley impersonators or Pink Lawn Flamingos. Jonathan &amp;#8216;Wolf&amp;#8217; Rentzsch really picked a great &lt;span class="caps"&gt;API&lt;/span&gt; (all hail the chairman) and I am sure he won&amp;#8217;t let us down with his choice of&amp;nbsp;theme.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not the only one starting coding early - I know a few people wont have much time during the second day of the competition so are hoping to score points on their use of the &lt;span class="caps"&gt;API&lt;/span&gt; alone. The beauty of this competition (I think, this is still our first attempt so who really knows how things will turn) is that it just encourages cool&amp;nbsp;hacks.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 04 Mar 2006 09:40:21 -0800</pubDate><guid>tag:toxicsoftware.com,2006-03-04:iron_coder_progress_report_1.html</guid></item><item><title>Iron Coder March 2006 has begun</title><link>http://toxicsoftware.com/iron_coder_march_2006_has_begun.html</link><description>&lt;p&gt;In his infinite wisdom Chairman &lt;a href="http://rentzsch.com/code/ironCoderV0Api"&gt;Rentzsch&lt;/a&gt; has chosen Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X&amp;#8217;s &lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/Accessibility/index.html"&gt;Accessibility &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; as the secret ingredient of the &lt;a href="http://ironcoder.org"&gt;contest&lt;/a&gt;. The &lt;a href="http://www.gusmueller.com/blog/archives/2006/2/21.html#1433"&gt;official thread&lt;/a&gt; of the March 2006 Iron Coder contest is hosted by Gus&amp;nbsp;Mueller.&lt;/p&gt;
&lt;p&gt;For people looking at the Accessiblity &lt;span class="caps"&gt;API&lt;/span&gt; for the first time and wonder &amp;#8220;what the f**k do I do with this&amp;#8221;, check out Apple&amp;#8217;s sample code at /Developer/Examples/Accessibility. More sample code available online here &lt;a href="http://developer.apple.com/samplecode/UIElementInspector/UIElementInspector.dmg"&gt;UIElementInspector.dmg&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 04 Mar 2006 02:21:37 -0800</pubDate><guid>tag:toxicsoftware.com,2006-03-04:iron_coder_march_2006_has_begun.html</guid></item><item><title>The first rule…</title><link>http://toxicsoftware.com/the_first_rule.html</link><description>&lt;p&gt;The first rule of [#macsb iron coder contest][] is - you do not talk about #macsb iron coder&amp;nbsp;contest.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 22 Feb 2006 02:25:43 -0800</pubDate><guid>tag:toxicsoftware.com,2006-02-22:the_first_rule.html</guid></item><item><title>Is that an HTTP server in your Cocoa application or are you just pleased to see me?</title><link>http://toxicsoftware.com/is_that_an_http_server_in_your_cocoa_application.html</link><description>&lt;p&gt;&lt;a href="/uploads/HTTPUserDefaultsTestScreenSnapz001.mp4"&gt;This&lt;/a&gt; is a little 30 second/1.&lt;span class="caps"&gt;4MB&lt;/span&gt; screencast showing a little idea I had to embed a simple &lt;span class="caps"&gt;HTTP&lt;/span&gt; server inside a Cocoa application. The screencast just shows an application hosting a basic &lt;span class="caps"&gt;HTML&lt;/span&gt; form that allows someone browsing to the application&amp;#8217;s address to modify the applications defaults. Changes to the &lt;span class="caps"&gt;HTML&lt;/span&gt; form are reflected live in the Cocoa Application&amp;#8217;s&amp;nbsp;&lt;span class="caps"&gt;GUI&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;This is pretty neat in its own right but isn&amp;#8217;t too useful to the average Cocoa application. Still I can see a few types of applications making good use of this, for instance combined with Bonjour broadcasting this could become a great interface for controlling background daemons from any machine. Alternatively web editors like &lt;a href="http://www.karelia.com"&gt;Sandvox&lt;/a&gt; could host their own mini web servers to provide a quick way of realistically previewing websites in Safari. Applications that edit hyper-linked data (mentioning no names) could benefit from hosting the data in a web server&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;Some interesting uses for the code would be to provide a &amp;#8220;poor man&amp;#8217;s RemoteDesktop&amp;#8221; style application and use the Universal Access api to populate an &lt;span class="caps"&gt;HTML&lt;/span&gt; based alternative &lt;span class="caps"&gt;GUI&lt;/span&gt; for an application. I don&amp;#8217;t think I have the time to code this hack but it would be interesting to see how useful it could be made to be. And for extra points write it as an InputManager and provide a &lt;span class="caps"&gt;HTML&lt;/span&gt; interface to every application &lt;em&gt;(the author in no way encourages the use of dirty evil hacks written as Input Managers, Input Managers are of course the loadable bundle of the beast and should of course be avoided at all times because of course Apple (Apple be praised) knows best - even if you can do some really freaking cool things with hacks)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Over the next week or so I&amp;#8217;ll try to release the code to the &lt;span class="caps"&gt;HTTP&lt;/span&gt; server. The code is actually rather old (written for 10.0 &lt;span class="caps"&gt;IIRC&lt;/span&gt;) having originally been written as a &lt;span class="caps"&gt;HTTP&lt;/span&gt; client library for a &lt;span class="caps"&gt;XML&lt;/span&gt; &lt;span class="caps"&gt;SOAP&lt;/span&gt; implementation I wrote that never saw the light of day (but may bundle with this code when I release it). The code was modular enough that it was pretty easy to turn the &lt;span class="caps"&gt;HTTP&lt;/span&gt; client code into &lt;span class="caps"&gt;HTTP&lt;/span&gt; server code. It consists of a bunch of ObjC socket wrappers (like &lt;a href="http://smallsockets.sourceforge.net"&gt;SmallSocket&lt;/a&gt;) and &lt;span class="caps"&gt;HTTP&lt;/span&gt; classes themselves. I have since created a framework (ToxicWarped) that works in a similar way to Python&amp;#8217;s &lt;a href="http://twistedmatrix.com"&gt;Twisted&lt;/a&gt; library and will try to modify my code to use that and also CFSocket instead of my socket&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;And a quick warning, obviously this code could constitute a major security risk if the embedded in an application that exposes the wrong kind of information via &lt;span class="caps"&gt;HTTP&lt;/span&gt;. Also, the &lt;span class="caps"&gt;HTTP&lt;/span&gt; server is obviously no where near the quality/robustness of Apache or Lighttpd, if you actually need to serve real content from your Cocoa application then I am pretty sure my code isn&amp;#8217;t&amp;nbsp;enough.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 17 Feb 2006 17:01:29 -0800</pubDate><guid>tag:toxicsoftware.com,2006-02-17:is_that_an_http_server_in_your_cocoa_application.html</guid></item><item><title>Cocoa, JSON &amp; Turbogears</title><link>http://toxicsoftware.com/cocoa_json_turbogears.html</link><description>&lt;p&gt;This post discusses how to use Cocoa to communicate with Turbogears powered web-applications. The post is a follow up to my &lt;a href="http://toxicsoftware.com/cocoajson.html"&gt;previous post&lt;/a&gt; that introduced my &lt;span class="caps"&gt;JSON&lt;/span&gt; Cocoa serialisation&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;The example Turbogears and Cocoa project is available from &lt;a href="/uploads/JSONTest.zip"&gt;JSONTest.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A normal Turbogears controller method looks something like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;turbogears&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;jsontest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Nobody&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Hello &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt; &lt;span class="caps"&gt;GET&lt;/span&gt; and &lt;span class="caps"&gt;POST&lt;/span&gt; parameters reach the method as the method&amp;#8217;s parameters and the method returns the result as a dictionary. The result can then be furher processed in the applications templates. The @turbogears.expose decorator defines which template will be used to process the result and produce the &lt;span class="caps"&gt;HTML&lt;/span&gt; page. You can tell a method to also return &lt;span class="caps"&gt;JSON&lt;/span&gt; formatted data by passing &amp;#8220;allow_json=True&amp;#8221; to the expose decorator. Now when the relevant turbogears url is accessed with &amp;#8220;?tg_format=json&amp;#8221; appended to the &lt;span class="caps"&gt;URL&lt;/span&gt;, a json document will get returned to the&amp;nbsp;client.&lt;/p&gt;
&lt;p&gt;This only allows the server to return &lt;span class="caps"&gt;JSON&lt;/span&gt; formatted data. It doesn&amp;#8217;t allow it understand &lt;span class="caps"&gt;JSON&lt;/span&gt; formatted data that is sent to it. To do that I&amp;#8217;ve created another decorator that takes &lt;span class="caps"&gt;JSON&lt;/span&gt; data from the &lt;span class="caps"&gt;HTTP&lt;/span&gt; request body if the Content-Type is&amp;nbsp;text/javascript:&lt;/p&gt;
&lt;p&gt;def JSON_INPUT(validators = {}):\
     def decorator(fn):\
         def newFunction(self, *args, **vargs):\
             if cherrypy.request.headerMap[&amp;#8216;Content-Type&amp;#8217;] == &amp;#8216;text/javascript&amp;#8217;:\
                 theBody = cherrypy.request.body.read()\
                 theDictionary = simplejson.read(theBody)\
                 theValidationKeys = set(theDictionary.keys()).intersection(set(validators.keys()))\
                 theItems = [(theKey, validators[theKey].to_python(theDictionary[theKey])) for theKey in theValidationKeys]\
                 theDictionary.update(dict(theItems))\
                 theDictionary = dict([(str(theItem[0]), theItem[1]) for theItem in theDictionary.items()])\
                 print theDictionary\
                 vargs.update(theDictionary)\
             result = fn(self, *args, **vargs)\
             return result\
         return newFunction\
     return&amp;nbsp;decorator\&lt;/p&gt;
&lt;p&gt;To use this decorator it needs to be declared after the normal @turbogears.expose decorator. And thats it, your method can now send and receive &lt;span class="caps"&gt;JSON&lt;/span&gt; formatted&amp;nbsp;data:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;turbogears&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="n"&gt;jsontest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&amp;quot;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_json&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;&lt;span class="caps"&gt;JSON&lt;/span&gt;&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_INPUT&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
 &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Nobody&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Hello &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now here&amp;#8217;s the fun part. Following is some Cocoa code to send a request to a turbogears server and handle the response. The code is just a simple &lt;span class="caps"&gt;HTTP&lt;/span&gt; &lt;span class="caps"&gt;POST&lt;/span&gt; with the &lt;span class="caps"&gt;HTTP&lt;/span&gt; body consisting of a &lt;span class="caps"&gt;JSON&lt;/span&gt; serialised NSDictionary. Also make sure the &amp;#8220;Content-Type&amp;#8221; is set correctly. The &lt;span class="caps"&gt;HTTP&lt;/span&gt; response is again just another &lt;span class="caps"&gt;JSON&lt;/span&gt; document that is deserialised into an NSDictionary. Of course this example code is very bad, no error checking and the &lt;span class="caps"&gt;HTTP&lt;/span&gt; &lt;span class="caps"&gt;POST&lt;/span&gt; is performed synchronously, don&amp;#8217;t do&amp;nbsp;this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(IBAction)actionTest:(id)inSender\
 {\
 NSDictionary *theRequestDictionary = [NSDictionary dictionaryWithObjectsAndKeys:\
     name, @&amp;#8221;name&amp;#8221;,\
     &lt;span class="caps"&gt;NULL&lt;/span&gt;];\
 //\
 &lt;span class="caps"&gt;NSURL&lt;/span&gt; *theURL = [&lt;span class="caps"&gt;NSURL&lt;/span&gt; URLWithString:@&amp;#8221;http://localhost:8080/test/?tg_format=json&amp;#8221;];\
 NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f];\
 [theRequest setHTTPMethod:@&amp;#8221;&lt;span class="caps"&gt;POST&lt;/span&gt;&amp;#8221;];\
 //\
 [theRequest setValue:@&amp;#8221;text/javascript&amp;#8221; forHTTPHeaderField:@&amp;#8221;Content-Type&amp;#8221;];\
 NSString *theBodyString = [[CJSONSerializer serializer] serializeDictionary:theRequestDictionary];\
 NSData *theBodyData = [theBodyString dataUsingEncoding:NSUTF8StringEncoding];\
 NSLog(@&amp;#8221;%@&amp;#8221;, theBodyData);\
 [theRequest setHTTPBody:theBodyData];\
 //\
 \
 NSURLResponse *theResponse = &lt;span class="caps"&gt;NULL&lt;/span&gt;;\
 NSError *theError = &lt;span class="caps"&gt;NULL&lt;/span&gt;;\
 NSData *theResponseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&amp;amp;theResponse error:&amp;amp;theError];\
 NSString *theResponseString = [[[NSString alloc] initWithData:theResponseData encoding:NSUTF8StringEncoding] autorelease];\
 NSDictionary *theResponseDictionary = [[CJSONDeserializer deserializer] deserialize:theResponseString];\
 NSString *theGreeting = [theResponseDictionary objectForKey:@&amp;#8221;greeting&amp;#8221;];\
 [self setValue:theGreeting forKey:@&amp;#8221;greeting&amp;#8221;];\&amp;nbsp;}\&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 08 Feb 2006 08:08:16 -0800</pubDate><guid>tag:toxicsoftware.com,2006-02-08:cocoa_json_turbogears.html</guid></item><item><title>CocoaJSON</title><link>http://toxicsoftware.com/cocoajson.html</link><description>&lt;p&gt;This code has been made redundant by: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TouchJSON&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Blake Seely released &lt;a href="http://blakeseely.com/blog/archives/2006/02/06/nsdictionary-dictionarywithjsonstring/"&gt;some code&lt;/a&gt; yesterday to convert Cocoa datatypes to &lt;span class="caps"&gt;JSON&lt;/span&gt;. I&amp;#8217;ve had similar code that I&amp;#8217;ve been meaning to put online for a while now. So now the world has gone from zero to two Cocoa code-bases to read/write&amp;nbsp;&lt;span class="caps"&gt;JSON&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The code is in subversion &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;here&lt;/a&gt;, and an archived version can be downloaded here: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CocoaJSON.zip&lt;/a&gt;. The code is standalone and some unit tests are&amp;nbsp;provided.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 08 Feb 2006 01:30:40 -0800</pubDate><guid>tag:toxicsoftware.com,2006-02-08:cocoajson.html</guid></item><item><title>Lovin’ for WebnoteHappy Lite</title><link>http://toxicsoftware.com/lovin_for_webnotehappy_lite.html</link><description>&lt;p&gt;Luis has posted 1.0 of &lt;a href="http://www.happyapps.com/webnotehappy"&gt;WebnoteHappy Lite&lt;/a&gt;. This is a really easy to use bookmark manager for Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X. I&amp;#8217;ve got way too many bookmarks in too many programs and WebNoteHappy can easily kick them into shape (getting rid of duplicate bookmarks in the&amp;nbsp;process).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 01 Feb 2006 08:17:41 -0800</pubDate><guid>tag:toxicsoftware.com,2006-02-01:lovin_for_webnotehappy_lite.html</guid></item><item><title>iMeem</title><link>http://toxicsoftware.com/imeem.html</link><description>&lt;p&gt;I wasn&amp;#8217;t really impressed with the new &lt;a href="http://imeem.com"&gt;iMeem&lt;/a&gt; buzzword enabled chat application until a bunch of us from [#macsb][] poked under its hood and saw &lt;a href="http://www.mono-project.com/Main_Page"&gt;Mono&lt;/a&gt; sitting there. It looks like the first non-trivial (correct me if I&amp;#8217;m wrong) Mono application has shipped for Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X. And what&amp;#8217;s more it looks good. It looks just like a native Cocoa application. Not surprising considering it uses a [C# to Cocoa bridge][] (and not [Cocoa#][] because apparently that &lt;a href="http://allan.imeem.com/blogentry/V4WWWKQU"&gt;sucks&lt;/a&gt;). You can download the &lt;a href="http://www.imeem.com/developers.aspx"&gt;bridge&lt;/a&gt; here. This definitely changes the face of cross-platform development on the Mac, I wonder if &lt;a href="http://www.friday.com/bbum/2006/01/11/google-earth-for-mac-big-disappointment/"&gt;Google&lt;/a&gt; is taking&amp;nbsp;note.&lt;/p&gt;
&lt;p&gt;More linke: &lt;a href="http://zacwhite.com/blog/?p=36"&gt;http://zacwhite.com/blog/?p=36&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 27 Jan 2006 22:25:22 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-27:imeem.html</guid></item><item><title>Software that SUCKS (but doesn’t have to)</title><link>http://toxicsoftware.com/software_that_sucks.html</link><description>&lt;p&gt;This is a list of software that is otherwise extremely useful but is let down by a really poor installation procedure. I&amp;#8217;ll be updating the list as I come across more software that almost gets it but lets it self down with a shoddy or unncessary installer. Feel free to contribute to the list by adding a&amp;nbsp;comment!&lt;/p&gt;
&lt;p&gt;Things that make the install process suck&amp;nbsp;include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses an installer but only installs an Application that could have easily been installed by hand via a drag &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; drop&amp;nbsp;install&lt;/li&gt;
&lt;li&gt;Uses an installer, but the installer forces you to install to /Applications when you&amp;#8217;d prefer to install to another&amp;nbsp;location.&lt;/li&gt;
&lt;li&gt;Uses a third party Installer that cannot be opened via Pacifist or installed using the command line &amp;#8220;installer&amp;#8221;&amp;nbsp;command&lt;/li&gt;
&lt;li&gt;Uses a own custom Installer (see above - but&amp;nbsp;worse)&lt;/li&gt;
&lt;li&gt;Software dials home and/or doesn&amp;#8217;t inform the the user that it dials home and/or dialing home cannot be switched off in the application&amp;#8217;s&amp;nbsp;preferences&lt;/li&gt;
&lt;li&gt;Software is packaged in a disk image that has been redundantly encoded and/or compressed in another archive (e.g.&amp;nbsp;.dmg.zip/.dmg.hqx)&lt;/li&gt;
&lt;li&gt;Installer refuses to run if any other applications are running and/or automatically quits other&amp;nbsp;applications&lt;/li&gt;
&lt;li&gt;Installer forces you to reboot (come on guys this is Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X not&amp;nbsp;Windows)&lt;/li&gt;
&lt;li&gt;Software is badly versioned (e.g. you download version 1.1 of a program but the Info.plist file says it is version&amp;nbsp;1.0)&lt;/li&gt;
&lt;li&gt;Software includes a version number in its filename (or the name of the enclosing&amp;nbsp;directory)&lt;/li&gt;
&lt;/ul&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href="http://www.smileonmymac.com/disclabel/"&gt;disclabel&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;by &lt;a href="http://www.smileonmymac.com"&gt;Smile On My&amp;nbsp;Mac&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why? 1) Uses an installer but only seems to install an Application. 2) Cannot install anywhere other than /Applications. 3) Uses a non-standard installer&amp;nbsp;(Filestorm).&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.belightsoft.com/products/mailfactory/overview.php"&gt;Mail&amp;nbsp;Factory&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;by &lt;a href="http://www.belightsoft.com"&gt;Belight&amp;nbsp;Software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why? 1) Uses an installer to install items that the application could install itself when ran. 2) Cannot install anywhere other than&amp;nbsp;/Applications.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.belightsoft.com/products/composer/overview.php"&gt;Business Card&amp;nbsp;Composer&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;by &lt;a href="http://www.belightsoft.com"&gt;Belight&amp;nbsp;Software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why? 1) Uses an installer to install items that the application could install itself when ran. 2) Cannot install anywhere other than&amp;nbsp;/Applications.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.activestate.com/Products/Download/Download.plex?id=Komodo"&gt;Komodo&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;by &lt;a href="http://www.activestate.com"&gt;ActiveState&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why? 1) Version 3.5.2 of Komodo is mislabled as Version&amp;nbsp;3.5&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://quicksilver.blacktree.com"&gt;QuickSilver&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;by &lt;a href="http://www.blacktree.com"&gt;Blacktree,&amp;nbsp;Inc.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why? 1) Application filename contains garbage unicode characters (&amp;#8220;Qu?c?s????????&amp;#8221; pretty huh?) in an attempt to look cool. (QuickSilver is one of the few apps that doesn&amp;#8217;t need to try to look cool, it already&amp;nbsp;is)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 26 Jan 2006 21:52:18 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-26:software_that_sucks.html</guid></item><item><title>A Fistful of Yojimbos</title><link>http://toxicsoftware.com/a_fistful_of_yojimbos.html</link><description>&lt;p&gt;&lt;a href="http://ranchero.com/?comments=1&amp;amp;postid=1266"&gt;Everyone&lt;/a&gt; has &lt;a href="http://2lmc.org/spool/id/5275"&gt;been&lt;/a&gt; &lt;a href="http://mjtsai.com/blog/2006/01/23/yojimbo-10/"&gt;posting&lt;/a&gt; &lt;a href="http://www.gusmueller.com/blog/archives/2006/1/23.html#1419"&gt;about&lt;/a&gt; how &lt;a href="http://www.oreillynet.com/pub/wlg/9088?CMP=OTC-13IV03560550&amp;amp;ATT=Yojimbo:+a+new+direction+for+Bare+Bones"&gt;cool&lt;/a&gt; &lt;a href="http://www.barebones.com"&gt;Bare Bone&amp;#8217;s&lt;/a&gt; new &lt;a href="http://www.barebones.com/products/yojimbo/index.shtml"&gt;Yojimbo&lt;/a&gt; application is. But so far no one has mentioned what a really &lt;a href="http://en.wikipedia.org/wiki/Yojimbo_%28film%29"&gt;freaking cool&lt;/a&gt; &lt;a href="http://www.imdb.com/title/tt0055630/"&gt;name&lt;/a&gt; it&amp;nbsp;has.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 24 Jan 2006 04:46:15 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-24:a_fistful_of_yojimbos.html</guid></item><item><title>Us vs Them</title><link>http://toxicsoftware.com/us_vs_them.html</link><description>&lt;p&gt;I don&amp;#8217;t editorialise very often if at all. Mainly because I&amp;#8217;m not egotistic enough to think anybody really cares about another random blogger writing a bunch of opinionated crap. However the storm in a teacup that is brewing over the &lt;a href="http://www.unsanity.com/smartcrashreports/"&gt;Smart Crash Reports&lt;/a&gt; feature built into the &lt;a href="http://www.karelia.com/sandvox/"&gt;Sandvox&lt;/a&gt; beta is beginning to bug me enough that I thought i ought to write about it. The center of the storm is over at &lt;a href="http://www.friday.com/bbum/"&gt;Bill Bumgarner&amp;#8217;s (bbum) blog&lt;/a&gt; primarily in the &amp;#8220;&lt;a href="http://www.friday.com/bbum/2006/01/20/sandvox-hidden-feature/#comments"&gt;Sandvox Hidden Features&lt;/a&gt;&amp;#8221; entry but also in the &amp;#8220;&lt;a href="http://www.friday.com/bbum/2006/01/20/detecting-and-disabling-smart-crash-reporter/"&gt;Detecting and Disabling Smart Crash Reports&lt;/a&gt;&amp;#8221; and &amp;#8220;&lt;a href="http://www.friday.com/bbum/2006/01/20/scr-response-from-sandvox/"&gt;&lt;span class="caps"&gt;SCR&lt;/span&gt;: Response from Sandvox&lt;/a&gt;&amp;#8220;&amp;nbsp;entries.&lt;/p&gt;
&lt;p&gt;Smart Crash Reports (&lt;span class="caps"&gt;SCR&lt;/span&gt;) is software released by &lt;a href="http://www.unsanity.com"&gt;Unsanity&lt;/a&gt; that third party developers can bundle with their own software to fool Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X&amp;#8217;s built-in crash reporter into sending bug reports to the third party developer as well as or instead of Apple. Many third party developers are bundling &lt;span class="caps"&gt;SCR&lt;/span&gt; with their software and a list is available from the &lt;a href="http://www.unsanity.com/smartcrashreports/list/"&gt;Unsanity website&lt;/a&gt;. In theory it sounds like a great tool, third party developers can enable &lt;span class="caps"&gt;SCR&lt;/span&gt; with very little work and then improve their software based on crash reports from their users. Unfortunately &lt;span class="caps"&gt;SCR&lt;/span&gt; has been implemented as an Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X &lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/InputManager/Concepts/InputManagerArchitecture.html"&gt;Input Manager&lt;/a&gt;. Input Managers are bundles that can be loaded into and executed within every application the user runs. They are designed to allow developers to create customised input methods. Because Input Managers are loaded in every application&amp;#8217;s address space Input Managers have been used almost exclusively for extended or changing the behavior of existing&amp;nbsp;applications.&lt;/p&gt;
&lt;p&gt;Some people believe that Input Managers and other software that inserts itself in other Applications (like Unsanity&amp;#8217;s &lt;a href="http://www.unsanity.com/haxies/ape"&gt;&lt;span class="caps"&gt;APE&lt;/span&gt;&lt;/a&gt; &amp;#8220;Haxies&amp;#8221;) contributes to system instability. I&amp;#8217;ve written &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;such software&lt;/a&gt; myself and am definitely aware how easy it is to cause unforeseen problems when writing software of this kind. Some people choose not to install Input Managers and Haxies believing that by not installing these 3rd party software that their system as a whole will be more stable. That&amp;#8217;s fine and more power to these people for knowing exactly what they want from their&amp;nbsp;system.&lt;/p&gt;
&lt;p&gt;Input Managers are stored in &amp;#8220;~/Library/Input Managers&amp;#8221; and &amp;#8220;/Library/Input Managers&amp;#8221; and once an Input Manager has been installed, every application the user runs after installing the Input Manager will have the Input Manager inserted and executed within the application. To uninstall an Input Manager the user should remove it from the Input Managers directory and then log out and log back in again (to make sure all effected programs are closed). Unsanity have created an optional feature in &lt;span class="caps"&gt;SCR&lt;/span&gt; that will automatically install &lt;span class="caps"&gt;SCR&lt;/span&gt; to the correct location without the user needing to install it by hand. Some applications that use &lt;span class="caps"&gt;SCR&lt;/span&gt; do not take advantage of the feature and some do. Sandvox does and this is what is causing this&amp;nbsp;controversy.&lt;/p&gt;
&lt;p&gt;When Sandvox first runs it silently installs &lt;span class="caps"&gt;SCR&lt;/span&gt; if it hasn&amp;#8217;t already been installed. From this point on any newly launched application is affected by &lt;span class="caps"&gt;SCR&lt;/span&gt;. According to Unsanity, &lt;span class="caps"&gt;SCR&lt;/span&gt; is designed only to actually do its thing inside Apple&amp;#8217;s crash report application (changing the behavior of the application to allow bug reports to be sent to third party developers). When ran inside any other application &lt;span class="caps"&gt;SCR&lt;/span&gt; effectively does nothing, it is still loaded but is not executing any extra code. This minimizes any potential unforeseen problems with loading the Input&amp;nbsp;Manager.&lt;/p&gt;
&lt;p&gt;Now some people are getting very annoyed with Sandvox and &lt;span class="caps"&gt;SCR&lt;/span&gt;, the storm in the teacup has brewed up and is now engulfing Unsanity and their &lt;span class="caps"&gt;APE&lt;/span&gt; technology. There have even been claims that &lt;span class="caps"&gt;SCR&lt;/span&gt; is spyware. Personally I think this is all going too far. The developers of Sandvox made a mistake in not giving the user the option of installing &lt;span class="caps"&gt;SCR&lt;/span&gt; or not. However Sandvox is beta software and will, almost by definition contains bugs and flaws. If you don&amp;#8217;t like that then don&amp;#8217;t run beta or any other kind of pre-release software. It is that simple. It amazes me that people who are so keen to see their system be as stable as possible would even dream of running beta&amp;nbsp;software.&lt;/p&gt;
&lt;p&gt;Unsanity also made a mistake in allowing the &lt;span class="caps"&gt;SCR&lt;/span&gt; install to occur silently. They should probably present the user with the option to prevent the installation of &lt;span class="caps"&gt;SCR&lt;/span&gt;. That way no software using &lt;span class="caps"&gt;SCR&lt;/span&gt; will ever install it without the user&amp;#8217;s&amp;nbsp;knowledge.&lt;/p&gt;
&lt;p&gt;And finally the Apple engineers made a mistake in not allowing third party developers from hooking into the crash reporter without the need to resort to an Input Manager hack. It could have been so easy for them to do (check for special keys inside a crashed application&amp;#8217;s Info.plist and then just forward a copy of the bug log). If they had done this then there wouldn&amp;#8217;t have been a need for &lt;span class="caps"&gt;SCR&lt;/span&gt; in the first&amp;nbsp;place.&lt;/p&gt;
&lt;p&gt;If Apple disapproves of the way Input Managers are being co-opted then they should close the loophole that allows Input Managers to run. It might be possible to provide a sort of &amp;#8220;Input Manager Server&amp;#8221; that all legitimate Input Managers run within. I&amp;#8217;m sure Apple engineers could even work out a way to disable Haxies too (at least until someone works out how to bypass&amp;nbsp;it).&lt;/p&gt;
&lt;p&gt;It has been mentioned that running Input Managers like &lt;span class="caps"&gt;SCR&lt;/span&gt; or running Haxies is akin to voiding a warranty on a piece of electronics equipment. I find this attitude patronising and antithetical to the cultures of hacking and of Macintosh both. Many people want cool features added to the operating system, and there&amp;#8217;s no doubt some of the &lt;a href="http://www.rogueamoeba.com/audiohijackpro/"&gt;things&lt;/a&gt; you can do with Haxies and Input Managers are extremely cool and non-trivial to achieve without some kind of hack. That&amp;#8217;s just the way it is. Apple engineers cannot foresee everything a piece of third party software can do and I find it disconcerting to see that Apple engineers have gone out of their way to lock down portions of the operating system from third party developers (google for Apple menu extras). I really hope Apple doesn&amp;#8217;t decide to try and prevent haxies and other hacks from working, it will only hurt them instead of hindering them. One of the posters to bbum&amp;#8217;s site summed it up quite amusingly: &amp;#8220;Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X is the child of Apple&amp;#8217;s engineers, their daughter. Nobody is good enough to date&amp;nbsp;her.&amp;#8221;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 23 Jan 2006 09:14:21 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-23:us_vs_them.html</guid></item><item><title>Python Plugin Enabler for Voodoo Pad</title><link>http://toxicsoftware.com/python_plugin_enabler_for_voodoo_pad.html</link><description>&lt;p&gt;I&amp;#8217;ve written a plugin for the extremely cool &lt;a href="http://flyingmeat.com/voodoopad/"&gt;VoodooPad&lt;/a&gt; application that allows you to write your own plugins for VoodooPad using Python. Gus (VoodooPad&amp;#8217;s author) describes it best on his &lt;a href="http://www.gusmueller.com/blog/archives/2006/1/21.html"&gt;blog&lt;/a&gt;. Gus helped me write the plugin and provided a new plugin &lt;span class="caps"&gt;API&lt;/span&gt; in VoodooPad (which is why it requires VoodooPad 2.5.3) to help get past a limitation in PyObjc. Gus now owns the plugin but my original subversion repository for the code is here:&amp;nbsp;[http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/VoodooPad/VoodooPad%20PythonPlugin/][]&amp;#8230;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 23 Jan 2006 02:25:38 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-23:python_plugin_enabler_for_voodoo_pad.html</guid></item><item><title>Python Metadata Importer 1.0.6 Released</title><link>http://toxicsoftware.com/python_metadata_importer_106_released.html</link><description>&lt;p&gt;I&amp;#8217;ve just released version 1.0.6 of my Python Metadata Importer plugin. What&amp;#8217;s&amp;nbsp;new:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for Intel&amp;nbsp;architecture.&lt;/li&gt;
&lt;li&gt;UTType now includes Python&amp;#8217;s &lt;span class="caps"&gt;OS&lt;/span&gt; Creator&amp;nbsp;code.&lt;/li&gt;
&lt;li&gt;Slightly better error&amp;nbsp;handling&lt;/li&gt;
&lt;li&gt;Python Metadata Importer shouldn&amp;#8217;t die when indexing Python files it doesn&amp;#8217;t&amp;nbsp;understand.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Direct&amp;nbsp;download:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Python Metadata&amp;nbsp;Importer.dmg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Source&amp;nbsp;code:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Spotlight/Python%20Metadata%20Importer/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;About Python Metadata&amp;nbsp;Importer:&lt;/p&gt;
&lt;p&gt;Allows Spotlight to import and index Python script source code. Various metadata are imported from the source code including function and class names, version, author and&amp;nbsp;description.&lt;/p&gt;
&lt;p&gt;Related&amp;nbsp;Postings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/python_metadata_importer_released_for_tiger.html"&gt;Python Metadata Importer Released for&amp;nbsp;Tiger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/spoke_at_phadorg_meeting_tonight.html"&gt;Spoke at phad.org meeting&amp;nbsp;tonight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/lisp_metadata_importer.html"&gt;Lisp Metadata&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/ruby_spotlight_importer.html"&gt;Ruby Spotlight&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/python_metadata_importer_101_released.html"&gt;Python Metadata Importer 1.0.1&amp;nbsp;Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/python_metadata_importer_released_for_tiger.html"&gt;Python Metadata Importer Released for&amp;nbsp;Tiger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/conf_metadata_importer.html"&gt;Conf Metadata&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/creating_a_generic_config_file_spotlight_importer.html"&gt;Creating a Generic Config File Spotlight&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 22 Jan 2006 20:09:14 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-22:python_metadata_importer_106_released.html</guid></item><item><title>Who’s your daddy…</title><link>http://toxicsoftware.com/whos_your_daddy.html</link><description>&lt;p&gt;Compiling subversion seems to have become a bit of &lt;a href="http://www.gusmueller.com/blog/archives/2006/1/17.html#1415"&gt;ad-hoc benchmark&lt;/a&gt; among Developers for testing the speed of a&amp;nbsp;machine.&lt;/p&gt;
&lt;p&gt;On my Quad 2.5Ghz G5 the benchmark&amp;nbsp;was:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;real&lt;/span&gt;    5&lt;span class="n"&gt;m13&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;747&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;    2&lt;span class="n"&gt;m45&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;942&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;     2&lt;span class="n"&gt;m39&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;909&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Where the &amp;#8220;real&amp;#8221; time is the actual physical time spent waiting for the build to complete. Telling make to run more jobs concurrently using the -j&amp;nbsp;flag&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;MAKEFLAGS&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&amp;quot;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j8&lt;/span&gt;&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;produced a massive performance&amp;nbsp;gain:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;real&lt;/span&gt;    1&lt;span class="n"&gt;m39&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;326&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;    2&lt;span class="n"&gt;m46&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;088&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;     2&lt;span class="n"&gt;m20&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;560&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;During the second test all four &lt;span class="caps"&gt;CPUS&lt;/span&gt; were running at 100% dipping to about 90% between builds of subprojects. During the first time both CPUs never really reached beyond 20% or&amp;nbsp;so.&lt;/p&gt;
&lt;p&gt;Impressive. Despite the Duo Intel Macintoshes the Quad G5 is still the&amp;nbsp;king.&lt;/p&gt;
&lt;p&gt;And pretty pictures are &lt;a href="/uploads/QuadSubversion.png"&gt;here&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 20 Jan 2006 00:34:30 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-20:whos_your_daddy.html</guid></item><item><title>mdfind2</title><link>http://toxicsoftware.com/mdfind2.html</link><description>&lt;p&gt;I&amp;#8217;m clearing out some of my old code and found this little gem. &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;mdfind2&lt;/a&gt; is a replacement for Apple&amp;#8217;s &lt;a href="man://mdfind"&gt;mdfind&lt;/a&gt; command line tool. This version adds one feature that mdfind doesn&amp;#8217;t have, you can specify the &amp;#8212;xml switch on the command-line to output the results (including full attribute values) in&amp;nbsp;&lt;span class="caps"&gt;XML&lt;/span&gt;. &lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s an example of output (or just one file, normally the output is a lot&amp;nbsp;longer):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;spotlight&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;query&amp;gt;&lt;/span&gt;kMDItemTextContent == &amp;quot;xyzzy&amp;quot;&lt;span class="nt"&gt;&amp;lt;/query&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;results&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;NSString_PathExtensions.h&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;link&amp;gt;&lt;/span&gt;file://localhost/Volumes/Shared/Users/Shared/Developer/Products/Debug/ToxicFoundation.framework/Versions/A/Headers/NSString_PathExtensions.h&lt;span class="nt"&gt;&amp;lt;/link&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;attributes&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSOwnerUserID&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;501&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSOwnerGroupID&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;501&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSTypeCode&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSIsExtensionHidden&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemID&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;322662&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSSize&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;427&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSCreationDate&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-19 18:57:40 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSName&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NSString_PathExtensions.h&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSContentChangeDate&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-19 18:57:40 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSCreatorCode&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSLabel&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSInvisible&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSNodeCount&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemAttributeChangeDate&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-21 11:36:14 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemFSFinderFlags&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemUsedDates&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-19 18:57:40 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemLastUsedDate&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-19 18:57:40 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemKind&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;C Header Source File&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemDisplayName&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NSString_PathExtensions.h&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemContentType&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;public.c-header&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemContentTypeTree&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;public.c-header public.source-code public.plain-text public.text public.data public.item com.apple.cocoa.path com.apple.cocoa.string public.content&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemContentCreationDate&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-19 18:57:40 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;attribute&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;kMDItemContentModificationDate&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2005-12-19 18:57:40 -0500&lt;span class="nt"&gt;&amp;lt;/attribute&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/attributes&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/item&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/results&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/spotlight&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Source here: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Spotlight/mdfind2/&lt;/a&gt; Binary here: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Spotlight/mdfind2/Projects/Output/mdfind2.zip&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update: Just found an &lt;span class="caps"&gt;XSLT&lt;/span&gt; file that can used to transform the output of mdfind2 to an atom file: http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Spotlight/mdfind2/SpotlightToAtom.xsl - and now of course I&amp;#8217;ll need to work out how to get this working in&amp;nbsp;NetNewsWire&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update: Well that didn&amp;#8217;t take long! I can now perform spotlight queries in&amp;nbsp;NetNewsWire: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download mdfind2 and the SpotlightToAtom.xsl&amp;nbsp;files.&lt;/li&gt;
&lt;li&gt;Create a shell script with&amp;nbsp;containing: &lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh  &lt;/span&gt;
~/Products/Debug/mdfind2 --xml &lt;span class="nv"&gt;$*&lt;/span&gt; | xsltproc &lt;span class="s2"&gt;&amp;quot;$&lt;span class="caps"&gt;HOME&lt;/span&gt;/Library/Application Support/mdfind2/SpotlightToAtom.xsl&amp;quot;&lt;/span&gt; -
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Fix the paths to mdfind2 and SpotlightToAtom.xsl to suit your environment. 
    3. Create a new script special subscription in NetNewsWire and configure it to point to the script you just created. Set the parameters of the script to the Spotlight query you want executed&amp;#8230;&lt;a href="/uploads/SpotlightNNWSpecialSubscription.png"&gt;SpotlightNNWSpecialSubscription.png&lt;/a&gt;
    4. Execute the query (or refresh the feed) and NetNewsWire should display the results of the query: &lt;img alt="image" src="/uploads/SpotlightNNWResult.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 06 Jan 2006 04:06:22 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-06:mdfind2.html</guid></item><item><title>PowerMac Quad G5 Review</title><link>http://toxicsoftware.com/powermac_quad_g5_review.html</link><description>&lt;p&gt;&lt;img alt="image" src="/uploads/Quad.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 03 Jan 2006 23:47:47 -0800</pubDate><guid>tag:toxicsoftware.com,2006-01-03:powermac_quad_g5_review.html</guid></item><item><title>Service Scrubber</title><link>http://toxicsoftware.com/service_scrubber.html</link><description>&lt;p&gt;A &lt;a href="http://www.technorati.com/search/service+scrubber"&gt;lot of Mac blogs&lt;/a&gt; are getting excited about &lt;a href="http://www.petermaurer.de/nasi.php?section=servicescrubber"&gt;Service Scrubber&lt;/a&gt;. While currently probably the best solution to the crazy Service menu situation on Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X (and something I am now using), users need to be aware that Service Scrubber directly modifies the user’s applications. Namely the application will modify an Application’s Info.plist file. However it will make a backup of the data it modifies (although it would probably be best to make a copy of the entire Info.plist file instead of just copying the previous value of the NSServices key into a backup key). Why is this a big deal? Well - it has several side&amp;nbsp;effects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you upgrade the application with a newer version, your services preferences will be lost. You’ll need to re-run Service Scrubber and re-apply your settings. This could get very tedious with lots of applications. I&amp;#8217;m sure many mac users like to keep their software as up to date as&amp;nbsp;possible.&lt;/li&gt;
&lt;li&gt;The services for a particular application will be modified for &lt;span class="caps"&gt;ALL&lt;/span&gt; users on the machine. To most people this is probably a good thing though, but you should be aware of&amp;nbsp;this.&lt;/li&gt;
&lt;li&gt;Because Services Scrubber finds all applications on the user’s machine (possibly via the LaunchServices &lt;span class="caps"&gt;API&lt;/span&gt;) developers need to be aware that they could be modifying the services on one of their own applications that they need to ship. Of course a developer who disables the services on his or her own application should rethink the application’s use of&amp;nbsp;services.&lt;/li&gt;
&lt;li&gt;In some situations (applications on read-only media, users not having privilege to write to the applications folder) Service Scrubber just wont work. I would imagine that these situations are rather uncommon for typical home&amp;nbsp;users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think Service Scrubber is a good piece of software but it has some rather serious limitations/side effects. I don’t think directly modifying an the data files of an application is the best way to control the Services menu. Personally I’d prefer to see a &lt;a href="http://www.unsanity.com/haxies/ape"&gt;Haxie&lt;/a&gt; directly modify the service menu - that way if you decide to revert back to normal you can just uninstall the Haxie. Any developers out there willing to write this&amp;nbsp;hack?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update: A few grammar fixes and minor&amp;nbsp;changes.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 22 Dec 2005 18:59:05 -0800</pubDate><guid>tag:toxicsoftware.com,2005-12-22:service_scrubber.html</guid></item><item><title>-tidy</title><link>http://toxicsoftware.com/svn_tidy.html</link><description>&lt;p&gt;Another quick subversion script. This Python script automatically scans through a &amp;#8216; status&amp;#8217; report and automatically removes missing files and adds new files to your subversion repository. Of course you&amp;#8217;ll need to commit the changes (or revert back if you made a mistake). This script is a quick and easy way of making a subversion repository match your working&amp;nbsp;directory.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;popen2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;popen2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popen2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39; status&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;theRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;^(.)[ &lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;]+(.+)$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;theLines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theLine&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;theLine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theLine&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;theMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theRegex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theLine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;theStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theMatch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;theFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theMatch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;theOperation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;theStatus&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;theOperation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;delete&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;theStatus&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;theOperation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;add&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;theOperation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;theCommand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theOperation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theCommand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 19 Dec 2005 02:19:45 -0800</pubDate><guid>tag:toxicsoftware.com,2005-12-19:svn_tidy.html</guid></item><item><title>-url</title><link>http://toxicsoftware.com/svn_url.html</link><description>&lt;p&gt;I haven’t posted in a while, been very busy with projects. But here’s a very useful little shell function for getting the &lt;span class="caps"&gt;URL&lt;/span&gt; of a path within a subversion working&amp;nbsp;directory:&lt;/p&gt;
&lt;p&gt;function -url { info \$1 &gt; /dev/null &lt;span class="caps"&gt;ERROR&lt;/span&gt;=\$? if [ \$&lt;span class="caps"&gt;ERROR&lt;/span&gt; -ne 0 ]; then     return \$&lt;span class="caps"&gt;ERROR&lt;/span&gt; fi info \$1 | grep ‘&lt;span class="caps"&gt;URL&lt;/span&gt;: ’ | sed ‘s/&lt;span class="caps"&gt;URL&lt;/span&gt;: //’&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;Put the code into your shell rc file. You could use this function with back ticks like&amp;nbsp;so:&lt;/p&gt;
&lt;p&gt;co `-url&amp;nbsp;/path/to/some/working/directory`&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;Update: Removed smart&amp;nbsp;quotes.&lt;/li&gt;
&lt;li&gt;Update: Add Daniel Jalkut’s change to the sed&amp;nbsp;statement.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update: With the &lt;a href="http://www.codingmonkeys.de/mbo/articles/2006/01/02/new-year-new-subversion"&gt;Subversion 1.3 update&lt;/a&gt; you can use the &amp;#8212;xml switch to output &lt;span class="caps"&gt;XML&lt;/span&gt; that you can then process with &lt;a href="man://xsltproc"&gt;xsltproc&lt;/a&gt; from the command&amp;nbsp;line:&lt;/p&gt;
&lt;p&gt;Save this &lt;span class="caps"&gt;XSLT&lt;/span&gt; file into a well known location (I saved mine into \~/Library/Application&amp;nbsp;Support/Subversion/-url.xslt):&lt;/p&gt;
&lt;p&gt;\&amp;lt;?xml version=&amp;#8216;1.0&amp;#8217; encoding=&amp;#8217;utf-8&amp;#8217;?&gt; \&amp;lt;stylesheet version=‘1.0’ xmlns=‘http://www.w3.org/1999/&lt;span class="caps"&gt;XSL&lt;/span&gt;/Transform’&gt;     \&amp;lt;output method=‘text’/&gt;     \&amp;lt;template match=&amp;#8221;/&amp;#8221;&gt;         \&amp;lt;apply-templates select=&amp;#8221;/info/entry/url&amp;#8221;/&gt;     \&amp;lt;/template&gt;     \&amp;lt;template match=&amp;#8221;/info/entry/url&amp;#8221;&gt;\&amp;lt;value-of select=&amp;#8221;.&amp;#8221;/&gt;\&amp;lt;text&gt;&amp;amp;#10;\&amp;lt;/text&gt;\&amp;lt;/template&gt; \&amp;lt;/stylesheet&gt;&lt;/p&gt;
&lt;p&gt;Then use it like&amp;nbsp;this:&lt;/p&gt;
&lt;p&gt;function -url { info &amp;#8212;xml \$* | xsltproc &amp;#8220;\$&lt;span class="caps"&gt;HOME&lt;/span&gt;/Library/Application Support/Subversion/-url.xslt&amp;#8221; -&amp;nbsp;}&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One big advantage over the previous script is that this new version allows you to use specify wildcards and multiple paths. Of course you&amp;#8217;ll need 1.3&amp;nbsp;though.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 19 Dec 2005 00:53:36 -0800</pubDate><guid>tag:toxicsoftware.com,2005-12-19:svn_url.html</guid></item><item><title>ToxicMedia &amp; SequenceGrabber Stable</title><link>http://toxicsoftware.com/toxicmedia_sequencegrabber_stable.html</link><description>&lt;p&gt;I&amp;#8217;ve moved all the SequenceGrabber utility code into its own framework: ToxicMedia.framework, the code is available from &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;trunk/Frameworks/ToxicMedia&lt;/a&gt;. All my projects that use CoreImage, CoreVideo or QTKit now depend on this framework. Now I don&amp;#8217;t need to update 4 or 5 projects every time something&amp;nbsp;changes.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also branched all the test projects and the framework. You can find the branch here: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;branches/SequenceGrabber Stable&lt;/a&gt;. This branch is intended to be relatively stable, I&amp;#8217;ll make sure the code can always build and run. If you don&amp;#8217;t feel like dealing with the churn in the trunk then this branch is for&amp;nbsp;you.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 14 Nov 2005 04:32:34 -0800</pubDate><guid>tag:toxicsoftware.com,2005-11-14:toxicmedia_sequencegrabber_stable.html</guid></item><item><title>CoreVideoFunHouse</title><link>http://toxicsoftware.com/corevideofunhouse.html</link><description>&lt;p&gt;A quick &lt;a href="/uploads/CoreVideoFunHouse.mp4"&gt;demo movie&lt;/a&gt; of my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CoreVideoFunHouse&lt;/a&gt; (does that name sound &lt;a href="http://developer.apple.com/macosx/coreimage.html"&gt;familiar&lt;/a&gt;?)&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;The project shares code with my Sequence Grabber project and renders QuickTime movies using QTKit and CoreVideo. It also uses macros made up of multiple Core Image filters and defined in a simple &lt;span class="caps"&gt;XML&lt;/span&gt; file, each item in the popup menu is a macro of one or more Core Image filters that are linked together to produce the effect. I&amp;#8217;ve also written a Python script to import Core Image Fun House data files and convert them into my &amp;#8220;cimacro&amp;#8221; files (this functionality will be rewritten in ObjC one&amp;nbsp;day).&lt;/p&gt;
&lt;p&gt;The latest version of the code (checked in but not shown in the demo movie) also features crude animation and allows the video source to be selected on the fly between a movie file and an&amp;nbsp;iSight.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 27 Oct 2005 10:56:42 -0700</pubDate><guid>tag:toxicsoftware.com,2005-10-27:corevideofunhouse.html</guid></item><item><title>More SequenceGrabber Updates</title><link>http://toxicsoftware.com/more_sequencegrabber_updates.html</link><description>&lt;p&gt;Spurred on by interest in my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Sequence Grabber&lt;/a&gt; source code I&amp;#8217;ve added a whole slew of new functionality to it tonight (for various reasons this code is a lot of fun to work on). The most important change is &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CCoreImageView&lt;/a&gt; now supports Cocoa bindings and has an Interface Builder palette. This means you can easily create a view in Interface Builder and bind it to your controller/model objects without writing a line of code! &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CSequenceGrabberView&lt;/a&gt; isn&amp;#8217;t in the palette yet but will be soon, when it is you&amp;#8217;ll be able add iSight support to your Cocoa application without writing any code. I&amp;#8217;ve spent some time simplifying and improving the sequence grabber &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;video channel&lt;/a&gt; classes. The code is now much easier to understand and modify (a lot of this code is based on some pretty badly written Apple sample code and needed a lot of tidying up before it is&amp;nbsp;readable).&lt;/p&gt;
&lt;p&gt;The easiest way to use the sequence grabber is just to add a CSequenceGrabberView to your project. The view supports start and stop actions so you can wire your user interface directly to the view. You can also access the underlying CSequenceGrabber object directly if needed. There are plenty of hooks in the code to add your custom functionality - &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CSequenceGrabber&lt;/a&gt; (and its children video and sound channel objects) sends many useful NSNotifications. I&amp;#8217;m also going to make the code use Cocoa bindings as much as possible. That way you can use bindings and/or notifications as your need&amp;nbsp;dictates.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve improved the &amp;#8220;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;QuadView&lt;/a&gt;&amp;#8221; sample code to take advantage of Cocoa bindings support in CCoreImageView. One thing I&amp;#8217;ve noticed is that the core image filtering just isn&amp;#8217;t very fast. After two or three live video streams running through Core Image filters the frame rate drops rather dramatically. I will look into this further and hope to make big improvements if my code is actually the bottleneck. Or maybe it is time to just order that Quad G5 now that they&amp;#8217;re available (one 2.5GHz core per video stream sounds like a great&amp;nbsp;idea!).&lt;/p&gt;
&lt;p&gt;If you are having trouble building the code - remember all projects require Xcode 2.1 (or newer, I am using Xcode 2.2 for development). Also you &lt;em&gt;will&lt;/em&gt; need subversion to check out a full copy of the&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;Finally I&amp;#8217;ve been really encouraged by the interest that my Sequence Grabber code has generated. I&amp;#8217;m getting a few emails a week from people using it in their projects. I love hearing about the uses people are putting the code to and encourage anyone using it to append a comment to this blog&amp;nbsp;posting.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 21 Oct 2005 01:11:14 -0700</pubDate><guid>tag:toxicsoftware.com,2005-10-21:more_sequencegrabber_updates.html</guid></item><item><title>Also Online…</title><link>http://toxicsoftware.com/also_online.html</link><description>&lt;p&gt;Also online - the initial check-in of my &lt;a href="http://toxicsoftware.com/heres_your_media_browser_right_here.html"&gt;Media Browser&lt;/a&gt; code. Currently definitely a work in progress, you can check it out and build it but there are some definite rough&amp;nbsp;edges. &lt;/p&gt;
&lt;p&gt;Source code: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Misc/MediaBrowser/&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 13 Oct 2005 19:40:56 -0700</pubDate><guid>tag:toxicsoftware.com,2005-10-13:also_online.html</guid></item><item><title>Sequence Grabber Updated</title><link>http://toxicsoftware.com/sequence_grabber_updated.html</link><description>&lt;p&gt;My sequence grabber code (previously mentioned &lt;a href="http://toxicsoftware.com/sequence_grabber_code_now_with_coregoodness.html"&gt;here&lt;/a&gt;) has been updated. It should be a lot easier to get up and running now - I&amp;#8217;ve added a &amp;#8220;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CSequenceGrabberView&lt;/a&gt;&amp;#8221; NSView subclasss that you just need to drag and drop into your nib&amp;#8217;s NSWindow. I&amp;#8217;ve also improved the error handling so that the lack of a plugged in iSight camera won&amp;#8217;t cause a&amp;nbsp;crash.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 13 Oct 2005 16:23:46 -0700</pubDate><guid>tag:toxicsoftware.com,2005-10-13:sequence_grabber_updated.html</guid></item><item><title>A couple of new uploads to http://toxic-public.googlecode.com/</title><link>http://toxicsoftware.com/a_couple_of_new_uploads_to_svntoxicsoftwarecom.html</link><description>&lt;p&gt;I&amp;#8217;ve just added some code to my public subversion repository. Firstly a bunch of &lt;a href="http://toxicsoftware.com/XCode_Templates.html"&gt;project and file templates&lt;/a&gt; I use with XCode. the CocoaApp Project template turns on a lot of useful compiler options that you should be using these days (including &lt;span class="caps"&gt;GNU&lt;/span&gt; C99 support and new style Objective-C exception). It also adds a build script that produces a bzip2 tarball of the application when built under with a &amp;#8220;Release&amp;#8221; build configuration. The &amp;#8220;Category&amp;#8221;, &amp;#8220;Nibfile&amp;#8221; and &amp;#8220;plist&amp;#8221; file templates also come in very&amp;nbsp;useful.&lt;/p&gt;
&lt;p&gt;The second thing is my &amp;#8220;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;ToxicSQL&lt;/a&gt;&amp;#8221; framework. You guess it - another Objective-C wrapper around sqlite. This one is actually quite mature and has been &lt;span class="caps"&gt;QA&lt;/span&gt;-ed as part of a commercial&amp;nbsp;application.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 12 Oct 2005 20:21:59 -0700</pubDate><guid>tag:toxicsoftware.com,2005-10-12:a_couple_of_new_uploads_to_svntoxicsoftwarecom.html</guid></item><item><title>MediaBrowser Status</title><link>http://toxicsoftware.com/mediabrowser_status.html</link><description>&lt;p&gt;A quick update on the status of the MediaBrowser class I am working on. I&amp;#8217;ve spent a few hours working on it and have some basic functionality working. I&amp;#8217;m using Spotlight to find the media items to display. The user can select types of media via the drop down and each type has a list of predefined Spotlight queries associated with it. The user can then pick a query and the media will be filtered&amp;nbsp;accordingly.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not sure right now if this replicates enough of the iApp Media Browser palette. I plan to associate search directories to each query (so a query could be &amp;#8220;all movies in my movies folder&amp;#8221; or &amp;#8220;all images in my pictures folder created in the last week&amp;#8221;. I would also like to add in the reverse engineered support iPhoto rolls and albums, and am getting help with that from someone who has already done a lot of the work&amp;nbsp;there.&lt;/p&gt;
&lt;p&gt;The media browser doesn&amp;#8217;t load the thumbnails for the media immediately, a background thread is responsible for loading the thumbnails (or loading a movie&amp;#8217;s poster frame) and until the thumbnails are loaded a placeholder image is used instead. This helps keeps the window responsive to the&amp;nbsp;user.&lt;/p&gt;
&lt;p&gt;Screenshot: &lt;a href="/uploads/MediaBrowser002.png"&gt;MediaBrowser002.png&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t finished the public &lt;span class="caps"&gt;API&lt;/span&gt; for the Media Browser class yet. The aim will be to keep it simple (using NSOpenPanel as an example). All of the components in the code are linked together using Cocoa Bindings - the grid view that displays the media has several exposed bindings and with minor effort could be wrapped up in a Interface Builder palette and used in other projects. Queries are defined as simple plists with NSPredicates controlling how the media is filtered. Following is a simple example (plist format highly likely to&amp;nbsp;change):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;&lt;span class="caps"&gt;UTF&lt;/span&gt;-8&amp;quot;?\&amp;gt;\
 \&lt;span class="cp"&gt;&amp;lt;!&lt;span class="caps"&gt;DOCTYPE&lt;/span&gt; plist &lt;span class="caps"&gt;PUBLIC&lt;/span&gt; &amp;quot;-//Apple Computer//&lt;span class="caps"&gt;DTD&lt;/span&gt; &lt;span class="caps"&gt;PLIST&lt;/span&gt; 1.0//&lt;span class="caps"&gt;EN&lt;/span&gt;&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;\&amp;gt;&lt;/span&gt;\
 \&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;\
 \&lt;span class="nt"&gt;&amp;lt;array&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;\
     \&lt;span class="nt"&gt;&amp;lt;dict&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;\
         \&lt;span class="nt"&gt;&amp;lt;key&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;id\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/key\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;movies\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/string\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;key&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;searches\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/key\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;array&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;\
             \&lt;span class="nt"&gt;&amp;lt;dict&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;\
                 \&lt;span class="nt"&gt;&amp;lt;key&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NSPredicate\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/key\&amp;gt;\
                 \&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;kMDItemContentTypeTree == &amp;quot;public.movie&amp;quot; and kMDItemFSCreationDate &lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt; \&lt;span class="p"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;&lt;span class="caps"&gt;YESTERDAY&lt;/span&gt;&lt;/span&gt;\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/string\&amp;gt;\
                 \&lt;span class="nt"&gt;&amp;lt;key&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;title\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/key\&amp;gt;\
                 \&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;All movies Created Since Yesterday\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/string\&amp;gt;\
             \&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/dict\&amp;gt;\
         \&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/array\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;key&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;title\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/key\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Movies\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/string\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;key&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;viewType\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/key\&amp;gt;\
         \&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;grid\&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/string\&amp;gt;\
     \&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/dict\&amp;gt;\
 \&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/array\&amp;gt;\
 \&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/plist\&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There are still some bugs to iron out and features to add but hopefully I can get it ready this week for&amp;nbsp;testing.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 28 Sep 2005 19:02:05 -0700</pubDate><guid>tag:toxicsoftware.com,2005-09-28:mediabrowser_status.html</guid></item><item><title>Here’s your Media Browser right here</title><link>http://toxicsoftware.com/heres_your_media_browser_right_here.html</link><description>&lt;p&gt;Both &lt;a href="http://www.gigliwood.com/weblog/Cocoa/We_need_an_API_for_.html"&gt;Dan Wood&lt;/a&gt; and &lt;a href="http://mikezornek.com/archives/2005/09/23/media_browser_for_the_rest_of_us.php"&gt;Mike Zornek&lt;/a&gt; are missing the point when they claim that Apple needs to provide a publicly accessible &lt;span class="caps"&gt;API&lt;/span&gt; for browsing iApp (iTunes, iPhoto, etc) media files. Apple already provides us with such an &lt;span class="caps"&gt;API&lt;/span&gt;: &lt;a href="http://www.apple.com/macosx/features/spotlight/"&gt;Spotlight&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Creating a media browser window that interfaces with Spotlight is probably an afternoon&amp;#8217;s work (in Cocoa of course). However the browser would be superior to the one Apple uses in its iApps. It would be able to browse for any media on the user&amp;#8217;s machines, not just the media provided by the&amp;nbsp;iApps.&lt;/p&gt;
&lt;p&gt;Perhaps the real problem (and the bug that Dan should post instead of the one he did) is that Apple is limiting their browser to the iApps media instead of using&amp;nbsp;Spotlight.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Of course - this solution would require&amp;nbsp;10.4.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Spurred on by this post&amp;#8217;s comments I&amp;#8217;m putting my money (or rather time) where my mouth is and coding it. When finished I&amp;#8217;ll release it under the &lt;span class="caps"&gt;BSD&lt;/span&gt; license for anyone to use. If anyone wants to lend a hand that might be quite nice. Current screenshot: &lt;a href="/uploads/MediaBrowser001.png"&gt;MediaBrowser001.png&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 23 Sep 2005 21:45:10 -0700</pubDate><guid>tag:toxicsoftware.com,2005-09-23:heres_your_media_browser_right_here.html</guid></item><item><title>Lisp Metadata Importer</title><link>http://toxicsoftware.com/lisp_metadata_importer.html</link><description>&lt;p&gt;John Wiseman at &lt;a href="http://lemonodor.com"&gt;Lemonodor&lt;/a&gt; is working on a &lt;a href="http://lemonodor.com/archives/001221.html"&gt;Lisp Metadata Importer&lt;/a&gt; plugin for Spotlight that processes Lisp source files and extracts the goodness for you to search for in Spotlight. If you&amp;#8217;re a Lisp programmer on Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X then you should check it&amp;nbsp;out.&lt;/p&gt;
&lt;p&gt;See also my &lt;a href="http://toxicsoftware.com/python_metadata_importer_101_released.html"&gt;Python Metadata Importer&lt;/a&gt; and &lt;a href="http://www.arcadianvisions.com"&gt;Arcadian Vision&amp;#8217;s&lt;/a&gt; importer for&amp;nbsp;Ruby.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 10 Sep 2005 01:48:07 -0700</pubDate><guid>tag:toxicsoftware.com,2005-09-10:lisp_metadata_importer.html</guid></item><item><title>iRoster 1.0b12</title><link>http://toxicsoftware.com/iroster_10b12.html</link><description>&lt;p&gt;Another year, another iRoster&amp;nbsp;release.&lt;/p&gt;
&lt;p&gt;You thought development on iRoster was dead. Think again! This version adds more features than ever before and fixes more bugs then you would&amp;nbsp;believe.&lt;/p&gt;
&lt;p&gt;Well - actually it runs on 10.4 now and the preferences all work now I&amp;nbsp;think.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster home&amp;nbsp;page&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 09 Sep 2005 17:20:48 -0700</pubDate><guid>tag:toxicsoftware.com,2005-09-09:iroster_10b12.html</guid></item><item><title>Reminder</title><link>http://toxicsoftware.com/reminder.html</link><description>&lt;p&gt;&lt;a href="http://www.redcross.org"&gt;American Red Cross&lt;/a&gt;
&lt;a href="http://www.hsus.org"&gt;Humane Society of the United&amp;nbsp;States&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 31 Aug 2005 05:54:26 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-31:reminder.html</guid></item><item><title>Sequence Grabber code now has Motion Detection (Followup)</title><link>http://toxicsoftware.com/sequence_grabber_code_now_has_motion_detection_followup.html</link><description>&lt;p&gt;In my previous &lt;a href="http://toxicsoftware.com/sequence_grabber_code_now_has_motion_detection.html"&gt;post&lt;/a&gt; I talk about the (rather pitiful) attempts at adding motion capture to my Sequence Grabber code. This post will document what additions I&amp;#8217;ve made to the code under the&amp;nbsp;covers.&lt;/p&gt;
&lt;p&gt;​1) Added code to write CoreImage images (CIImage objects) to a QuickTime movie (currently hardcoded to mpeg4) using QTKit. Now you execute &lt;a href="http://developer.apple.com/macosx/coreimage.html"&gt;Image Units&lt;/a&gt; against the video frames coming in from the camera and save the output to a movie. Pretty neat. At the moment it isn&amp;#8217;t very efficient because I convert the frames to NSImages as an intermediate step (which I think takes the pixel data out of the &lt;span class="caps"&gt;GPU&lt;/span&gt; video ram and into &lt;span class="caps"&gt;RAM&lt;/span&gt;) - instead I think I can use a CoreVideo surface directly (but QTKit doesn&amp;#8217;t support CoreVideo directly yet - I have more sample that i need to put online that enables QTKit and CoreVideo to work together). I also need to control the Sequence Grabber &lt;span class="caps"&gt;API&lt;/span&gt; a little better and try to prevent it from doing superfluous work (i.e. i need to put it into pure &amp;#8220;preview&amp;#8221;&amp;nbsp;mode).&lt;/p&gt;
&lt;p&gt;1.1) There are a couple of categories on QTMovie (part of QTKit) for conveniently creating movies and appending frames to it (note the timing code in the append frame code is wrong - which is why, if you watched the movie that accompanies the code I look like I&amp;#8217;m dancing around like an idjit) and a category on CIImage for some handy dandy conversions (cropping, scaling, conversion to NSImage - thanks to &lt;a href="http://www.gigliwood.com/weblog/Cocoa/"&gt;Dan Wood&amp;#8217;s code archive&lt;/a&gt; for most of that&amp;nbsp;code).&lt;/p&gt;
&lt;p&gt;​2) Created a couple of specialised Image Units. This is really just an exercise in cikernel (really a subset of &lt;a href="http://www.opengl.org/documentation/oglsl.html"&gt;OpenGL Shading Language&lt;/a&gt; - that link is worth following btw) programming. I&amp;#8217;m actually impressed with how easy it is to write cikernel&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;​3) Actually that last item is a white lie. I didn&amp;#8217;t create any Image Units - what I did do is create a CIFilter subclass that takes the cikernel code as an input parameter attribute and an array of user defineable input parameters that will get passed to the kernel from Cocoa. This allows you easily play around with cikernel code without having to create a separate target in Xcode and then dick around with using CIPlugin to load the Image Unit (why doesn&amp;#8217;t CoreImage load all .plugins from my application plugins directory automatically?). It is pretty cheap and easy way of creating a Core Image filter without any administration work. See CCIGenericFilter.h/,m and CMotionDetector for more&amp;nbsp;details&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 19 Aug 2005 03:29:51 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-19:sequence_grabber_code_now_has_motion_detection_followup.html</guid></item><item><title>Sequence Grabber code now has Motion Detection</title><link>http://toxicsoftware.com/sequence_grabber_code_now_has_motion_detection.html</link><description>&lt;p&gt;I&amp;#8217;ve added basic motion detection capabilities to &lt;a href="http://toxicsoftware.com/sequence_grabber_code_now_with_coregoodness.html"&gt;Cocoa Sequence Grabber&lt;/a&gt; code&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;This is what happens when your cat wakes you up too darn early after peeing under the computer&amp;nbsp;desk.&lt;/p&gt;
&lt;p&gt;Sample movie (&lt;span class="caps"&gt;MP4&lt;/span&gt;/QuickTime 7 required, &lt;span class="caps"&gt;64KB&lt;/span&gt; file): &lt;a href="/uploads/MotionDetection.mp4"&gt;MotionDetection.mp4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No those aren&amp;#8217;t mpeg encoding artefacts, those are my attempts to highlight the motion in the&amp;nbsp;movie.&lt;/p&gt;
&lt;p&gt;Source code: [http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Samples/SequenceGrabber][] (see MotionDetector&amp;nbsp;subdirectory)&lt;/p&gt;
&lt;p&gt;Have&amp;nbsp;fun.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/MotionDetector.jpg" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 18 Aug 2005 14:29:59 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-18:sequence_grabber_code_now_has_motion_detection.html</guid></item><item><title>PettySVG</title><link>http://toxicsoftware.com/pettysvg.html</link><description>&lt;p&gt;PettySVG is an incredibly basic &lt;span class="caps"&gt;SVG&lt;/span&gt; renderer for Cocoa. It renders an absolutely microscopic subset of the full &lt;a href="http://www.w3.org/TR/SVG/"&gt;&lt;span class="caps"&gt;SVG&lt;/span&gt; specification&lt;/a&gt;. It doesn&amp;#8217;t even compare with a professional quality &lt;span class="caps"&gt;SVG&lt;/span&gt; renderer such as the new &lt;a href="http://svg.kde.org"&gt;ksvg&lt;/a&gt; support being &lt;a href="http://webkit.opendarwin.org/projects/svg/"&gt;added&lt;/a&gt; to&amp;nbsp;WebKit.&lt;/p&gt;
&lt;p&gt;PettySVG only supports the basic drawing primitives. Path support is currently semi-complete (and semi-broken). It does not support any &lt;span class="caps"&gt;SVG&lt;/span&gt; special effects or animations. In fact PettySVG only supports a couple of &lt;span class="caps"&gt;CSS&lt;/span&gt; styles and does not work with &lt;span class="caps"&gt;CSS&lt;/span&gt; inheritance at all. It also isn&amp;#8217;t fast (I am working on a couple of optimisation ideas&amp;nbsp;though).&lt;/p&gt;
&lt;p&gt;I wrote PettySVG to render small, simplistic vector icons into an application that uses Quartz/CoreGraphics for drawing. I could have used &lt;span class="caps"&gt;PDF&lt;/span&gt; but because &lt;span class="caps"&gt;SVG&lt;/span&gt; is &lt;span class="caps"&gt;XML&lt;/span&gt; I can transform it using &lt;span class="caps"&gt;XSLT&lt;/span&gt;. PettySVG solves the problems I initially wrote it to solve. It is still a work in progress. I am releasing the code (such as it is) under the &lt;span class="caps"&gt;BSD&lt;/span&gt;&amp;nbsp;license.&lt;/p&gt;
&lt;p&gt;Source code:&amp;nbsp;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Misc/PettySVG&lt;/p&gt;
&lt;p&gt;Sample application: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;PettySVG.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Example&amp;nbsp;screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/testsvg.png" /&gt; (Based on &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;test.svg&lt;/a&gt;)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 18 Aug 2005 00:51:36 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-18:pettysvg.html</guid></item><item><title>Bonjour/Zeroconf Service Scrapper</title><link>http://toxicsoftware.com/bonjour_zeroconf_service_scrapper.html</link><description>&lt;p&gt;This Python 2.3 (probably works on earlier versions too) scraps the list of registered &lt;a href="http://www.apple.com/macosx/features/bonjour/"&gt;ZeroConf&lt;/a&gt;/&lt;a href="http://www.apple.com/macosx/features/bonjour/"&gt;Bonjour&lt;/a&gt; services found at http://www.dns-sd.org/ServiceTypes.html and outputs (on stdout) the format in a more easily machine readible &lt;span class="caps"&gt;XML&lt;/span&gt;&amp;nbsp;format.&lt;/p&gt;
&lt;p&gt;This is used by &lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster&lt;/a&gt; to pre-populate the user&amp;#8217;s preferences with a set of&amp;nbsp;services.&lt;/p&gt;
&lt;p&gt;Source:&amp;nbsp;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/ZeroConfServiceTypeScrapper&lt;/p&gt;
&lt;p&gt;Sample &lt;span class="caps"&gt;XML&lt;/span&gt; output here: http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/ZeroConfServiceTypeScrapper/services.xml (sample contains full scrap of services as of&amp;nbsp;20050817)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 18 Aug 2005 00:43:04 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-18:bonjour_zeroconf_service_scrapper.html</guid></item><item><title>Sequence Grabber Code - Four Times the Fun!</title><link>http://toxicsoftware.com/sequence_grabber_code_four_times_the_fun.html</link><description>&lt;p&gt;Just for fun I added four seperate preview panes for my &lt;a href="http://toxicsoftware.com/sequence_grabber_code_now_with_coregoodness.html"&gt;Sequence Grabber code&lt;/a&gt; - each pane has its own CoreImage filter attached. All previews can be flipped horizontally as well (I just apply an affine transformation to the image before handing it off to the four preview filters). I also fixed a couple of little bugs. I am not updating the demo archive so to see the changes you&amp;#8217;ll need to download and compile the&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;Screenshot: &lt;a href="/uploads/QuadScreenshot.png"&gt;QuadScreenshot.png&lt;/a&gt; (rather large - but note the &lt;span class="caps"&gt;CPU&lt;/span&gt; bar in the dock.. Even with all three filters running it was barely denting the&amp;nbsp;&lt;span class="caps"&gt;CPU&lt;/span&gt;).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 10 Aug 2005 00:50:59 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-10:sequence_grabber_code_four_times_the_fun.html</guid></item><item><title>Website In Flux</title><link>http://toxicsoftware.com/website_in_flux.html</link><description>&lt;p&gt;It&amp;#8217;s pretty hard to navigate within the toxicsoftware.com site right now. I&amp;#8217;ll be fixing that just as soon as I get &lt;a href="http://www.myrtlewoodgallery.com/tuitround.jpg"&gt;around to it&lt;/a&gt;&amp;#8230; Yeah&amp;nbsp;yeah.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 09 Aug 2005 05:02:36 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-09:website_in_flux.html</guid></item><item><title>Sequence Grabber Code - now with CoreGoodness</title><link>http://toxicsoftware.com/sequence_grabber_code_now_with_coregoodness.html</link><description>&lt;p&gt;I&amp;#8217;ve improved my Cocoa &lt;a href="http://toxicsoftware.com/sequence_grabber_cocoa_source_code.html"&gt;Sequence Grabber&lt;/a&gt; code (read: iSight code). I&amp;#8217;ve added a couple of extra classes to represent audio and video channels. Gone are the dependencies on my MoreFile framework and some of my other Cocoa/Carbon utility classes (making the project more lightweight). I&amp;#8217;ve improved the code all round - but the key addition is the ability to receive frames from the sequence grabber as CoreImage images. This means you can perform extra processing on the frames including applying CoreImage&amp;nbsp;filters&amp;#8230;&lt;/p&gt;
&lt;p&gt;See screenshot:&amp;nbsp;[SequenceGrabber_1.png][].&lt;/p&gt;
&lt;p&gt;Note that QuickTime movie saved to disk is not passed through CoreImage. Frames from the SequenceGrabber are exposed to client code through standard Cocoa delegate methods (well one method) so you can do whatever you want with the images (including add them to a QTKit&amp;nbsp;movie).&lt;/p&gt;
&lt;p&gt;The code is still in a work in progress but it is pretty functional right now. My aim is to keep it all quite simple (unlike some of the Apple sample code parts of it was based on) and usable when just dropped into a 3rd party project. Source code: [http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/][]&amp;nbsp;links.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 09 Aug 2005 01:47:10 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-09:sequence_grabber_code_now_with_coregoodness.html</guid></item><item><title>FileVault Corruption</title><link>http://toxicsoftware.com/filevault_corruption.html</link><description>&lt;p&gt;Sometime in the last couple of days (possibly the last week) the sparse image that &lt;a href="http://www.apple.com/macosx/features/filevault/"&gt;FileVault&lt;/a&gt; stores my home directory within got corrupt. I noticed it yesterday when checking out Objective C files from subversion that ended up containing fragments of &lt;span class="caps"&gt;XML&lt;/span&gt; instead of the Objective-C source code they should have&amp;nbsp;contained.&lt;/p&gt;
&lt;p&gt;It turned out the &lt;span class="caps"&gt;XML&lt;/span&gt; was fragments of the &lt;a href="http://ranchero.com/netnewswire/"&gt;NetNewsWire&lt;/a&gt; subscription plist (which NetNewsWire seems to save to disk pretty regularly). Something was definitely up. I logged out and booted up from my Tiger install &lt;span class="caps"&gt;DVD&lt;/span&gt; and performed a disk check using Disk Utility. The FileVault image was damaged (beyond repair) and the volume it was kept on (not my System volume) was damaged&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;I couldn&amp;#8217;t repair the sparse image without repair the volume it resided on and paradoxically could not repair the volume without first repairing the&amp;nbsp;image!&lt;/p&gt;
&lt;p&gt;My last backup about two days ago had failed too - I thought rsync was just being flakey on 10.4 (it was core dumping) and stupidly didn&amp;#8217;t pay it much mind. If I perhaps had taken the time to investigate then I might have realised something was up. Because my backup was incomplete I had no choice but to try and repair the disk image. I copied it to an external firewire drive (&lt;a href="http://www.lacie.com"&gt;Lacie&lt;/a&gt; Pocketdrive) and deleted the original. That allowed Disk Utility to repair the volume but I couldn&amp;#8217;t repair the sparse image without corrupting it (I only tried to repair the sparse image after copying it back to the original&amp;nbsp;volume).&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t have enough room to turn off FileVault so in the end I logged in as a different user (without FileVault), created my own sparse image and copied the contents of the corrupted FileVault sparse image to my new&amp;nbsp;image.&lt;/p&gt;
&lt;p&gt;I then used NetInfoManager and the terminal to try and manually disable FileVault. I then copied the contents of my backup image into the home&amp;nbsp;directory.&lt;/p&gt;
&lt;p&gt;Because I used the Finder (as a different user) to perform the copy (I wanted to make sure resource forks were copied and although cp under 10.4 should work fine with the extended attributes I didn&amp;#8217;t want to take the risk) I had to manually recursively reset the file ownerships and then copy the dot prefixed hidden file at the root of my user&amp;nbsp;directory.&lt;/p&gt;
&lt;p&gt;I now seem to have a working user directory again. I have lost (but used .Mac syncing to get a copy of) my Mail.app preferences. I have also lost my &lt;span class="caps"&gt;TODO&lt;/span&gt; list (kept in OmniOutliner) which ended up containing a fragment of a NetNewsWire subscriptions list. Luckily I kept that in subversion and have only lost a little bit of content. I decided to trash the subversion working directories just in case, but everything was safely checked into the repository and I don&amp;#8217;t think I have lost&amp;nbsp;anything.&lt;/p&gt;
&lt;p&gt;Everything outside of my FileVault sparse image is also fine (I keep \~/Music, \~/Movies, \~/Pictures and my source code/Xcode intermediate directories outside of FileVault with just symbolic links in their&amp;nbsp;places).&lt;/p&gt;
&lt;p&gt;Conclusion:&lt;/p&gt;
&lt;p&gt;​1) Always investigate a backup failure immediately. 2) Rethink FileVault. I&amp;#8217;ve been using FileVault for almost a year with no problems. By moving large/often accessed files outside of FileVault I thought I was managing to get the best of both worlds. I am not sure now whether I am going to re-enable FileVault or not. Right now I&amp;#8217;m coming down on the side of not re-enabling it (let&amp;#8217;s see if I notice a performance boost in the next few days). 3) Implement a better backup strategy so that if the worst happens I can go back if I have&amp;nbsp;to.&lt;/p&gt;
&lt;p&gt;Things that saved my butt: 1) Keeping my home directory on a different partition to my System volume. 2) Having an admin user account ready to use for maintenance tasks. 3) My Lacie Pocketdrive. 3.5) Target Disk Mode (didn&amp;#8217;t use it actually, but I easily could have) 4) A copy of the Tiger Install &lt;span class="caps"&gt;DVD&lt;/span&gt; (and the ease in which you can use the Install &lt;span class="caps"&gt;DVD&lt;/span&gt; to repair/investigate a volume). 5) .Mac sync - without this I would have lost my Mail configurations. Not the end of the world but a pain in the butt. 6) Keeping my important documents in subversion. 7) The ability to disable FileVault on a user account by using NetInfo Manager (and by manually copying data from the Sparse Image into the user directory). 8) Disk Utility. Although the disk repair function isn&amp;#8217;t as great as (say) &lt;a href="http://www.alsoft.com/DiskWarrior/"&gt;DiskWarrior&lt;/a&gt; the ability to create disk images and use the disk restore function between real volumes and disk images is&amp;nbsp;fantastic.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 07 Aug 2005 16:35:26 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-07:filevault_corruption.html</guid></item><item><title>Mail.app hangs - problem and solution?</title><link>http://toxicsoftware.com/mailapp_hangs_problem_and_solution.html</link><description>&lt;p&gt;Apple Mail in Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4.2 is hanging whenever I create a new e-mail or respond to an e-mail. It hangs for about 1 or 2 minutes at a&amp;nbsp;time.&lt;/p&gt;
&lt;p&gt;After some poking around using &lt;a href="http://developer.apple.com/documentation/Performance/Conceptual/PerformanceOverview/InitialEvaluation/chapter_5_section_4.html"&gt;Spin Control&lt;/a&gt; and &lt;a href="http://developer.apple.com/documentation/Performance/index.html"&gt;Shark&lt;/a&gt; to find out what&amp;#8217;s going on it looks like this backtrace points to the&amp;nbsp;problem:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;5615 &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MessageKeychainManager&lt;/span&gt; &lt;span class="n"&gt;canSignMessagesFromAddress&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
5615 &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MessageKeychainManager&lt;/span&gt; &lt;span class="n"&gt;copyTrustedCertificateForAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
  5615 &lt;span class="n"&gt;SecKeychainSearchCopyNext&lt;/span&gt;
    5615 &lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;KeychainCore&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;KCCursorImpl&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;KeychainCore&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;
              5615 &lt;span class="n"&gt;DotMacRelation&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MakeQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cssm_query&lt;/span&gt; &lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                5615 &lt;span class="n"&gt;DotMacQuery&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DotMacQuery&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;unified&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;DotMacRelation&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cssm_query&lt;/span&gt; &lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  5615 &lt;span class="n"&gt;DotMacQuery&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ReadCertificatesFromURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__CFURL&lt;/span&gt; &lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    5615 &lt;span class="n"&gt;DotMacQuery&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ReadStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__CFURL&lt;/span&gt; &lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;long&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Every time I create a new email it does a query against a dot mac server! Attaching gdb to Mail.app and breaking on &amp;#8220;DotMacQuery::ReadCertificatesFromURL(__CFURL const*)&amp;#8221; gives me a chance to see what &lt;span class="caps"&gt;URL&lt;/span&gt; is being queried (I used gdb&amp;#8217;s printout command to view the &lt;span class="caps"&gt;CFURL&lt;/span&gt; parameter: &amp;#8220;po \$r4&amp;#8221;):&amp;nbsp;&amp;#8220;http://certinfo.mac.com/lookup?jwight&amp;#8221;&lt;/p&gt;
&lt;p&gt;The host at &lt;a href="http://certinfo.mac.com"&gt;certinfo.mac.com&lt;/a&gt; (17.250.248.148) seems to be dead and Mail.app is blocking waiting for a&amp;nbsp;timeout.&lt;/p&gt;
&lt;p&gt;So this bug should be effecting all Apple Mail users with a .mac account (and I&amp;#8217;m guessing .mac configured and enabled in their System Preferences). One quick solution would be to use &lt;a href="http://obdev.at/index.html"&gt;Little Snitch&lt;/a&gt; to prevent Mail.app from accessing the certinfo.mac.com&amp;nbsp;server.&lt;/p&gt;
&lt;p&gt;I &lt;a href="http://discussions.info.apple.com/webx?14@981.kTO7aLWR2hC.0@.68b5d5fa"&gt;found confirmation&lt;/a&gt; on Apple&amp;#8217;s support discussion website. It is effecting other people. The solution (work around) seems simple enough, delete the &amp;#8220;\~/Library/Preferences/com.apple.security.plist&amp;#8221; preferences&amp;nbsp;file.&lt;/p&gt;
&lt;p&gt;Another more complete Apple discussion thread &lt;a href="http://discussions.info.apple.com/webx?128@229.pfeYazjtZPV.1@.68b5d2e4"&gt;here&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 03 Aug 2005 16:35:29 -0700</pubDate><guid>tag:toxicsoftware.com,2005-08-03:mailapp_hangs_problem_and_solution.html</guid></item><item><title>KeychainCache in http://toxic-public.googlecode.com/</title><link>http://toxicsoftware.com/keychaincache_in_svntoxicsoftwarecom.html</link><description>&lt;p&gt;I&amp;#8217;ve uploaded the code to KeychainCache to my &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;public subversion server&lt;/a&gt;. KeychainCache is a &lt;span class="caps"&gt;APE&lt;/span&gt; Haxie for (guess what?) caching keychain credentials. More information &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;here&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 23 Jul 2005 10:01:44 -0700</pubDate><guid>tag:toxicsoftware.com,2005-07-23:keychaincache_in_svntoxicsoftwarecom.html</guid></item><item><title>Back at the Keyboard</title><link>http://toxicsoftware.com/back_at_the_keyboard.html</link><description>&lt;p&gt;I&amp;#8217;m back at the keyboard again after a two week absence. In those two week&amp;#8217;s I&amp;#8217;ve moved home from the outskirts of Philadelphia back to upstate South Carolina. I plan to split my time between a little Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X consulting and working on my own projects. More on the latter&amp;nbsp;later.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 21 Jul 2005 22:43:19 -0700</pubDate><guid>tag:toxicsoftware.com,2005-07-21:back_at_the_keyboard.html</guid></item><item><title>Apache2 on Tiger still borked</title><link>http://toxicsoftware.com/apache2_on_tiger_still_borked.html</link><description>&lt;p&gt;With the release of &lt;a href="http://docs.info.apple.com/article.html?artnum=301695"&gt;Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4.2 Server&lt;/a&gt; I was hoping the problem I&amp;#8217;ve been seeing with Apache2 trying to serve files greater than &lt;span class="caps"&gt;64KB&lt;/span&gt; in length had been&amp;nbsp;fixed.&lt;/p&gt;
&lt;p&gt;Of course I&amp;#8217;m not the only one coming up across this problem, search for &amp;#8220;apache2&amp;#8221; in &lt;a href="http://www.macintouch.com/tiger19.html"&gt;http://www.macintouch.com/tiger19.html&lt;/a&gt; and &lt;a href="http://www.macintouch.com/tiger20.html"&gt;http://www.macintouch.com/tiger20.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://issues.apache.org/bugzilla/show_bug.cgi?id=34332"&gt;bug&lt;/a&gt; has been analysed by Apache and Apple engineers and a fix exists. However the fix has not made it into Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4.2. Apache2 on DarwinPorts hasn&amp;#8217;t been patched to include the&amp;nbsp;fix.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve filed a bug with Apple previously (radar:4110355) but it was marked as duplicate. This doesn&amp;#8217;t help me in the slightest, because I can&amp;#8217;t (as a mortal user of &lt;a href="http://bugreporter.apple.com"&gt;http://bugreporter.apple.com&lt;/a&gt;) cannot see the bug it is marked a duplicate&amp;nbsp;of.&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;could&lt;/em&gt; take the time to take the patch and bundle it up for &lt;a href="http://darwinports.org"&gt;darwinports&lt;/a&gt; but to be frank life is too short. The work around for the problem that I use suffices for now (I use +ssh to access my subversion repostories instead of using http and apache2 with&amp;nbsp;mod_dav_).&lt;/p&gt;
&lt;p&gt;This isn&amp;#8217;t just some random piece of 3rd party Open Source software not working with Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4 - this is Apache2 - which &lt;strong&gt;ships&lt;/strong&gt; with Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X Server. For the bug to still exist after 2 revisions of 10.4 server is in my opinion quite&amp;nbsp;bad.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Bug and patches described in detail here - &lt;a href="http://golem.ph.utexas.edu/%7Edistler/blog/archives/000568.html"&gt;http://golem.ph.utexas.edu/%7Edistler/blog/archives/000568.html&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Probably the easiest way to get Apache2 from darwinports working is to&amp;nbsp;use:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="n"&gt;ac_cv_func_poll&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Before installing apache2 (or subversion with&amp;nbsp;+mod_dav_)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 13 Jul 2005 18:30:58 -0700</pubDate><guid>tag:toxicsoftware.com,2005-07-13:apache2_on_tiger_still_borked.html</guid></item><item><title>Upgraded to ExpressionEngine 1.3</title><link>http://toxicsoftware.com/upgraded_to_expressionengine_13.html</link><description>&lt;p&gt;I&amp;#8217;ve upgraded to &lt;a href="http://www.pmachine.com"&gt;ExpressionEngine 1.3&lt;/a&gt;. Painless upgrade so far. Capchas in comments don&amp;#8217;t work (but that might be because of my server relocation last week). I&amp;#8217;ve disabled capchas and enabled comment moderation (I rarely get comments anyway - linkings on &lt;a href="http://del.icio.us"&gt;del.icio.us/&lt;/a&gt; are more common). The new posting page crashes OmniWeb when you flip from tab to tab. Oops. And the category selection list is on another tab (talk about bad &lt;span class="caps"&gt;UI&lt;/span&gt; design). On the positive side hopefully the new 1.3 &lt;span class="caps"&gt;API&lt;/span&gt; will allow me to update the rest of my site - time to read the&amp;nbsp;docs.&lt;/p&gt;
&lt;p&gt;No one cares about any of that but I have to post &lt;span class="caps"&gt;SOMETHING&lt;/span&gt; to to make sure my blog still&amp;nbsp;works.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 06 Jul 2005 17:26:24 -0700</pubDate><guid>tag:toxicsoftware.com,2005-07-06:upgraded_to_expressionengine_13.html</guid></item><item><title>Archives for http://toxic-public.googlecode.com/</title><link>http://toxicsoftware.com/archives_for_svntoxicsoftwarecom.html</link><description>&lt;p&gt;If you don&amp;#8217;t have or use subversion then downloading an entire project hosted on &lt;a href="http://toxicsoftware.com"&gt;http://toxicsoftware.com/&lt;/a&gt; can be a little bit annoying. You can browse the individual files but you can&amp;#8217;t download archives of&amp;nbsp;projects.&lt;/p&gt;
&lt;p&gt;Well I am fixing that. Archives will now be available&amp;nbsp;from:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com//archives/&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 30 Jun 2005 22:17:33 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-30:archives_for_svntoxicsoftwarecom.html</guid></item><item><title>CompositeImageTest (Part 2) - COffscreenHTMLRenderer</title><link>http://toxicsoftware.com/compositeimagetest_part_2_coffscreenhtmlrenderer.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;COffscreenHTMLRenderer&lt;/a&gt; is a class with a simple &lt;span class="caps"&gt;API&lt;/span&gt; that uses WebKit to produce NSImages (or WebArchive objects) from &lt;span class="caps"&gt;HTML&lt;/span&gt; (either via a &lt;span class="caps"&gt;NSURL&lt;/span&gt; or a WebArchive). As I mentioned the &lt;span class="caps"&gt;API&lt;/span&gt; is very&amp;nbsp;simple: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;COffscreenHTMLRenderer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theRenderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[[&lt;/span&gt;&lt;span class="n"&gt;COffscreenHTMLRenderer&lt;/span&gt; &lt;span class="n"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nl"&gt;initWithURL:&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&lt;span class="caps"&gt;NSURL&lt;/span&gt;&lt;/span&gt; &lt;span class="nl"&gt;URLWithString:&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;&amp;lt;someurl&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="n"&gt;autorelease&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;NSImage&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theRenderer&lt;/span&gt; &lt;span class="n"&gt;renderedImage&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Note that sending the renderer the renderedImage message will cause the program to block until the &lt;span class="caps"&gt;HTML&lt;/span&gt; is full downloaded. This keeps the &lt;span class="caps"&gt;API&lt;/span&gt; simple but can cause a bad user experience. The renderer can also take a WebArchive object as the &lt;span class="caps"&gt;HTML&lt;/span&gt; source. This could allow you to produce thumbnails of .webarchive files. As well as taking an WebArchive object as input the renderer can also render &lt;span class="caps"&gt;HTML&lt;/span&gt; into a WebArchive. This provides an easy way to create .webarchive files (obviously converting a WebArchive into a WebArchive may not be so useful). An interesting project would be a command line tool that downloads an webpage from a &lt;span class="caps"&gt;URL&lt;/span&gt; passed in as an argument and saves the content as a .webarchive&amp;nbsp;file.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 30 Jun 2005 21:40:16 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-30:compositeimagetest_part_2_coffscreenhtmlrenderer.html</guid></item><item><title>CompositeImageTest (Part 1)</title><link>http://toxicsoftware.com/compositeimagetest.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;CompositeImageTest&lt;/a&gt; started off as a simple project that renders an NSString and a background NSImage into a destination NSImage. I kind of got carried away with and away from the whole composite image thing and project produced a handful of use Cocoa&amp;nbsp;classes.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start with&amp;nbsp;screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img alt="CompositeImageTest Screenshot" src="http://toxicsoftware.com/sourcecode.html" /&gt;&lt;/p&gt;
&lt;p&gt;This shows two images and a string being composited together to produce a third NSImage. The image is being displayed in an (editable NSImageView) and can be copied and pasted into other applications (e.g. Preview). As far as the application is concerned the composite image is just an NSImage and can be used in any way the NSImage can be used (button/menu icons etc). The parameters of the image are a simple plist based &lt;span class="caps"&gt;XML&lt;/span&gt; file. The example file used to produce the image above is here: [http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Misc/CompositeImageTest/Resources/Test1.tx-composite-image][] (you will probably need to &amp;#8220;Save As&amp;#8221; this &lt;span class="caps"&gt;XML&lt;/span&gt;&amp;nbsp;file).&lt;/p&gt;
&lt;p&gt;Here is a second&amp;nbsp;screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img alt="CompositeImage Test - Second Screenshot" src="http://toxicsoftware.com/sourcecode.html" /&gt;&lt;/p&gt;
&lt;p&gt;This shows a simple &lt;span class="caps"&gt;HTML&lt;/span&gt; page being rendered into the same NSImageView. Again the &lt;span class="caps"&gt;HTML&lt;/span&gt; is being rendered into an NSImage (via a custom NSImageRep subclass) and can be copied and pasted just like an&amp;nbsp;image.&lt;/p&gt;
&lt;p&gt;The subversion repository for CompositeImageTest is [http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Misc/CompositeImageTest/][]. Most classes are headerdoc-ed (albeit lightly) and I&amp;#8217;ll be describing some of the more interesting classes in the next few&amp;nbsp;postings.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 30 Jun 2005 21:17:54 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-30:compositeimagetest.html</guid></item><item><title>TXTableView</title><link>http://toxicsoftware.com/txtableview.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;TXTableView&lt;/a&gt; is a subclass of NSTableView that allows the user to show or hide table columns by any of three&amp;nbsp;methods:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Control clicking (context clicking) the table header and picking columns from the contextual&amp;nbsp;menu.&lt;/li&gt;
&lt;li&gt;Clicking the top right corner widget. Again this pops up the column contextual&amp;nbsp;menu.&lt;/li&gt;
&lt;li&gt;Through a separate table inspector &lt;span class="caps"&gt;GUI&lt;/span&gt; (probably just a list of&amp;nbsp;check-boxes).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks to the members of the &lt;a href="http://groups.yahoo.com/group/mac-gui-dev/"&gt;Mac &lt;span class="caps"&gt;GUI&lt;/span&gt; Dev&lt;/a&gt; mailing list for&amp;nbsp;suggestions.&lt;/p&gt;
&lt;p&gt;Screenshot: &lt;img alt="TXTableView Screenshot" src="http://toxicsoftware.com/sourcecode.html" /&gt;&lt;/p&gt;
&lt;p&gt;(Update: Removed https scheme from the source&amp;nbsp;&lt;span class="caps"&gt;URL&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;(Update 2: A bzip2 archive of the current snapshot of the source code is available here: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com//archives/TXTableView.tar.bz2&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;(Update 3: I failed to specify what license this code is under. Well feel free to do whatever you want with it - it is released under the public&amp;nbsp;domain.)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 30 Jun 2005 19:55:16 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-30:txtableview.html</guid></item><item><title>Spotlight doesn’t index empty files</title><link>http://toxicsoftware.com/spotlight_doesnt_index_empty_files.html</link><description>&lt;p&gt;Well it&amp;#8217;s kind of obvious. But Spotlight can&amp;#8217;t or won&amp;#8217;t hand a file with a zero byte resource fork to a custom Spotlight&amp;nbsp;importer.&lt;/p&gt;
&lt;p&gt;I need to investigate if it is smart enough to consider a resource fork (or the 10.4 xattr metadata), I&amp;#8217;ll post more on that&amp;nbsp;later.&lt;/p&gt;
&lt;p&gt;I found this because I was testing an importer I&amp;#8217;ve written by &amp;#8220;touching&amp;#8221; a test a file and wondering why the heck my importer wasn&amp;#8217;t being&amp;nbsp;triggered.&lt;/p&gt;
&lt;p&gt;However mdls &lt;strong&gt;will&lt;/strong&gt; display the file system &amp;#8220;virtual&amp;#8221; metadata for a&amp;nbsp;file.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 14 Jun 2005 23:27:42 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-14:spotlight_doesnt_index_empty_files.html</guid></item><item><title>Ruby Spotlight Importer</title><link>http://toxicsoftware.com/ruby_spotlight_importer.html</link><description>&lt;p&gt;On the Apple&amp;#8217;s spotlight page I noticed &lt;a href="http://www.arcadianvisions.com/index.html"&gt;Arcadian Visions&lt;/a&gt; have released a &lt;a href="http://www.apple.com/downloads/macosx/spotlight/rubyimporter.html"&gt;Ruby importer&lt;/a&gt; for Spotlight that imports extra metadata including class and function/method names (just like my &lt;a href="http://toxicsoftware.com/python_metadata_importer_101_released.html"&gt;Python Metadata Importer&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t touched Ruby yet but I plan to soon - just to see what the fuss is all about. And when I do I&amp;#8217;ll be sure to install this&amp;nbsp;importer.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 14 Jun 2005 20:40:43 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-14:ruby_spotlight_importer.html</guid></item><item><title>Xcode 2.1 problems with pre-processing Info.plist files…</title><link>http://toxicsoftware.com/xcode_21_problems_with_pre_processing_infoplist_files.html</link><description>&lt;p&gt;I&amp;#8217;ve just come across another rather serious problem in Xcode 2.1. The option for &amp;#8220;Preprocess Info.plist File&amp;#8221; allows you to use variable substitution in your Info.plist files (and hopefully your InfoPlist.strings files too although I&amp;#8217;ve not checked that yet). It&amp;#8217;s handy because you can do stuff&amp;nbsp;like:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;CFBundleExecutable&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;$(PRODUCT_NAME)&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;However I turned on the feature for my Spotlight importer projects and found it was breaking my Info.plist files. The problem is that the pre-processor treats the // in URLs as a C++ style comments and strips out the remainder of the&amp;nbsp;line:&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s my notes on how to reproduce (from the bug I file at &lt;a href="http://bugreporter.apple.com"&gt;http://bugreporter.apple.com/&lt;/a&gt;, bug&amp;nbsp;#4147706)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create a package based project in Xcode 2.1 (e.g. a Cocoa&amp;nbsp;bundle).&lt;/p&gt;
&lt;p&gt;Modify the Info.plist to include a&amp;nbsp;&lt;span class="caps"&gt;URL&lt;/span&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;&lt;span class="caps"&gt;URL&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;http://www.apple.com/&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the target settings turn &lt;span class="caps"&gt;ON&lt;/span&gt; the option for &amp;#8220;Preprocess Info.plist File&amp;#8221;. Build the project. Open up the output file&amp;#8217;s package and inspect the Info.plist in a text editor, the &lt;span class="caps"&gt;URL&lt;/span&gt; will now look like&amp;nbsp;this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;&lt;span class="caps"&gt;URL&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;http:
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The // in the &lt;span class="caps"&gt;URL&lt;/span&gt; is being treated as a C++ style comment and the remainder of the line is being&amp;nbsp;stripped.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Update: Turns out there is an easy solution. You can use pass through arguments to the C pre-processor to disable comment discarding. Configure your target like&amp;nbsp;so:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;INFOPLIST_PREPROCESS&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;&lt;span class="caps"&gt;YES&lt;/span&gt;&lt;/span&gt;
&lt;span class="n"&gt;INFOPLIST_OTHER_PREPROCESSOR_FLAGS&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;From the cpp(1) man&amp;nbsp;page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-C Do not discard comments. All comments are passed through to the output file, except for comments in processed directives, which are deleted along with the&amp;nbsp;directive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is also a -&lt;span class="caps"&gt;CC&lt;/span&gt; option that does the right thing for macro expansion. Check out the man&amp;nbsp;page.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 14 Jun 2005 18:08:00 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-14:xcode_21_problems_with_pre_processing_infoplist_files.html</guid></item><item><title>WWDC 2005 Thoughts</title><link>http://toxicsoftware.com/wwdc_2005_thoughts.html</link><description>&lt;p&gt;This is my last day at &lt;a href="http://developer.apple.com/wwdc/"&gt;&lt;span class="caps"&gt;WWDC&lt;/span&gt;&lt;/a&gt;, I&amp;#8217;ll be away from the conference tomorrow for a little drive. The conference has been an odd one. The keynote was incredibly short (just one hour) but of course how could you top the Intel announcement with anything. I am quite surprised about the reaction of the attendees concerning the Intel switch. Most people seem very upbeat about it. Which is a good sign - because the move could easily have alienated the&amp;nbsp;developers.&lt;/p&gt;
&lt;p&gt;The new attendees intranet with the schedule planner is definitely a step in the right direction. Of course it isn&amp;#8217;t quite perfect&amp;nbsp;yet.&lt;/p&gt;
&lt;p&gt;The sessions have mostly been a repeat of last year with a few oddball sessions thrown in. There is a definitely a bigger focus on enterprise and &lt;span class="caps"&gt;IT&lt;/span&gt; - something I saw happening last year too. From a personal perspective I&amp;#8217;m not keen on this change of focus - but it is understandable. The new hands-on sessions seem to be pretty good but it is not always worth going to the normal sessions and hands-on sessions for the same subject - there is a lot of duplication of&amp;nbsp;information.&lt;/p&gt;
&lt;p&gt;For me this has probably been the most social &lt;span class="caps"&gt;WWDC&lt;/span&gt; to date. I&amp;#8217;ve met a lot of new and interesting people and lot of the famous &amp;#8220;names&amp;#8221; from the Mac blogging and development communities. The Mac bloggers dinner on Monday night was fantastic and &lt;a href="http://weblog.scifihifi.com"&gt;Buzz&lt;/a&gt; did a wonderful job organising it - when I come back next year I hope he arranges its&amp;nbsp;sequel.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 09 Jun 2005 18:33:58 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-09:wwdc_2005_thoughts.html</guid></item><item><title>Stump the Experts</title><link>http://toxicsoftware.com/stump_the_experts.html</link><description>&lt;p&gt;I won my first prize at &lt;a href="http://developer.apple.com/wwdc/"&gt;&lt;span class="caps"&gt;WWDC&lt;/span&gt;&lt;/a&gt;&amp;#8216;s stump the experts. In fact I won two points for the audience and double prizes for knowing &amp;#8220;when to shut up after giving a right&amp;nbsp;answer&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Of course, in a classic example of &amp;#8220;it&amp;#8217;s not what you know but who you know&amp;#8221; I have to give the credit for embedded genius &lt;a href="http://www.manyetas.com/creed/"&gt;Chris Reed&lt;/a&gt; for providing the answer to the question and for dealing with a mad guy on the phone yelling &amp;#8220;Chris it&amp;#8217;s Jon, how many bits does the iPod shuffle processor have?&amp;#8221; completely out of the blue. 1/2 the prizes go to&amp;nbsp;Chris.&lt;/p&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;p&gt;Oh and I turned the World of Warcraft 1 year subscription &lt;span class="caps"&gt;DOWN&lt;/span&gt;! Take me outside and shoot me&amp;nbsp;now&amp;#8230;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 09 Jun 2005 09:03:21 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-09:stump_the_experts.html</guid></item><item><title>Toxic Graveyard</title><link>http://toxicsoftware.com/toxic_graveyard.html</link><description>&lt;p&gt;On my &lt;a href="http://toxicsoftware.com/sourcecode.html" title="public subversion repository"&gt;public subversion repository&lt;/a&gt; hosted on &lt;a href="http://code-host.com" title="http://code-host.com/"&gt;http://code-host.com/&lt;/a&gt; I&amp;#8217;ve created a &amp;#8220;Graveyard&amp;#8221; directory for code that I&amp;#8217;ve written but no longer plan on supporting. I&amp;#8217;m doing this in the hope that someone will find it&amp;nbsp;useful.&lt;/p&gt;
&lt;p&gt;Right now I&amp;#8217;ve uploaded &amp;#8220;ToxicDOM&amp;#8221; and &amp;#8220;ToxicSAX&amp;#8221;, two frameworks for &lt;span class="caps"&gt;XML&lt;/span&gt; parsing (based of course on libexpat). ToxicDOM is a &lt;span class="caps"&gt;DOM&lt;/span&gt; level 2 ish level parser. The &lt;span class="caps"&gt;API&lt;/span&gt; is a little bit clunky but works very well and supports namespaces. ToxicSAX is a lightweight SAXish parser that is directly based on&amp;nbsp;libexpat.&lt;/p&gt;
&lt;p&gt;Link:&amp;nbsp;[http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Graveyard/][]&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m putting this code into the graveyard under as public domain. Do with it what you will. The main reason for doing this is because under Tiger Apple has released some great Objective-C &lt;span class="caps"&gt;XML&lt;/span&gt; classes that I&amp;#8217;ve adopted instead of my own code. The only advantage my own code has is that it will work back to Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.1 (and maybe&amp;nbsp;further).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 08 Jun 2005 18:24:25 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-08:toxic_graveyard.html</guid></item><item><title>More Automator Actions (Coming soon)</title><link>http://toxicsoftware.com/more_automator_actions_coming_soon.html</link><description>&lt;p&gt;I&amp;#8217;ll be adding a couple more subversion related automator actions to my site soon. It turns out writing actions is incredibly embarrasingly easy. The &lt;span class="caps"&gt;SVN&lt;/span&gt; Update action is now in subversion at: [http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Automator&amp;nbsp;Actions/][]&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 07 Jun 2005 22:47:26 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-07:more_automator_actions_coming_soon.html</guid></item><item><title>SVN Update Automator Action</title><link>http://toxicsoftware.com/svn_update_automator_action.html</link><description>&lt;p&gt;I whipped up a quick Automator action to do subversion checkouts (Terrence Talbot&amp;#8217;s idea). Source Code [SVN_Update.action.zip][]. No binaries are provided. If you know how to use &lt;span class="caps"&gt;SVN&lt;/span&gt; you know how to build an Xcode&amp;nbsp;project.&lt;/p&gt;
&lt;p&gt;Screenshots: &lt;a href="/uploads/SVNUpdate.png"&gt;SVNUpdate.png&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oh yeah - it runs native on Intel PowerMacs&amp;nbsp;too.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 07 Jun 2005 04:23:43 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-07:svn_update_automator_action.html</guid></item><item><title>Sandvox</title><link>http://toxicsoftware.com/sandvox.html</link><description>&lt;p&gt;Dan Wood and Terrence Talbot of &lt;a href="http://www.karelia.com"&gt;karelia.com&lt;/a&gt; have blogged about their new product: SandVox. They described it as an &amp;#8220;iApp for website publishing&amp;#8221;. They also presented a quick informal demo of it today at lunch during &lt;span class="caps"&gt;WWDC&lt;/span&gt;. Very polished and slick. Like &lt;a href="http://www.karelia.com/watson/"&gt;Watson&lt;/a&gt; it has been written with extensibility through plug-ins as a core feature enabling third party developers to do cool things with&amp;nbsp;it.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 07 Jun 2005 04:18:00 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-07:sandvox.html</guid></item><item><title>Apple on Intel</title><link>http://toxicsoftware.com/intel.html</link><description>&lt;p&gt;Yeah.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 07 Jun 2005 04:15:12 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-07:intel.html</guid></item><item><title>Jared: Butcher of Contextual Help</title><link>http://toxicsoftware.com/jared_butcher_of_contextual_help.html</link><description>&lt;p&gt;I&amp;#8217;m working on some Spotlight software that does cool things with metadata keywords. I also installed (for fun I might add!) the &lt;a href="http://www.freeverse.com/jared/"&gt;&amp;#8220;Jared: Butcher of Song&amp;#8221;&lt;/a&gt; dashboard widget. Now tell me why when I do a keyword search in the finder does hovering the mouse above the keyword pop-up menu produce the following contextual&amp;nbsp;help:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/NotSoContextualHelp.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 04 Jun 2005 20:23:24 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-04:jared_butcher_of_contextual_help.html</guid></item><item><title>Spotlight Importer Collection</title><link>http://toxicsoftware.com/spotlight_importer_collection.html</link><description>&lt;p&gt;I&amp;#8217;ve just uploaded version 0.1 of my new &amp;#8220;Spotlight Importer Collection&amp;#8221; software. This collection of (currently) two spotlight importers replaces my previous &amp;#8220;Conf Spotlight Importer&amp;#8221;&amp;nbsp;software.&lt;/p&gt;
&lt;p&gt;Included is an importer for log files and an importer for property lists/configuration&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;It improves on Conf Spotlight Importer by breaking the importer into two seperate importers, one for log files and one for plist/conf files. The main reason to do this is to allow the user to decide not to install the log file importer if she&amp;nbsp;chooses.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also bundled the two importers into an installer that will install the importers into /Library/Spotlight and then tell the spotlight to reindex all necessary&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;This is version 0.1 software and you should expect bugs. The source code is available from: [http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Spotlight Importer Collection/][] and although isn&amp;#8217;t marked as such yet is released under the &lt;span class="caps"&gt;BSD&lt;/span&gt;&amp;nbsp;license.&lt;/p&gt;
&lt;p&gt;Improvements coming for the next 0.2 release are: one new importer type,&amp;nbsp;documentation.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/uploads/SpotlightImporterCollection.dmg"&gt;SpotlightImporterCollection.dmg&lt;/a&gt; &lt;span class="caps"&gt;252KB&lt;/span&gt; disk&amp;nbsp;image)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 03 Jun 2005 19:23:39 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-03:spotlight_importer_collection.html</guid></item><item><title>WWDC 2005</title><link>http://toxicsoftware.com/wwdc_2005.html</link><description>&lt;p&gt;&lt;a href="http://developer.apple.com/wwdc/"&gt;&lt;span class="caps"&gt;WWDC&lt;/span&gt; 2005&lt;/a&gt; is just around the corner. I&amp;#8217;m going to be attending the lunchtime &lt;a href="http://www.starcoder.com/wordpress/?page_id=85"&gt;MacSB gathering&lt;/a&gt; after Monday&amp;#8217;s keynote and &lt;a href="http://www.scifihifi.com/wwdc-meetup/"&gt;Scifi Hifi&amp;#8217;s &lt;span class="caps"&gt;WWDC&lt;/span&gt; meetup&lt;/a&gt; on Monday&amp;nbsp;evening.&lt;/p&gt;
&lt;p&gt;The schedule is looking&amp;nbsp;busy:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/WWDC2005.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 02 Jun 2005 17:46:47 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-02:wwdc_2005.html</guid></item><item><title>mod_spotlight_apple</title><link>http://toxicsoftware.com/mod_spotlight_apple.html</link><description>&lt;p&gt;Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4 Server includes an Apache module called &amp;#8220;mod_spotlight_apple&amp;#8221;. This module allows (obviously enough) searching your webserver via spotlight. More information is available&amp;nbsp;here:&lt;/p&gt;
&lt;p&gt;[http://images.apple.com/server/pdfs/Web_Technologies_Admin_v10.4.pdf][]&lt;/p&gt;
&lt;p&gt;The gist of it enabling it&amp;nbsp;is:&lt;/p&gt;
&lt;p&gt;Enable mod_spotlight_apple using the Web section of the Server Admin tool. Then browse http://\&amp;lt;yourserver&gt;/.spotlight to see the rather primitive search&amp;nbsp;screen.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/mod_spotlight_apple.png" /&gt;&lt;/p&gt;
&lt;p&gt;Of course based on the above screenshot you can see I&amp;#8217;m having trouble getting mod_spotlight_apple to find&amp;nbsp;anything&amp;#8230;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Update: As pointed out in the comments to this post Apple has posted an article on how to set up mod_spotlight_apple:&amp;nbsp;http://www.apple.com/support/?artnum=302424&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 01 Jun 2005 04:37:36 -0700</pubDate><guid>tag:toxicsoftware.com,2005-06-01:mod_spotlight_apple.html</guid></item><item><title>Mac OS X User Statistics (Part II)</title><link>http://toxicsoftware.com/mac_os_x_user_statistics_part_ii.html</link><description>&lt;p&gt;Omni has (probably quite some time ago but I&amp;#8217;ve only just noticed) updated their &lt;a href="http://update.omnigroup.com"&gt;Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X User Statistics&lt;/a&gt; to include Tiger. Tiger is definitely holding its&amp;nbsp;own.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 31 May 2005 22:32:01 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-31:mac_os_x_user_statistics_part_ii.html</guid></item><item><title>Conf Metadata Importer</title><link>http://toxicsoftware.com/conf_metadata_importer.html</link><description>&lt;p&gt;&lt;a href="/uploads/Conf_Metadata_Importer.mdimporter.zip"&gt;Version 0.2&lt;/a&gt; of my generic &lt;a href="http://toxicsoftware.com/creating_a_generic_config_file_spotlight_importer.html"&gt;config data metadata importer is&amp;nbsp;online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As well as importing generic config files (*.conf) this version adds support for log files (*.log) and property list files&amp;nbsp;(*.plist).&lt;/p&gt;
&lt;p&gt;Log (and conf) files are just dumped into the &amp;#8220;kMDItemTextContent&amp;#8221; metadata attribute. This means the data will get indexed and made searchable through the global Spotlight entry window (command +&amp;nbsp;space).&lt;/p&gt;
&lt;p&gt;Plists are a little more interesting. The importer works with the new(ish) binary format, the old OpenStep format and of course the more common &lt;span class="caps"&gt;XML&lt;/span&gt; format. The format of the plist file is stored in a new &amp;#8220;Property List Format&amp;#8221; (identifier:&amp;#8221;com_toxicsoftware_plist_format&amp;#8221;) attribute so that you can for example use Spotlight to search for find all binary plists on your&amp;nbsp;machine.&lt;/p&gt;
&lt;p&gt;Note - importing a file (especially a &lt;span class="caps"&gt;LARGE&lt;/span&gt; log file) could be an expensive operation. Log files by nature have a tendency to grow quite large over time and in theory this importer &lt;em&gt;could&lt;/em&gt; effect the performance of your machine. However I&amp;#8217;ve been running my Powerbook with the importer active and have not noticed any slow down. Your mileage may&amp;nbsp;vary.&lt;/p&gt;
&lt;p&gt;I will be investigating methods to selectively enable importers for specific files in the&amp;nbsp;future.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 31 May 2005 22:13:47 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-31:conf_metadata_importer.html</guid></item><item><title>FullScreenWindow</title><link>http://toxicsoftware.com/fullscreenwindow.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html" title="FullScreenWindow"&gt;FullScreenWindow&lt;/a&gt; provides a Cocoa NSWindow sub-class that when &amp;#8220;ordered front&amp;#8221; will span the entire area of the main screen. You can change the preferred screen size and whether to hide the system &lt;span class="caps"&gt;UI&lt;/span&gt; (dock and menu bar). The window can also be used in a normal windowed mode - which makes it very simple to make your &lt;span class="caps"&gt;GUI&lt;/span&gt; switch between windowwed and full screen&amp;nbsp;modes.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 30 May 2005 20:21:35 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-30:fullscreenwindow.html</guid></item><item><title>GradientTest</title><link>http://toxicsoftware.com/gradienttest.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html" title="GradientTest"&gt;GradientTest&lt;/a&gt; is a Cocoa sample project showing how to use CoreGraphics to draw smooth gradients in NSViews. What with gradients being used more frequently in Cocoa (row highlighting in Tiger&amp;#8217;s Finder) this code could come in very&amp;nbsp;useful.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/GradientTestScreenshot_thumb.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 30 May 2005 19:36:01 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-30:gradienttest.html</guid></item><item><title>New Sample Code: Ping Tool</title><link>http://toxicsoftware.com/new_sample_code_ping_tool.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/sourcecode.html" title="PingTool"&gt;PingTool&lt;/a&gt; is a Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X Cocoa project that provides an Objective C class for using icmp to ping hosts on the network. It uses NSNotifications to report status, can be configured in a variety of ways and can provide relatively detailed statistics on the host it is&amp;nbsp;pinging.&lt;/p&gt;
&lt;p&gt;The header files are documented with headerdocs and sample code is&amp;nbsp;provided.&lt;/p&gt;
&lt;p&gt;The code was originally based on Apple sample&amp;nbsp;code.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 30 May 2005 19:25:09 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-30:new_sample_code_ping_tool.html</guid></item><item><title>One Handed Dictionary</title><link>http://toxicsoftware.com/one_handed_dictionary.html</link><description>&lt;p&gt;Here&amp;#8217;s some silly Python 2.x code to display a list of words that can be typed solely with one hand. Of course any word can be typed one handed if you&amp;#8217;re a hunt and peck&amp;nbsp;typist&amp;#8230;&lt;/p&gt;
&lt;p&gt;The list might be useful for passwords or for people who need to um&amp;#8230; er&amp;#8230; type one handed. Um like someone writing a &lt;a href="http://en.wikipedia.org/wiki/Lipogram" title="lipogram"&gt;lipogram&lt;/a&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;The code can be sped up on Python 2.4 by changing the list comprehensions &amp;#8220;[ x for x in y]&amp;#8221; to &lt;a href="http://www.python.org/doc/2.4/whatsnew/node4.html"&gt;generator expressions&lt;/a&gt; &amp;#8220;(x for x in y)&amp;#8221;. Generator comprehensions are more efficient: processing 234,937 words on my 1.5GHz Powerbook takes 23.768 seconds with list comprensions and 11.157 seconds with generator&amp;nbsp;comprehensions.&lt;/p&gt;
&lt;p&gt;The longest words found in this dictionary&amp;nbsp;were:&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;AFTERCATARACT&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;PHYLLOPHYLLIN&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;TESSERADECADE&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Next time you use one of those in scrabble don&amp;#8217;t forget to remind your opponent that the word can be typed&amp;nbsp;one-handed.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/local/bin/python&lt;/span&gt;

&lt;span class="n"&gt;theLeft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;span class="caps"&gt;QWERTASDFGZXCV&lt;/span&gt;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;theRight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;span class="caps"&gt;YUIOPHJKLBNM&lt;/span&gt;&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;theFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/usr/share/dict/words&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;### Remove line endings...&lt;/span&gt;
&lt;span class="n"&gt;theWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theLine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theLine&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="c"&gt;### Remove single letters...&lt;/span&gt;
&lt;span class="n"&gt;theWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theWord&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theWords&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theWord&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c"&gt;### Make the words upper case...&lt;/span&gt;
&lt;span class="n"&gt;theWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theWord&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theWords&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c"&gt;### Check to find words made up of only left hand letters or right hand letters but not both...&lt;/span&gt;
&lt;span class="n"&gt;theWords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theWord&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theWords&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theLeft&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theRight&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;span class="c"&gt;### Print out the words...&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theWords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;theWord&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 28 May 2005 03:05:13 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-28:one_handed_dictionary.html</guid></item><item><title>Creating a “Generic Config File” Spotlight Importer</title><link>http://toxicsoftware.com/creating_a_generic_config_file_spotlight_importer.html</link><description>&lt;p&gt;I&amp;#8217;ve just released version 1.0.6 of my Python Metadata Importer plugin. What&amp;#8217;s&amp;nbsp;new: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for Intel&amp;nbsp;architecture.&lt;/li&gt;
&lt;li&gt;UTType now includes Python&amp;#8217;s &lt;span class="caps"&gt;OS&lt;/span&gt; Creator&amp;nbsp;code.&lt;/li&gt;
&lt;li&gt;Slightly better error&amp;nbsp;handling&lt;/li&gt;
&lt;li&gt;Python Metadata Importer shouldn&amp;#8217;t die when indexing Python files it doesn&amp;#8217;t&amp;nbsp;understand.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Direct download: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Python Metadata Importer.dmg&lt;/a&gt; Source code: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Spotlight/Python%20Metadata%20Importer/&lt;/a&gt; About Python Metadata Importer: Allows Spotlight to import and index Python script source code. Various metadata are imported from the source code including function and class names, version, author and description. Related&amp;nbsp;Postings: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/python_metadata_importer_released_for_tiger.html"&gt;Python Metadata Importer Released for&amp;nbsp;Tiger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/spoke_at_phadorg_meeting_tonight.html"&gt;Spoke at phad.org meeting&amp;nbsp;tonight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/lisp_metadata_importer.html"&gt;Lisp Metadata&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/ruby_spotlight_importer.html"&gt;Ruby Spotlight&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/python_metadata_importer_101_released.html"&gt;Python Metadata Importer 1.0.1&amp;nbsp;Release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/python_metadata_importer_released_for_tiger.html"&gt;Python Metadata Importer Released for&amp;nbsp;Tiger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/conf_metadata_importer.html"&gt;Conf Metadata&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://toxicsoftware.com/creating_a_generic_config_file_spotlight_importer.html"&gt;Creating a Generic Config File Spotlight&amp;nbsp;Importer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 27 May 2005 09:03:30 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-27:creating_a_generic_config_file_spotlight_importer.html</guid></item><item><title>Gainfully Unemployed (soon)</title><link>http://toxicsoftware.com/gainfully_unemployed.html</link><description>&lt;p&gt;June will be my last month of employment at my current company. Unless something undeniably awesome interrupts, the plan is to try and complete some of my shareware ideas. To supplement that I&amp;#8217;m also trying to find some Mac &lt;span class="caps"&gt;OS&lt;/span&gt; development consultant work. More on that&amp;nbsp;later.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 27 May 2005 07:07:57 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-27:gainfully_unemployed.html</guid></item><item><title>Spoke at PHAD.org meeting tonight</title><link>http://toxicsoftware.com/spoke_at_phadorg_meeting_tonight.html</link><description>&lt;p&gt;At tonight&amp;#8217;s &lt;a href="http://phad.org"&gt;&lt;span class="caps"&gt;PHAD&lt;/span&gt;.org&lt;/a&gt; meeting I spoke briefly about &lt;a href="http://toxicsoftware.com/python_metadata_importer_101_released.html"&gt;Python Metadata Importer&lt;/a&gt;, &lt;a href="http://toxicsoftware.com/spotlight_metadate_duplicate_finder.html"&gt;MDDupe&lt;/a&gt; and a couple of other Spotlight related projects I have on the stove right now. Seemed to go over ok with lots of interesting discussion. &lt;a href="http://mikezornek.com"&gt;Mike Zornek&lt;/a&gt; presented his work on unit testing CoreData with &lt;a href="http://unitkit.org"&gt;UnitKit&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 27 May 2005 07:01:19 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-27:spoke_at_phadorg_meeting_tonight.html</guid></item><item><title>Python Metadata Importer 1.0.1 Released</title><link>http://toxicsoftware.com/python_metadata_importer_101_released.html</link><description>&lt;p&gt;I&amp;#8217;ve just uploaded version 1.0.1 of &lt;a href="http://toxicsoftware.com/python_metadata_importer_released_for_tiger.html" title="Python Metadata Importer"&gt;Python Metadata Importer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the&amp;nbsp;documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixes problem importing function&amp;nbsp;names.&lt;/li&gt;
&lt;li&gt;All metadata attributes now added to the list of visible attributes (which means you should now see them in a Finder Get Info&amp;nbsp;window).&lt;/li&gt;
&lt;li&gt;Entire file source code added to kMDItemTextContent attribute (just like Apple&amp;#8217;s Source Code importer seems to&amp;nbsp;do).&lt;/li&gt;
&lt;li&gt;Slight updates to&amp;nbsp;documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Binary: [Python_Metadata_Importer.dmg][] Source: &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Subversion&amp;nbsp;Repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screenshot: &lt;a href="/uploads/PythonMetaImporterGetInfo.png"&gt;PythonMetaImporterGetInfo.png&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 26 May 2005 06:17:37 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-26:python_metadata_importer_101_released.html</guid></item><item><title>UTTypes Graph</title><link>http://toxicsoftware.com/uttypes_graph.html</link><description>&lt;p&gt;I&amp;#8217;ve produced a &lt;a href="http://graphviz.org"&gt;GraphViz&lt;/a&gt; dot file graph representing all the standard Apple specified UTTypes available on Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4. There&amp;#8217;s a lot of information to be represented on one page of the graph. See for yourself: Output &lt;span class="caps"&gt;PDF&lt;/span&gt; file: &lt;a href="/uploads/UTTypes.pdf"&gt;UTTypes.pdf&lt;/a&gt; Source &lt;span class="caps"&gt;DOT&lt;/span&gt; file: &lt;a href="/uploads/uttypes.dot"&gt;uttypes.dot&lt;/a&gt; Maybe someone who is more familiar with the &lt;span class="caps"&gt;DOT&lt;/span&gt; file format can lay it out a little better. It turns out that &lt;a href="http://www.omnigroup.com/applications/omnigraffle/"&gt;OmniGraffle&lt;/a&gt; does an excellent job of laying out the graph. I should have guessed. Output &lt;span class="caps"&gt;PDF&lt;/span&gt; file: &lt;a href="/uploads/UTType.pdf"&gt;UTType.pdf&lt;/a&gt; OmniGraffle Document: &lt;a href="/uploads/UTType.graffle"&gt;UTType.graffle&lt;/a&gt; &lt;a href="http://reviews.macnn.com/review.php?id=92"&gt;OmniGraffle 4.0&lt;/a&gt; will have &lt;span class="caps"&gt;SVG&lt;/span&gt; export functionality. I&amp;#8217;m sure I&amp;#8217;m not the only one waiting for that. But is it my imagination or is Omni hiking the price through the roof? Added python source code:&amp;nbsp;&amp;gt;&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/local/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;plistlib&lt;/span&gt;

&lt;span class="n"&gt;thePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;/System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;thePlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plistlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readPlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;theDocumentTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thePlist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTExportedTypeDeclarations&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;theNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;theIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theDocumentType&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theDocumentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;theNames&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeIdentifier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;span class="caps"&gt;UT&lt;/span&gt;&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;theIndex&lt;/span&gt;
    &lt;span class="n"&gt;theIndex&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;digraph G {&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theDocumentType&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theDocumentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;theType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeIdentifier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;theName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theNames&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt; [label=&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;];&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeConformsTo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeConformsTo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeConformsTo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeConformsTo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;theConformTo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;theDocumentType&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;UTTypeConformsTo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;theConformToName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theNames&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theConformTo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theConformToName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;}&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 26 May 2005 04:39:58 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-26:uttypes_graph.html</guid></item><item><title>Python Metadata Importer Released for Tiger</title><link>http://toxicsoftware.com/python_metadata_importer_released_for_tiger.html</link><description>&lt;p&gt;I&amp;#8217;ve released version 1.0 of the &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Python Metadata Importer&lt;/a&gt;. This is a &lt;a href="http://www.apple.com/macosx/features/spotlight/"&gt;Spotlight&lt;/a&gt; plug-in (&amp;#8220;mdimporter&amp;#8221;) that gives Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4 Tiger to import &lt;a href="http://python.org"&gt;Python&lt;/a&gt; source&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;Download: [Python_Metadata_Importer.dmg][] &lt;a href="http://toxicsoftware.com/sourcecode.html"&gt;Source Code (&lt;span class="caps"&gt;BSD&lt;/span&gt; license)&lt;/a&gt;. The source code shows a way of writing a Metadata importer in Python (without any dependencies on any other&amp;nbsp;components).&lt;/p&gt;
&lt;p&gt;Link to &lt;a href="http://toxicsoftware.com/python_metadata_importer_101_released.html"&gt;Version&amp;nbsp;1.0.1&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 25 May 2005 07:39:13 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-25:python_metadata_importer_released_for_tiger.html</guid></item><item><title>George Lucas - won’t you think of the younglings?</title><link>http://toxicsoftware.com/george_lucas_wont_you_think_of_the_younglings.html</link><description>&lt;p&gt;Just came back from &lt;a href="http://www.imdb.com/title/tt0121766/?fr=c2l0ZT1kZnxteD0yMHxsbT01MDB8dHQ9b258ZmI9dXxwbj0wfHE9cmV2ZW50IG9mIHRoZSBzaXRofGh0bWw9MXxubT1vbg__;fc=1;ft=20;fm=1"&gt;Star Wars: Revenge of the Sith&lt;/a&gt; at the &lt;a href="http://www.fandango.com/TheaterPage.aspx?radius=30&amp;amp;tid=AAOQP"&gt;imax at King of Prussia&lt;/a&gt;. I want my childhood back. I won&amp;#8217;t put any spoilers here because frankly I can&amp;#8217;t be bothered to recall the movie - but boy, &lt;a href="http://www.viewaskew.com/news/sith/"&gt;Kevin Smith lies&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 21 May 2005 07:06:27 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-21:george_lucas_wont_you_think_of_the_younglings.html</guid></item><item><title>Speaking of Subversion</title><link>http://toxicsoftware.com/speaking_of_subversion.html</link><description>&lt;p&gt;&lt;a href="http://sinz.org"&gt;Michael Sinz&lt;/a&gt; has created a great web front-end for &lt;a href="http://subversion.tigris.org"&gt;subversion&lt;/a&gt; source code repositories called &lt;a href="http://freshmeat.net/releases/196107/" title="insurrection"&gt;insurrection&lt;/a&gt; (also &lt;a href="http://insurrection.tigris.org"&gt;tigris home page&lt;/a&gt;). Try the test repository at &lt;a href="http://.sinz.com:8000"&gt;http://.sinz.com:8000/&lt;/a&gt;. The front-end provides a heck of a lot of functionality that other front-ends don&amp;#8217;t - such as the ability to drill down into the directory structure (like Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X list view) and perform diffs and get detailed histories. Pretty cool. (I take partial credit for the name&amp;nbsp;too&amp;#8230;)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 19 May 2005 05:22:03 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-19:speaking_of_subversion.html</guid></item><item><title>The Tao of Mac slams Mail.app</title><link>http://toxicsoftware.com/the_tao_of_mac_slams_mailapp.html</link><description>&lt;p&gt;Someone woke up on the wrong side of the bed this&amp;nbsp;morning&amp;#8230;&lt;/p&gt;
&lt;p&gt;From [&lt;a href="http://the.taoofmac.com/space"&gt;The Tao of Mac&lt;/a&gt;]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://the.taoofmac.com/space/blog/2005-05-06"&gt;Mail.app 0.2&lt;/a&gt;\&lt;/p&gt;
&lt;p&gt;Okay. Taking a break from the work I brought home (can&amp;#8217;t seem to be able to do &lt;em&gt;anything&lt;/em&gt; in the office these days thanks to all sorts of random interruptions and a rampaging allergy), I&amp;#8217;ve been trying to use &lt;a href="http://the.taoofmac.com/space/Mail.app" title="Mail.app"&gt;Mail.app&lt;/a&gt; 2.0 on and off this week, with utterly miserable&amp;nbsp;results.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://the.taoofmac.com/space/Apple" title="Apple"&gt;Apple&lt;/a&gt;, this is &lt;em&gt;not&lt;/em&gt; a &lt;a href="http://the.taoofmac.com/space/MUA" title="MUA"&gt;&lt;span class="caps"&gt;MUA&lt;/span&gt;&lt;/a&gt;. It&amp;#8217;s a shambles. Even as I finished writing this, &lt;a href="http://www.litux.org/blog/2005.05.06/apple-mail-rant" title="Davi's post"&gt;Davi&amp;#8217;s post&lt;/a&gt; popped up on my inbox (which, incidentally, is now being accessed via &lt;a href="http://the.taoofmac.com/space/Thunderbird" title="Thunderbird"&gt;Thunderbird&lt;/a&gt; for anything I &lt;em&gt;really&lt;/em&gt; need to&amp;nbsp;do)&lt;/p&gt;
&lt;/blockquote&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 06 May 2005 23:50:46 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-06:the_tao_of_mac_slams_mailapp.html</guid></item><item><title>Spotlight Metadate Duplicate Finder</title><link>http://toxicsoftware.com/spotlight_metadate_duplicate_finder.html</link><description>&lt;p&gt;Wow. It&amp;#8217;s been a while since I&amp;nbsp;posted.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been working on a little Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X Tiger only tool that uses &lt;a href="http://www.apple.com/macosx/features/spotlight/" title="Spotlight"&gt;Tiger&amp;#8217;s Spotlight&lt;/a&gt; feature to find duplicate files using Spotlight metadata as the duplicate matching&amp;nbsp;criteria.&lt;/p&gt;
&lt;p&gt;This turns out to be a really powerful way of finding duplicate files no matter what the type. The same tool you&amp;#8217;d use to find duplicate MP3s will also find duplicate picture&amp;nbsp;files.&lt;/p&gt;
&lt;p&gt;The program is still a work in progress, it currently successfully finds the files and filters the duplicates but currently does not delete or otherwise process the&amp;nbsp;duplicates:&lt;/p&gt;
&lt;p&gt;Screenshots:&lt;/p&gt;
&lt;p&gt;Directory chooser:&amp;nbsp;[MDDupe_Screenshot_1.png][]&lt;/p&gt;
&lt;p&gt;Predicate input:&amp;nbsp;[MDDupe_Screenshot_2.png][]&lt;/p&gt;
&lt;p&gt;Duplicate chooser:&amp;nbsp;[MDDupe_Screenshot_3.png][]&lt;/p&gt;
&lt;p&gt;Duplicate processor:&amp;nbsp;[MDDupe_Screenshot_4.png][]&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 06 May 2005 21:14:42 -0700</pubDate><guid>tag:toxicsoftware.com,2005-05-06:spotlight_metadate_duplicate_finder.html</guid></item><item><title>All sample code available in Subversion repository</title><link>http://toxicsoftware.com/all_sample_code_available_in_subversion_repository.html</link><description>&lt;p&gt;I&amp;#8217;ve put all my released sample code (and some beside) online in a read-only &lt;a href="http://subversion.tigris.org"&gt;subversion&lt;/a&gt; repository: &lt;a href="http://puck.homeip.net//public/trunk/Samples/" title="Sample Code"&gt;http://puck.homeip.net//public/trunk/Samples/&lt;/a&gt;.&amp;nbsp;Enjoy.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 25 Feb 2005 20:45:35 -0800</pubDate><guid>tag:toxicsoftware.com,2005-02-25:all_sample_code_available_in_subversion_repository.html</guid></item><item><title>iRoster</title><link>http://toxicsoftware.com/iroster1.html</link><description>&lt;h3&gt;What is&amp;nbsp;iRoster?&lt;/h3&gt;
&lt;p&gt;iRoster is a small and convenient tool for finding and connecting to Rendezvous enabled services on your network such as web servers, Apple File Sharing (&lt;span class="caps"&gt;AFP&lt;/span&gt;) servers, and&amp;nbsp;others.&lt;/p&gt;
&lt;p&gt;iRoster provides easy access to Rendezvous services on your network from a menu accessible within its dock icon (or from the menubar). iRoster can also advertise other services on your computer that may not yet work with Rendezvous. iRoster can also attach AppleScripts to Rendezvous services. This will allow you to visit the service&amp;#8217;s &lt;span class="caps"&gt;URL&lt;/span&gt; or launch and control&amp;nbsp;applications.&lt;/p&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;p&gt;Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.2 (&amp;#8220;Jaguar&amp;#8221;) or higher. iRoster will not run on earlier versions of Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X. Other Rendezvous enabled devices on your local network (optional, but highly&amp;nbsp;recommended!).&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[&lt;img alt="" src="/uploads/versiontracker.png" /&gt;][]iRoster entry on&amp;nbsp;VersionTracker&lt;/li&gt;
&lt;li&gt;[&lt;img alt="" src="/uploads/macupdate.png" /&gt;][]iRoster entry on&amp;nbsp;MacUpdate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[&lt;img alt="" src="/uploads/versiontracker.png" /&gt;]: http://www.versiontracker.com/dyn/moreinfo/macosx/18853 &amp;#8220;iRoster on versiontracker.com&amp;#8221;
  [&lt;img alt="" src="/uploads/macupdate.png" /&gt;]: http://www.macupdate.com/info.php/id/11229 &amp;#8220;iRoster on&amp;nbsp;macupdate.com&amp;#8221;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 04 Feb 2005 02:56:47 -0800</pubDate><guid>tag:toxicsoftware.com,2005-02-04:iroster1.html</guid></item><item><title>Subversion via DarwinPorts</title><link>http://toxicsoftware.com/subversion_via_darwinports.html</link><description>&lt;p&gt;&lt;a href="http://blog.x180.net" title="James Duncan Davidson"&gt;James Duncan Davidson&lt;/a&gt; has a &lt;a href="http://blog.x180.net/2005/01/subversion_via_.html"&gt;good article&lt;/a&gt; on how to get the &lt;a href="http://subversion.tigris.org"&gt;subversion&lt;/a&gt; source control system installed using &lt;a href="http://darwinports.opendarwin.org"&gt;DarwinPorts&lt;/a&gt;. I&amp;#8217;ve been using subversion for quite some time via DarwinPorts but haven&amp;#8217;t yet installed it for use with Apache2 (prefering the +ssh access method) although Jame&amp;#8217;s article has inspired me to give it a try (one caveat - Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X Server already has a binary of&amp;nbsp;Apache2&amp;#8230;)&lt;/p&gt;
&lt;p&gt;One thing I&amp;#8217;d add is to use the &amp;#8216;-c&amp;#8217; switch when installing your ports to make DarwinPorts clean up behind&amp;nbsp;it.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 01 Feb 2005 22:47:41 -0800</pubDate><guid>tag:toxicsoftware.com,2005-02-01:subversion_via_darwinports.html</guid></item><item><title>Upgraded to Expression Engine 1.2.1</title><link>http://toxicsoftware.com/upgraded_to_expression_engine_121.html</link><description>&lt;p&gt;I&amp;#8217;ve upgraded to &lt;a href="http://www.pmachine.com" title="ExpressionEngine"&gt;ExpressionEngine&lt;/a&gt; 1.2.1. A few minor hiccups (mostly my fault) but this was the smoothest upgrade so far. Hopefully though they&amp;#8217;ll make it smoother in the future by automating more of&amp;nbsp;it.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 01 Feb 2005 21:04:03 -0800</pubDate><guid>tag:toxicsoftware.com,2005-02-01:upgraded_to_expression_engine_121.html</guid></item><item><title>Password Panel Sample Code</title><link>http://toxicsoftware.com/passwordpanel_cocoa_source_code.html</link><description>&lt;p&gt;This sample code can (hopefully) be used by any application presenting a change password dialog to the user. Different dialogs allow the user to enter a new password or change a previously entered password. Dialogs can be presented as either standalone modal windows or sheets. Furthermore the user is informed of any problems or weaknesses with the password via a text field. The algorithm used to compute password strength can be overriden. The algorithm supplied with this sample code uses a dictionary lookup to check the password&amp;nbsp;strength.&lt;/p&gt;
&lt;p&gt;Also included with this sample code is an Objective C class that implements the bloom filter algorithm, see &lt;a href="http://www.google.com/search?q=bloom+filter"&gt;http://www.google.com/search?q=bloom+filter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/uploads/PasswordPanel.zip"&gt;PasswordPanel.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screenshots: &lt;img alt="Password Panel Screenshot" src="/uploads/PasswordPanelScreenshot1.png" /&gt;&lt;/p&gt;
&lt;p&gt;Update: Source code is now live on the Toxic Software subversion&amp;nbsp;server:&lt;/p&gt;
&lt;p&gt;[http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Misc/PasswordPanel/][]&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 07 Dec 2004 04:44:42 -0800</pubDate><guid>tag:toxicsoftware.com,2004-12-07:passwordpanel_cocoa_source_code.html</guid></item><item><title>AirPort at the AirPort</title><link>http://toxicsoftware.com/airport_at_the_airport.html</link><description>&lt;p&gt;I&amp;#8217;m stuck at Philadelphia airport on the way to South Carolina for Thanksgiving. Luckily there&amp;#8217;s an &lt;span class="caps"&gt;AT&lt;/span&gt;&amp;amp;T wireless hotspot here to keep me sane. There are a whole bunch of other Mac users here sharing various services over Rendezvous - iTunes, iChat of course. It&amp;#8217;s like a mini meta-Macintosh User Group. If you don&amp;#8217;t want or need to get out onto the Internet you can still connect to the &lt;span class="caps"&gt;AT&lt;/span&gt;&amp;amp;T network and use rendezvous to browse and access other people&amp;#8217;s Rendezvous services. Rendezvous definitely is an amazing&amp;nbsp;technology.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 25 Nov 2004 04:31:20 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-25:airport_at_the_airport.html</guid></item><item><title>Sequence Grabber Cocoa Source Code</title><link>http://toxicsoftware.com/sequence_grabber_cocoa_source_code.html</link><description>&lt;p&gt;Cocoa source code showing how to use a QuickTime Sequence Grabber (e.g. an iSight camera) from your Cocoa&amp;nbsp;application.&lt;/p&gt;
&lt;p&gt;Update. I&amp;#8217;ve uploaded a new version of the SequenceGrabber source code that should compile cleanly on any Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.3 machine. Thanks to &amp;#8220;jlecuyer&amp;#8221; for pointing out the original version was&amp;nbsp;broken.&lt;/p&gt;
&lt;p&gt;Update: Information on new version &lt;a href="http://toxicsoftware.com/sequence_grabber_code_now_with_coregoodness.html"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update: Link to source deleted, see my &lt;a href="http://toxicsoftware.com/toxicmedia.html"&gt;ToxicMedia&lt;/a&gt;&amp;nbsp;page.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 23 Nov 2004 04:19:15 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-23:sequence_grabber_cocoa_source_code.html</guid></item><item><title>iCalToRSS Roadmap</title><link>http://toxicsoftware.com/icaltorss_roadmap.html</link><description>&lt;p&gt;iCalToRSS is a tool I wrote partly because I wanted to find out how difficult it would be to do. With NetNewsWire 2.0&amp;#8217;s &amp;#8220;Special Subscription&amp;#8221; functionality and &lt;a href="http://www.dalkescientific.com/Python/PyRSS2Gen.html"&gt;PyRSS2Gen&lt;/a&gt; it turned out to be pretty easy. I also wrote it because unlike iCal NetNewsWire is a tool I keep running on my PowerBook constantly and I thought it would be a perfect place to keep track of my iCal &lt;span class="caps"&gt;TODO&lt;/span&gt;&amp;nbsp;items.&lt;/p&gt;
&lt;p&gt;So what are my plans for further development of&amp;nbsp;iCalToRSS?&lt;/p&gt;
&lt;p&gt;Short&amp;nbsp;Term&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make iCalToRSS work for as many people as&amp;nbsp;possible.&lt;/li&gt;
&lt;li&gt;Fix any errors with the calendar file parsing&amp;nbsp;code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Medium&amp;nbsp;Term&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow the format of the &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds to be user configurable: allow the user to specify the format of the feed titles and descriptions, only provide feeds for events that are less than N days old, event sort order, filter by event/&lt;span class="caps"&gt;TODO&lt;/span&gt; item&amp;nbsp;etc.&lt;/li&gt;
&lt;li&gt;Find a method to make NetNewsWire treat a news item as&amp;nbsp;unread.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Long&amp;nbsp;Term:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide simple one step configuration editor that will allow the user to add iCal feeds to &lt;span class="caps"&gt;NNW&lt;/span&gt; with-out having to mess with paths and URLs in &lt;span class="caps"&gt;NNW&lt;/span&gt;&amp;#8217;s special subscription&amp;nbsp;dialog.&lt;/li&gt;
&lt;li&gt;Provide a stand-alone version of iCalToRSS that works with any &lt;span class="caps"&gt;RSS&lt;/span&gt;&amp;nbsp;aggregator.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 04 Nov 2004 17:48:29 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-04:icaltorss_roadmap.html</guid></item><item><title>iCalToRSS 0.4 fixes some important bugs</title><link>http://toxicsoftware.com/icaltorss_04_fixes_some_important_bugs.html</link><description>&lt;p&gt;Version 0.4 just uploaded hot on the heals of 0.3. This one fixes an important bug that could have prevented the iCalToRSS from reading a calendar file at all. Hopefully iCalToRSS should be able to generate &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds for pretty much every calendar out there - if it doesn&amp;#8217;t please send me the calendar file in&amp;nbsp;question.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/uploads/iCalToRSS.tar.gz"&gt;iCalToRSS.tar.gz&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 04 Nov 2004 07:55:14 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-04:icaltorss_04_fixes_some_important_bugs.html</guid></item><item><title>iCalToRSS 0.3</title><link>http://toxicsoftware.com/icaltorss_03.html</link><description>&lt;p&gt;iCalToRSS version 0.3 has just been uploaded. This version fixes a couple of &lt;span class="caps"&gt;RSS&lt;/span&gt; creation issues and adds support for the &amp;#8220;webcal:&amp;#8221; &lt;span class="caps"&gt;URL&lt;/span&gt; scheme and &lt;span class="caps"&gt;UNIX&lt;/span&gt; file paths. And if there was a seeding release of Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X 10.4 that changes the way iCal files are stored then this release would fix&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/uploads/iCalToRSS.tar.gz"&gt;iCalToRSS.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to everyone for posting and emailing me with bug reports and sample data. iCalToRSS is very much an immature work in progress and there will be lots of bugs. I hope to get every issue I&amp;#8217;m made aware of fixed before adding any new features. Feedback, suggestions, bug reports, praise and criticism are always&amp;nbsp;welcome.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 04 Nov 2004 06:38:00 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-04:icaltorss_03.html</guid></item><item><title>Janie Porche is Blogging</title><link>http://toxicsoftware.com/janie_porche_is_blogging.html</link><description>&lt;p&gt;This will go down as one of those posts that I won&amp;#8217;t want future employers to ever&amp;nbsp;see&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.apple.com/switch/stories/janieporche.html"&gt;Janie Porche&lt;/a&gt;, yes &lt;em&gt;that&lt;/em&gt;&lt;a href="http://www.cadenhead.org/workbench/stories/2002/10/14/stalkingJaniePorche.html"&gt;Janie Porche&lt;/a&gt; is &lt;a href="http://www.janieporche.com/weblog/"&gt;blogging&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It turns out that she is a very talented &lt;a href="http://www.janieporche.com/music.php"&gt;singer&lt;/a&gt;&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;It doesn&amp;#8217;t help me answer this question though: Janie Porche or &lt;a href="http://www.iheartmorganwebb.com"&gt;Morgan Webb&lt;/a&gt;?&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 02 Nov 2004 17:12:29 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-02:janie_porche_is_blogging.html</guid></item><item><title>New iCalToRSS release</title><link>http://toxicsoftware.com/new_icaltorss_release.html</link><description>&lt;p&gt;I hesitate to call this a &lt;em&gt;release&lt;/em&gt; - there&amp;#8217;s only one significant change to my iCal to &lt;span class="caps"&gt;RSS&lt;/span&gt; tool: if you do not configure iCalToRSS with a &lt;span class="caps"&gt;URL&lt;/span&gt; then it will produce feeds for all your calendar files. Download here: &lt;a href="/uploads/iCalToRSS.tar.gz"&gt;iCalToRSS.tar.gz&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 01 Nov 2004 23:23:44 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-01:new_icaltorss_release.html</guid></item><item><title>Visited States</title><link>http://toxicsoftware.com/visited_states.html</link><description>&lt;p&gt;No this isn&amp;#8217;t an election&amp;nbsp;map!&lt;/p&gt;
&lt;p&gt;Purely for my own satisfaction I thought I&amp;#8217;d post a map of the &lt;span class="caps"&gt;US&lt;/span&gt; states I&amp;#8217;ve visited since moving to the &lt;span class="caps"&gt;US&lt;/span&gt; 6 years&amp;nbsp;ago.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Visited States" src="http://www.world66.com/myworld66/visitedStates/statemap?visited=ALARCACOCTDEFLGAKSKYLAMDMSNJNYNCOKPASCTNTXWVWY" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.world66.com/myworld66"&gt;create your own personalized map of the &lt;span class="caps"&gt;USA&lt;/span&gt;&lt;/a&gt; or &lt;a href="http://www.world66.com"&gt;write about it on the open travel&amp;nbsp;guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(&lt;strong&gt;Update&lt;/strong&gt; I forgot&amp;nbsp;Arkansas!)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 01 Nov 2004 17:02:18 -0800</pubDate><guid>tag:toxicsoftware.com,2004-11-01:visited_states.html</guid></item><item><title>iCalToRSS</title><link>http://toxicsoftware.com/icaltorss.html</link><description>&lt;p&gt;&lt;a href="/uploads/iCalToRSS.tar.gz"&gt;iCalToRSS&lt;/a&gt;; is a set of &lt;a href="http://python.org"&gt;Python&lt;/a&gt; scripts I wrote for retrieving &lt;a href="http://www.apple.com/ical/"&gt;iCa&lt;/a&gt; events and &lt;span class="caps"&gt;TODO&lt;/span&gt; items and displaying them as &lt;span class="caps"&gt;RSS&lt;/span&gt; newsfeeds inside &lt;a href="http://ranchero.com/netnewswire/"&gt;;NetNewsWire 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote the Python code to parse the iCal calendar files (which are standard &lt;a href="http://www.faqs.org/rfcs/rfc2425.html"&gt;&lt;span class="caps"&gt;RFC2425&lt;/span&gt;&lt;/a&gt; Mime-Dir files) and then I use &lt;a href="http://www.dalkescientific.com/Python/PyRSS2Gen.html"&gt;PyRSS2Gen&lt;/a&gt; to output the events as &lt;span class="caps"&gt;RSS&lt;/span&gt; news items. Finally NetNewsWire 2.0 executes my scripts and displays the&amp;nbsp;&lt;span class="caps"&gt;RSS&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Download: &lt;a href="/uploads/iCalToRSS.tar.gz"&gt;iCalToRSS.tar.gz&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 30 Oct 2004 05:57:57 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-30:icaltorss.html</guid></item><item><title>SnappingWindow Cocoa Source Code</title><link>http://toxicsoftware.com/snappingwindow_cocoa_source_code.html</link><description>&lt;p&gt;I&amp;#8217;ve just uploaded some &lt;a href="http://developer.apple.com/cocoa/"&gt;Cocoa&lt;/a&gt; source code showing how to make &lt;a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/Classes/NSWindow.html"&gt;NSWindow&lt;/a&gt;s &amp;#8216;snap&amp;#8217; to other windows and to the edges of the screen. You can configure what edges a window will snap to and the threshold distance of the snapping. I hope someone finds it useful. Comments&amp;nbsp;welcome.&lt;/p&gt;
&lt;p&gt;&lt;a href="/uploads/SnappingWindows.tar.gz"&gt;SnappingWindows.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Code is now on the toxicsoftware subversion server:&amp;nbsp;[http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Projects/Misc/SnappingWindows/][]&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="/uploads/SnappingWindowsScreenshot_thumb.png" /&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 26 Oct 2004 21:51:02 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-26:snappingwindow_cocoa_source_code.html</guid></item><item><title>Ouch that Stings!</title><link>http://toxicsoftware.com/ouch_that_stings.html</link><description>&lt;p&gt;I don&amp;#8217;t think this blog is the place to get political but this is too good to pass&amp;nbsp;up:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Finally, I believe a white man of privilege who was accepted to Yale University despite a middling performance in prep school; was accepted to Harvard Business School despite a middling performance at Yale; was admitted to the Texas Air National Guard despite no flight background and an entrance exam score in the bottom quartile; was given funds by Osama bin Laden&amp;#8217;s father to start a failed oil company; and was chosen to serve as Texas governor and 43rd President of the United States despite a lifelong record of mediocrity, is a man with the moral authority to criticize affirmative action as a policy that gives opportunities to the&amp;nbsp;undeserving.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://gadflyer.com/articles/?ArticleID=249"&gt;http://gadflyer.com/articles/?ArticleID=249&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 26 Oct 2004 17:12:53 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-26:ouch_that_stings.html</guid></item><item><title>Powerbook Damage</title><link>http://toxicsoftware.com/powerbook_damage.html</link><description>&lt;p&gt;Looks like my 1.5GHz 15&amp;#8221; Aluminium PowerBook (bought in April &amp;#8216;04) isn&amp;#8217;t the only one to suffer from weird &amp;#8220;pitting&amp;#8221; and other surface damage see: &lt;a href="http://saladwithsteve.com/osx/2004/10/powerbook-pitting.html"&gt;http://saladwithsteve.com/osx/2004/10/powerbook-pitting.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m about to buy an extended AppleCare contract and see if I can get Apple to repair it and other&amp;nbsp;issues.&lt;/p&gt;
&lt;p&gt;Photos: &lt;a href="/uploads/Powerbook_LeftDamage.jpg"&gt;1&lt;/a&gt;, &lt;a href="/uploads/Powerbook_RightDamage.jpg"&gt;2&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 18 Oct 2004 17:26:26 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-18:powerbook_damage.html</guid></item><item><title>OmniWeb 5.1b1 fixes issues with this blog</title><link>http://toxicsoftware.com/omniweb_51b1_fixes_issues_with_this_blog.html</link><description>&lt;p&gt;&lt;a href="http://www.omnigroup.com/applications/omniweb/" title="OmniWeb"&gt;OmniWeb&lt;/a&gt;&lt;a href="http://www.versiontracker.com/dyn/moreinfo/macosx/3253" title="5.1b1"&gt;5.1b1&lt;/a&gt; fixes the problems with rendering &lt;a href="http://toxicsoftware.com" title="my blog"&gt;my blog&lt;/a&gt;. It also adds full tabbing between form elements.&amp;nbsp;Wonderful.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 07 Oct 2004 00:08:17 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-07:omniweb_51b1_fixes_issues_with_this_blog.html</guid></item><item><title>Doxygen 1.3.9 Released - With Extra Loving for Objective-C</title><link>http://toxicsoftware.com/doxygen_139_released_with_extra_loving_for_objective_c.html</link><description>&lt;p&gt;I&amp;#8217;m glad I can finally abandon Apple&amp;#8217;s &lt;a href="http://developer.apple.com/darwin/projects/headerdoc/" title="HeaderDoc"&gt;HeaderDoc&lt;/a&gt; and use the &lt;em&gt;far&lt;/em&gt; more sophisticated Doxygen. &lt;a href="http://darwinports.opendarwin.org" title="DarwinPorts"&gt;DarwinPorts&lt;/a&gt; hasn&amp;#8217;t updated the port file to 1.3.9 yet but it&amp;#8217;s trivial to edit the dport file yourself (don&amp;#8217;t forget to update the md5 checksum!) or to just use the &lt;a href="ftp://ftp.stack.nl/pub/users/dimitri/Doxygen-1.3.9.dmg" title="GUI Tool"&gt;&lt;span class="caps"&gt;GUI&lt;/span&gt; Tool&lt;/a&gt; for the time&amp;nbsp;being.&lt;/p&gt;
&lt;p&gt;Update. DarwinPorts have updated their repostory&amp;nbsp;now.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 06 Oct 2004 21:07:29 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-06:doxygen_139_released_with_extra_loving_for_objective_c.html</guid></item><item><title>Mini TextMate review</title><link>http://toxicsoftware.com/mini_textmate_review.html</link><description>&lt;p&gt;&lt;a href="http://macromates.com"&gt;Macromates&lt;/a&gt; have just released a text editor they&amp;#8217;re claiming is a bit of a &lt;a href="http://barebones.com"&gt;BBEdit&lt;/a&gt; killer. I&amp;#8217;ve been using it all morning and here is my list of what I consider its pluses and&amp;nbsp;minuses.&lt;/p&gt;
&lt;p&gt;Pluses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tips of the Day are always&amp;nbsp;handy.&lt;/li&gt;
&lt;li&gt;Bookmarks are&amp;nbsp;nice&lt;/li&gt;
&lt;li&gt;Integrates with system spell&amp;nbsp;checker&lt;/li&gt;
&lt;li&gt;The &amp;#8220;Filter Through Command&amp;#8221; feature is&amp;nbsp;awesome.&lt;/li&gt;
&lt;li&gt;Move selection menu is&amp;nbsp;useful.&lt;/li&gt;
&lt;li&gt;Auto quote and auto brackets are nice (but how do I turn them&amp;nbsp;off?)&lt;/li&gt;
&lt;li&gt;Folding is nice (but why aren&amp;#8217;t all &lt;span class="caps"&gt;HTML&lt;/span&gt; tags&amp;nbsp;foldable?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Minuses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initial window too&amp;nbsp;bare&lt;/li&gt;
&lt;li&gt;Can&amp;#8217;t see&amp;nbsp;invisibles&lt;/li&gt;
&lt;li&gt;Doesn&amp;#8217;t remember regular&amp;nbsp;expressions&lt;/li&gt;
&lt;li&gt;Wasted Menu Items (e.g. Anti-alias text does not need to be a&amp;nbsp;menu)&lt;/li&gt;
&lt;li&gt;Line to show where the column wraps is almost&amp;nbsp;invisible&lt;/li&gt;
&lt;li&gt;Items highlighted in the &amp;#8220;Change&amp;#8221; menu when nothing is&amp;nbsp;selected&lt;/li&gt;
&lt;li&gt;Odd menu distribution (insert closing tab in automation&amp;nbsp;menu)&lt;/li&gt;
&lt;li&gt;Compile menu item should be inactive for .txt&amp;nbsp;files.&lt;/li&gt;
&lt;li&gt;Command editor doesn&amp;#8217;t detect conflicting&amp;nbsp;keystrokes&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Almost impossible to create a &amp;#8216;Run&amp;#8217;&amp;nbsp;command&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Need to manually chmod 755 the&amp;nbsp;file&lt;/li&gt;
&lt;li&gt;File needs to be&amp;nbsp;saved&lt;/li&gt;
&lt;li&gt;Needs shebang&amp;nbsp;line&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Does not handle large files (will cause &lt;span class="caps"&gt;1GB&lt;/span&gt; system to suffer if loading a &lt;span class="caps"&gt;640MB&lt;/span&gt;&amp;nbsp;file)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Sticky settings can get annoying when there are no per file (or file type)&amp;nbsp;preferences.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No plug-in&amp;nbsp;support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plug-ins would allow third party developers to add in an interactive console window (which would be great for developing command line python&amp;nbsp;tools).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release Notes are not read-only and open in an edittable text&amp;nbsp;window!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;What is &amp;#8220;Freehanded Edit&amp;#8221;? Why is there no contextual help for it? Why does searching for it in the help file not produce any&amp;nbsp;hits?&lt;/li&gt;
&lt;li&gt;No &amp;#8220;Replace and find next&amp;#8221; menu item&amp;nbsp;(&lt;span class="caps"&gt;ARGH&lt;/span&gt;!)&lt;/li&gt;
&lt;li&gt;Cannot use regular expression groups in find and replace (forced to edit this file in BBEdit to fix&amp;nbsp;that!)&lt;/li&gt;
&lt;li&gt;Can&amp;#8217;t get folding to with html and body&amp;nbsp;tags!&lt;/li&gt;
&lt;li&gt;Auto indent upon hitting return doesn&amp;#8217;t always&amp;nbsp;work&lt;/li&gt;
&lt;li&gt;How do I change the line&amp;nbsp;endings?&lt;/li&gt;
&lt;li&gt;No built-in support for&amp;nbsp;tidy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Summary: I&amp;#8217;m keeping BBEdit&amp;nbsp;8&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mjtsai.com/blog/2004/10/06/textmate-10/"&gt;http://mjtsai.com/blog/2004/10/06/textmate-10/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://2lmc.org/spool/id/4577"&gt;http://2lmc.org/spool/id/4577&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://the.taoofmac.com/space/blog/2004-10-06"&gt;http://the.taoofmac.com/space/blog/2004-10-06&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://www.43folders.com/2004/10/textmate_parkin.html&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 06 Oct 2004 20:02:24 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-06:mini_textmate_review.html</guid></item><item><title>subversion 1.1 released</title><link>http://toxicsoftware.com/subversion_11_released.html</link><description>&lt;p&gt;&lt;a href="http://subversion.tigris.org/_1.1_releasenotes.html" title="subversion 1.1"&gt;subversion 1.1&lt;/a&gt; was released last week. &lt;a href="http://darwinports.opendarwin.org" title="Darwinports"&gt;Darwinports&lt;/a&gt; has already been updated for the new version. I&amp;#8217;ve just compiled and installed it on my client machine, in a day or two I&amp;#8217;ll upgrade my server (1.0.x and 1.1 are fully compatible) and then think updating converting my repository to the new fsfs&amp;nbsp;type.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 05 Oct 2004 18:23:51 -0700</pubDate><guid>tag:toxicsoftware.com,2004-10-05:subversion_11_released.html</guid></item><item><title>Using a password to run shell scripts as root</title><link>http://toxicsoftware.com/using_a_password_to_run_shell_scripts_as_root.html</link><description>&lt;p&gt;Here&amp;#8217;s a little shell script to allow you to run the script as root without having to manually sudo it or set the setuid flag on the file. The script will prompt for your password and the running will user will need to be in the sudoers list (basically any Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X admin user). Make sure the file is executable&amp;nbsp;too. &lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$&lt;span class="caps"&gt;USER&lt;/span&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;I am root! Put your root script here!&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;osascript -e &lt;span class="s2"&gt;&amp;quot;do shell script \&amp;quot;$0\&amp;quot; administrator privileges true altering line endings false&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 30 Sep 2004 00:10:48 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-30:using_a_password_to_run_shell_scripts_as_root.html</guid></item><item><title>iRoster 1.0b11 Saves the Day</title><link>http://toxicsoftware.com/iroster_10b11_saves_the_day.html</link><description>&lt;p&gt;Turns out that one of &lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster&amp;#8217;s&lt;/a&gt; embedded frameworks was left linking to libSaturn (part of &lt;a href="http://developer.apple.com/tools/performance/" title="CHUD"&gt;&lt;span class="caps"&gt;CHUD&lt;/span&gt;&lt;/a&gt;). Anyone without &lt;span class="caps"&gt;CHUD&lt;/span&gt; installed (i.e. most non-developers) will not have been able to launch iRoster. I&amp;#8217;ve fixed it and posted a new version. There are no differences between 1.0b11 and 1.0b10 beyond this one&amp;nbsp;fix.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;ll teach me for testing iRoster on boxes I also do development&amp;nbsp;on.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 28 Sep 2004 23:21:45 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-28:iroster_10b11_saves_the_day.html</guid></item><item><title>iRoster 1.0b10 Released</title><link>http://toxicsoftware.com/iroster_10b10_released.html</link><description>&lt;p&gt;[&lt;img alt="" src="/uploads/iRoster_200x200.png" /&gt;][]&lt;/p&gt;
&lt;p&gt;After nine months iRoster 1.0b10 is finally&amp;nbsp;available.&lt;/p&gt;
&lt;p&gt;Bug fix and general spring cleaning&amp;nbsp;release.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iRoster now supports over 170 Rendezvous&amp;nbsp;services.&lt;/li&gt;
&lt;li&gt;A simple browser window has been added to&amp;nbsp;iRoster.&lt;/li&gt;
&lt;li&gt;Browsing and publishing of services can now be controlled via the Rendezvous&amp;nbsp;Menu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you were running previous versions of iRoster then your preferences will have been reset. This due to a major change in the preferences file structure. Apologies for any inconvenience&amp;nbsp;caused.&lt;/p&gt;
&lt;p&gt;Full Change&amp;nbsp;List:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Fix] Fixed bug that was preventing iRoster from finding services under 10.3 (and possibly 10.2) if the user had not entered an email address into an InternetConfig supporting application.&amp;nbsp;(#&lt;span class="caps"&gt;IR014&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Big clean up of iRoster&amp;#8217;s support&amp;nbsp;frameworks.&lt;/li&gt;
&lt;li&gt;[Feature] iRoster probably won&amp;#8217;t run under 10.2 anymore. Not sure there&amp;#8217;s much I can do about that - but with 10.4 just around the corner I&amp;#8217;m not going to lose&amp;nbsp;sleep.&lt;/li&gt;
&lt;li&gt;[Fix] Updated build system for&amp;nbsp;subversion.&lt;/li&gt;
&lt;li&gt;[Fix] Updated for for Panther&amp;nbsp;10.3.5&lt;/li&gt;
&lt;li&gt;[Fix] Updated for XCode&amp;nbsp;1.5&lt;/li&gt;
&lt;li&gt;[Fix] Updated for G5 and AlBooks&amp;nbsp;rev/2&lt;/li&gt;
&lt;li&gt;[Fix] Updated preferences dialog. Should now be a lot easier to&amp;nbsp;use.&lt;/li&gt;
&lt;li&gt;[Fix] Updated default list of&amp;nbsp;services.&lt;/li&gt;
&lt;li&gt;[Fix] Updated packaging script to use subversion instead of&amp;nbsp;cvs.&lt;/li&gt;
&lt;li&gt;[Misc] Now requires Mac &lt;span class="caps"&gt;OS&lt;/span&gt; 10.3 (&amp;#8220;Panther&amp;#8221;) or&amp;nbsp;higher.&lt;/li&gt;
&lt;li&gt;[Feature] Added ability to turn advertising and browsing on and off from the Rendezvous&amp;nbsp;menu.&lt;/li&gt;
&lt;li&gt;[Fix] Fixed bug with version check&amp;nbsp;dates.&lt;/li&gt;
&lt;li&gt;[Feature] Added support for over 170 Rendezous&amp;nbsp;services.&lt;/li&gt;
&lt;li&gt;[Feature] Added experimental browser window (see the Window&amp;nbsp;menu).&lt;/li&gt;
&lt;li&gt;[Fix] Removed speech synth (&amp;#8220;Announce&amp;#8221;) script from all default&amp;nbsp;services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[&lt;img alt="" src="/uploads/iRoster_200x200.png" /&gt;]:&amp;nbsp;http://toxicsoftware.com/iroster.html&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 28 Sep 2004 20:47:21 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-28:iroster_10b10_released.html</guid></item><item><title>Blog pages look a lot prettier now.</title><link>http://toxicsoftware.com/blog_pages_look_a_lot_prettier_now.html</link><description>&lt;p&gt;As you can tell if you were browsing this page instead of reading it in your aggregator the blog looks a lot prettier. Thanks to http://www.bryanbell.com/ for the design. I still have to tidy up the &lt;span class="caps"&gt;CSS&lt;/span&gt; somewhat (and fix the background image repeat in OmniWeb) and more importantly apply this template to the rest of the site. This is the first time that toxicsoftware.com has looked rather purty in a&amp;nbsp;while.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 27 Sep 2004 19:37:56 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-27:blog_pages_look_a_lot_prettier_now.html</guid></item><item><title>Subversion Repository Corrupted Again</title><link>http://toxicsoftware.com/subversion_repository_corrupted_again.html</link><description>&lt;p&gt;I switched to &lt;a href="http://subversion.tigris.org" title="subversion"&gt;subversion&lt;/a&gt; from cvs for version control about 6 months ago. On the whole I&amp;#8217;m very happy with subversion except for one&amp;nbsp;thing&amp;#8230;&lt;/p&gt;
&lt;p&gt;If the machine hosting subversion (which is actually also my development laptop) kernel panics or loses power or is force rebooted my subversion repository will get corrupted. So badly corrupted in fact that &amp;#8216;admin recover&amp;#8217; will completely fail to repair it. I&amp;#8217;ve been keeping regular backups (using &amp;#8216;admin dump&amp;#8217;) to keep snap shots of my repositories but it turns out that incremental dumps are not very reliable. About a week or two ago I lost my entire repository including&amp;nbsp;backups.&lt;/p&gt;
&lt;p&gt;Losing a repository isn&amp;#8217;t the end of the world for me - I&amp;#8217;m just a one man band and don&amp;#8217;t need to track changes between multiple developers. I can quickly re-import my working directory into a new subversion repository. It is a pain in the neck and one I never had when I used cvs. I also don&amp;#8217;t understand how the corruption happens - if it happened during a operation I&amp;#8217;d understand it more - and its not like I&amp;#8217;m running a subversion server - I&amp;#8217;m just directly accessing my repository using the &amp;#8216;file&amp;#8217;&amp;nbsp;&lt;span class="caps"&gt;URL&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;So now I&amp;#8217;m moving my subversion repository off of my development machine and onto my Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X server (which has a battery backup). I&amp;#8217;m now willing to put up with the slowness in access times (the server is hosting behind a cable modem) to trade off the inconvenience of repository&amp;nbsp;corruption.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 27 Sep 2004 18:49:09 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-27:subversion_repository_corrupted_again.html</guid></item><item><title>NetNewsWire Save Bookmark In Omniweb AppleScript</title><link>http://toxicsoftware.com/netnewswire_save_bookmark_in_omniweb_applescript.html</link><description>&lt;p&gt;&lt;a href="http://ranchero.com/netnewswire/"&gt;NetNewsWire 2&lt;/a&gt;s embedded browser is better than I thought and I&amp;#8217;m using it constantly (one great feature is that it saves tabs upon quit and restores them upon launch). But there&amp;#8217;s no quick way of bookmarking a site you&amp;#8217;re viewing in &lt;span class="caps"&gt;NNW&lt;/span&gt; with your favourite browser. So here&amp;#8217;s a quick and cheerful AppleScript to save the page you&amp;#8217;re currently viewing in &lt;a href="http://ranchero.com/netnewswire/"&gt;NetNewsWire 2&lt;/a&gt; as a book mark in &lt;a href="http://www.omnigroup.com/applications/omniweb/"&gt;OmniWeb&lt;/a&gt;. Download &lt;a href="/uploads/SaveBookmarkInOmniweb.scpt"&gt;SaveBookmarkInOmniweb.scpt&lt;/a&gt; and drop into NetNewsWire&amp;#8217;s Scripts&amp;nbsp;folder. &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;NetNewsWire&lt;/span&gt;&amp;quot;
     &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;selected&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="n"&gt;based&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AppleScript&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;based&lt;/span&gt;
     &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theIndex&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;selected&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; 1
     &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theURLs&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;URLs&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;tabs&lt;/span&gt;
     &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theBookmarkAddress&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="n"&gt;theIndex&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;theURLs&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theReply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="n"&gt;dialog&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;Enter&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &amp;quot; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;theBookmarkAddress&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="n"&gt;theBookmarkAddress&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theBookmarkName&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;theReply&lt;/span&gt;

&lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &amp;quot;&lt;span class="n"&gt;OmniWeb&lt;/span&gt;&amp;quot;
     &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theBookmarksDocument&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="n"&gt;bookmarks&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;
     &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theProperties&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;theBookmarkName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;theBookmarkAddress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;theNewBookmark&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;bookmark&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="k"&gt;properties&lt;/span&gt; &lt;span class="n"&gt;theProperties&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;theBookmarksDocument&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 25 Sep 2004 08:04:16 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-25:netnewswire_save_bookmark_in_omniweb_applescript.html</guid></item><item><title>Googling for iRoster</title><link>http://toxicsoftware.com/googling_for_iroster.html</link><description>&lt;p&gt;I googled for &lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster&lt;/a&gt; just now because I&amp;#8217;m a little bit bored. Boy did I get a weird &lt;a href="http://kde-look.org/content/show.php?content=16032"&gt;hit&lt;/a&gt;. Just over two weeks ago someone decided to turn the iRoster icon into a wallpaper for &lt;a href="http://kde.org" title="KDE"&gt;&lt;span class="caps"&gt;KDE&lt;/span&gt;&lt;/a&gt;. Um ok. It sure is a purty icon (thanks to http://iconizer.com/) but I&amp;#8217;m not sure even I would want it as my desktop&amp;nbsp;picture.&lt;/p&gt;
&lt;p&gt;That reminds me - a new release of iRoster will be made available this weekend - some pretty major changes have been&amp;nbsp;made.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 25 Sep 2004 06:48:05 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-25:googling_for_iroster.html</guid></item><item><title>Blog Updates and EE Info</title><link>http://toxicsoftware.com/blog_updates_and_ee_info.html</link><description>&lt;p&gt;I&amp;#8217;ve been updating this blog a little - fixing the templates and making sure each page now works. Under ExpressionEngine 1.0 it was almost impossible (see http://www.pmachine.com/forum/threads.php?id=16466_0_26_0_C) to mix &lt;span class="caps"&gt;PHP&lt;/span&gt; and &lt;span class="caps"&gt;EE&lt;/span&gt; generated pages by embedding the &lt;span class="caps"&gt;EE&lt;/span&gt; pages into normal &lt;span class="caps"&gt;PHP&lt;/span&gt;. I&amp;#8217;m wondering it it&amp;#8217;s possible&amp;nbsp;now?&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Sep 2004 22:49:14 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-24:blog_updates_and_ee_info.html</guid></item><item><title>WebKit views in Transparent Windows</title><link>http://toxicsoftware.com/webkit_views_in_transparent_windows.html</link><description>&lt;p&gt;I&amp;#8217;m trying to embed a Cocoa WebView into a window that has transparent elements. As you can &lt;a href="/uploads/TransparentWebKit.jpg"&gt;see here&lt;/a&gt; &lt;em&gt;(pop-up)&lt;/em&gt; the results are not very encouraging. I believe the WebKit in Tiger &lt;em&gt;might&lt;/em&gt; be able to handle this gracefully. I&amp;#8217;ll have to find&amp;nbsp;out.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Sep 2004 19:21:17 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-24:webkit_views_in_transparent_windows.html</guid></item><item><title>BBEdit 8.0.1 Out</title><link>http://toxicsoftware.com/bbedit_801_out.html</link><description>&lt;p&gt;&lt;a href="http://www.barebones.com/support/bbedit/current_notes.shtml"&gt;BBEdit 8.0.1&lt;/a&gt; is out and fixes at least one extremely important&amp;nbsp;bug:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When &amp;#8220;Search Invisible Folders&amp;#8221; is turned off for multi-file searching, folders whose names begin with a period (.) are now&amp;nbsp;skipped.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately it still seems to be impossible to script the execution of the new BBEdit Text Factories (which unfortunately makes them&amp;nbsp;semi-useless).&lt;/p&gt;
&lt;p&gt;More info here:&amp;nbsp;http://mjtsai.com/blog/2004/09/24/bbedit-801/&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Sep 2004 18:51:13 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-24:bbedit_801_out.html</guid></item><item><title>Some Important (and annoying) Software Updates</title><link>http://toxicsoftware.com/some_important_and_annoying_software_updates.html</link><description>&lt;p&gt;A new &lt;a href="http://www.versiontracker.com/dyn/moreinfo/macosx/24474" title="release"&gt;version&lt;/a&gt; of &lt;a href="http://www.skype.com" title="Skype"&gt;Skype&lt;/a&gt; was released today. It&amp;#8217;s really good to see them taking the Mac so&amp;nbsp;seriously.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.versiontracker.com/dyn/moreinfo/macosx/23238" title="Stattoo 1.1"&gt;Stattoo 1.1&lt;/a&gt; was released today with a bunch of tweaks. I liked Stattoo a lot when I tested the 1.0 version but not quite enough to register it before the shareware test period expired. But now that version 1.1 is out my shareware test period is still expired - so I can&amp;#8217;t test the new version! Of course I could probably delete the Stattoo preferences and hope the developer wasn&amp;#8217;t trying to be too clever - but the point is I shouldn&amp;#8217;t have to. A call to &lt;a href="http://stevenf.com/mt/archives/000632.php"&gt;developers&lt;/a&gt; - every time you release a point version you might want to consider resetting the the shareware period countdown - you could be losing sales if you&amp;nbsp;don&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.versiontracker.com/dyn/moreinfo/macosx/19749" title="Missing Sync 4.0.1"&gt;Missing Sync 4.0.1&lt;/a&gt; is out. While I semi-begrudge paying extra money to get my Sony Clie to sync to the mac at least now the guys at Mark/Space are adding value to the software (I really like the new &lt;a href="http://www.markspace.com/developers.html"&gt;Conduit &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt;). I just wish that they&amp;#8217;d fix the damn installer and stop it from quitting every damn application on my box and rebooting. Let me decide if I want to quit everything. Let me decide when I want to reboot after&amp;nbsp;installation.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Sep 2004 18:06:44 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-24:some_important_and_annoying_software_updates.html</guid></item><item><title>Mac OS X User Statistics</title><link>http://toxicsoftware.com/mac_os_x_user_statistics.html</link><description>&lt;p&gt;OmniGroup have put up a &lt;a href="http://update.omnigroup.com" title="great page"&gt;great page&lt;/a&gt; showing aggregate statistics of the users of their software update service. Interesting to see that there&amp;#8217;s a 12:1 ratio between 10.3 and 10.2&amp;nbsp;users.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Sep 2004 04:30:52 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-24:mac_os_x_user_statistics.html</guid></item><item><title>Watson’s Day in the Sun</title><link>http://toxicsoftware.com/watsons_day_in_the_sun.html</link><description>&lt;p&gt;Looks like &lt;a href="http://www.karelia.com/watson/" title="Watson"&gt;Watson&lt;/a&gt; isn&amp;#8217;t doing so well under &lt;a href="http://sun.com" title="Sun's"&gt;Sun&amp;#8217;s&lt;/a&gt; umbrella according to this &lt;a href="http://weblog.karelia.com/Watson/Watson_s_Life_Comin.html" title="post"&gt;post&lt;/a&gt;. I wonder if there is any talk about creating an Open Source alternative to Watson that is compatible with its&amp;nbsp;plug-ins?&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 24 Sep 2004 00:23:51 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-24:watsons_day_in_the_sun.html</guid></item><item><title>Finally an update to NetNewsWire</title><link>http://toxicsoftware.com/finally_an_update_to_netnewswire.html</link><description>&lt;p&gt;I&amp;#8217;ve been getting slightly annoyed with NetNewsWire 1.x recently and have been considering switching to another newer &lt;span class="caps"&gt;RSS&lt;/span&gt; aggregator. I was beginning to think that Brent had abandoned development. But lo and behold &lt;a href="http://ranchero.com/?comments=1&amp;amp;postid=907" title="a public beta of NetNewsWire"&gt;a public beta of NetNewsWire&lt;/a&gt;! Serendipitously I downloaded it an hour or so before the announcements made the usual Mac news sites. So far I&amp;#8217;m very impressed. This is one of the few apps in which an embedded WebKit browser works really&amp;nbsp;well.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 22 Sep 2004 05:11:06 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-22:finally_an_update_to_netnewswire.html</guid></item><item><title>Rawr-endezvous iRoster Clone</title><link>http://toxicsoftware.com/rawr_endezvous_iroster_clone.html</link><description>&lt;p&gt;&lt;a href="http://homepage.mac.com/jeremy_knope/C2068557085/E842360980/index.html" title="Rawr-endezvous"&gt;Rawr-endezvous&lt;/a&gt; is another Rendezvous menu in the dock program just like &lt;a href="http://toxicsoftware.com/iroster.html" title="iRoster"&gt;iRoster&lt;/a&gt;! (Also &lt;a href="http://haloscan.com/tb/taoofmac/Applications_Rawr_endezvous" title="mentioned"&gt;mentioned&lt;/a&gt; in passing on the Tao of Mac&amp;nbsp;blog).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 19 Sep 2004 05:50:47 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-19:rawr_endezvous_iroster_clone.html</guid></item><item><title>A better HFS+ aware rsync</title><link>http://toxicsoftware.com/better_hfsplus_rsync.html</link><description>&lt;p&gt;I came across this &lt;a href="http://lists.samba.org/archive/rsync/2004-September/010540.html" title="post"&gt;post&lt;/a&gt; on the rsync mailing list. Looks like someone has created a new version of rsync that understands &lt;span class="caps"&gt;HFS&lt;/span&gt;+ but can communicate with any other rsync server (i.e. unlike &lt;a href="http://www.macosxlabs.org/rsyncx/" title="rsynx"&gt;rsynx&lt;/a&gt; it isn&amp;#8217;t limited to talking only to Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X rsync servers). More information can be found &lt;a href="http://www.quesera.com/reynhout/misc/rsync+hfsmode/" title="here"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Definitely looks like alpha/beta quality software right now but I really hope the developer continues the&amp;nbsp;work.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 17 Sep 2004 21:50:35 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-17:better_hfsplus_rsync.html</guid></item><item><title>Textile</title><link>http://toxicsoftware.com/textile.html</link><description>&lt;p&gt;&lt;a href="http://www.textism.com/tools/textile/" title="Textile"&gt;A Humane Web Text&amp;nbsp;Generator&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 10 Sep 2004 21:35:19 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-10:textile.html</guid></item><item><title>Do my feeds validate?</title><link>http://toxicsoftware.com/do_my_feeds_validate.html</link><description>&lt;p&gt;&lt;a href="http://feedvalidator.org/check.cgi?url=http%3A%2F%2Ftoxicsoftware.com%2Fblog%2Findex.php%2Fweblog%2Frss_1.0%2F" title="RSS 1.0"&gt;&lt;span class="caps"&gt;RSS&lt;/span&gt;&amp;nbsp;1.0&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 10 Sep 2004 21:30:42 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-10:do_my_feeds_validate.html</guid></item><item><title>RSS &amp; Atom specifications</title><link>http://toxicsoftware.com/rss_atom_specifications.html</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://web.resource.org/rss/1.0/spec" title="RSS 1.0 specification"&gt;&lt;span class="caps"&gt;RSS&lt;/span&gt; 1.0&amp;nbsp;specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.law.harvard.edu/tech/rss" title="RSS 2.0 Specification"&gt;&lt;span class="caps"&gt;RSS&lt;/span&gt; 2.0&amp;nbsp;Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.atomenabled.org/developers/syndication/atom-format-spec.php" title="Atom Specification"&gt;Atom&amp;nbsp;Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feedvalidator.org" title="Feed Validator"&gt;Feed&amp;nbsp;Validator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 10 Sep 2004 21:25:37 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-10:rss_atom_specifications.html</guid></item><item><title>I hate HTML</title><link>http://toxicsoftware.com/i_hate_html.html</link><description>&lt;p&gt;As you can tell by the lack of polish to this site and the broken pages the website is undergoing some changes. Hopefully it&amp;#8217;ll be purty again this&amp;nbsp;weekend.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 10 Sep 2004 19:36:53 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-10:i_hate_html.html</guid></item><item><title>What’s happening?</title><link>http://toxicsoftware.com/whats_happening.html</link><description>&lt;p&gt;iRoster hasn&amp;#8217;t been updated since December. Well I should say I haven&amp;#8217;t released an update since December. I have made a lot of changes to the underlying source code, some changes specific to iRoster and some to the supporting Toxic frameworks. I might spend some time preparing the current iRoster source code for release. Or I might not. People are still using iRoster (based on the version checking logs that I keep) so who knows? If you&amp;#8217;re interested in continued iRoster releases drop me an email (or comment in this blog - I dare&amp;nbsp;ya!)&lt;/p&gt;
&lt;p&gt;Geode development has changed. Geode is now becoming two programs - only one of which resembles my original design for Geode (more or less). Yes it&amp;#8217;s still vapourware for now but I do work on it when I can. I can&amp;#8217;t say more right now though. Keep watching this space (both of&amp;nbsp;you).&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 10 Sep 2004 19:26:37 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-10:whats_happening.html</guid></item><item><title>Wow. I suck.</title><link>http://toxicsoftware.com/wow_i_suck.html</link><description>&lt;p&gt;I&amp;#8217;ve not update my site in quick some time. So long in fact that the guys who wrote &lt;a href="http://expressionengine.com" title="ExpressionEngine"&gt;ExpressionEngine&lt;/a&gt; have released version 1.1 already that fixes some of the problems I had with it originally. I&amp;#8217;ve upgraded this blog to version 1.1 so we&amp;#8217;ll see how it&amp;nbsp;works.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 10 Sep 2004 19:22:22 -0700</pubDate><guid>tag:toxicsoftware.com,2004-09-10:wow_i_suck.html</guid></item><item><title>Blog Update</title><link>http://toxicsoftware.com/blog_update.html</link><description>&lt;p&gt;What with all the &lt;a href="http://developers.slashdot.org/article.pl?sid=04/05/14/1314256"&gt;hullabaloo concerning MoveableType 3.0&lt;/a&gt; I thought it was time I looked at alternative blogging&amp;nbsp;engines.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://moveabletype.org"&gt;MoveableType&lt;/a&gt; has been annoying me for a while. Every time I upgrade the thing I have to tweak some files to make it work with my web host’s &lt;span class="caps"&gt;CGI&lt;/span&gt; wrappers. Installing &lt;span class="caps"&gt;MT&lt;/span&gt; plug-ins (to deal with the horrendous comment spam) wasn’t working for me. The template language was really getting on my nerves - it really conflicts with Golive’s idea of what a tag should look like. And last but not least the rebuild issue was slowly getting more and more&amp;nbsp;annoying&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.expressionengine.com"&gt;ExpressionEngine&lt;/a&gt; doesn’t seem to have any of these problems. It imported the &lt;span class="caps"&gt;MT&lt;/span&gt; data with only one slight &lt;a href="http://www.pmachine.com/forum/threads.php?id=16107_0_21_0_C"&gt;hiccup&lt;/a&gt;. The installation instructions and install scripts worked fine out of the box. &lt;span class="caps"&gt;EE&lt;/span&gt; has comment spam protection built-in. The tags used by the template system look like {this} (and won’t get confused as html tags) and last but not least it has no rebuild wait time. And of course it’s &lt;span class="caps"&gt;PHP&lt;/span&gt; not Perl, so I have some chance at least of being able to tweak it&amp;nbsp;myself.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 15 May 2004 20:16:23 -0700</pubDate><guid>tag:toxicsoftware.com,2004-05-15:blog_update.html</guid></item><item><title>Moved</title><link>http://toxicsoftware.com/moved.html</link><description>&lt;p&gt;I&amp;#8217;ve moved from Austin, &lt;span class="caps"&gt;TX&lt;/span&gt; to Blue Bell, &lt;span class="caps"&gt;PA&lt;/span&gt;. More on that&amp;nbsp;later.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 06 Mar 2004 00:23:38 -0800</pubDate><guid>tag:toxicsoftware.com,2004-03-06:moved.html</guid></item><item><title>Comment Spam</title><link>http://toxicsoftware.com/comment_spam.html</link><description>&lt;p&gt;Comment spam is really beginning to get annoying. Probably time to disable comments. Oh&amp;nbsp;well.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 27 Jan 2004 23:30:01 -0800</pubDate><guid>tag:toxicsoftware.com,2004-01-27:comment_spam.html</guid></item><item><title>#import</title><link>http://toxicsoftware.com/import_beep_beeph.html</link><description>&lt;p&gt;MacWorld was today. I didn&amp;#8217;t get to go. Some interesting new products of course - no need to comment on anything because its all been dealt with much better on other sites (although I will say that \$250 for a Mini iPod is way too&amp;nbsp;much).&lt;/p&gt;
&lt;p&gt;Apple has released the long awaited objective C &lt;a href="http://beepcore.org"&gt;&lt;span class="caps"&gt;BEEP&lt;/span&gt;&lt;/a&gt;&amp;nbsp;Framework!&lt;/p&gt;
&lt;p&gt;This is awesome. I hope Apple releases the framework as OpenSource and/or makes it a standard part of the &lt;span class="caps"&gt;OS&lt;/span&gt;. &lt;span class="caps"&gt;BEEP&lt;/span&gt; is a great protocol and making it a standard part of the &lt;span class="caps"&gt;OS&lt;/span&gt; would be&amp;nbsp;great!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 07 Jan 2004 05:18:30 -0800</pubDate><guid>tag:toxicsoftware.com,2004-01-07:import_beep_beeph.html</guid></item><item><title>GoLive 7 and XHTML templates</title><link>http://toxicsoftware.com/golive_7_and_xhtml_templates.html</link><description>&lt;p&gt;&lt;a href="http://groups.google.com/groups?hl=en&amp;amp;lr=&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;c2coff=1&amp;amp;safe=off&amp;amp;threadm=2ccdd30c.16%40webx.la2eafNXanI&amp;amp;rnum=1&amp;amp;prev=/groups?q=golive%2Bxhtml%2Bconvert%2Btemplate%2Bregion&amp;amp;hl=en&amp;amp;lr=&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8&amp;amp;c2coff=1&amp;amp;safe=off&amp;amp;selm=2ccdd30c.16%2540webx.la2eafNXanI&amp;amp;rnum=1"&gt;It turns out&lt;/a&gt; that Adobe GoLive 7 cannot cope too well with &lt;span class="caps"&gt;XHTML&lt;/span&gt; based templates. Talk about banging your head against a brick&amp;nbsp;wall.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 24 Dec 2003 05:39:03 -0800</pubDate><guid>tag:toxicsoftware.com,2003-12-24:golive_7_and_xhtml_templates.html</guid></item><item><title>Website Flux</title><link>http://toxicsoftware.com/website_flux.html</link><description>&lt;p&gt;The website/blog is in a state of flux while I try valiantly to maintain it. Please excuse the&amp;nbsp;mess.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 24 Dec 2003 05:36:29 -0800</pubDate><guid>tag:toxicsoftware.com,2003-12-24:website_flux.html</guid></item><item><title>iRoster 1.0?</title><link>http://toxicsoftware.com/iroster_10.html</link><description>&lt;p&gt;Will iRoster ever become a 1.0 product? Probably not. Will there be more beta versions?&amp;nbsp;Maybe.&lt;/p&gt;
&lt;p&gt;If you use iRoster and happy with it (and want it to leave beta) let me know! Either leave a comment in the blog or send me an email (see the contract page). Let me know your&amp;nbsp;thoughts.&lt;/p&gt;
&lt;p&gt;However I&amp;#8217;m currently considering a rewrite of iRoster that will add a tonne of new features. This version (lets call it iRoster 2 for now) would be 10.3 and up only and would have a bunch of new features that turn iRoster into something pretty&amp;nbsp;nifty!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 23 Dec 2003 19:22:23 -0800</pubDate><guid>tag:toxicsoftware.com,2003-12-23:iroster_10.html</guid></item><item><title>New iRoster Version</title><link>http://toxicsoftware.com/new_iroster_version.html</link><description>&lt;p&gt;Version 1.0b9 of iRoster is out. Yes another beta. It runs on Panther&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;Why the delay? The main reason was I was waiting for Apple to release XCode 1.1. XCode 1.0 had a bunch of bugs (esp. in the command line &amp;#8216;xcodebuild&amp;#8217; tool) that was really preventing me from creating a reproducable build. iRoster has been working on Panther for some time but I wasn&amp;#8217;t happy releasing this version until my build system was working&amp;nbsp;again.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 23 Dec 2003 19:20:43 -0800</pubDate><guid>tag:toxicsoftware.com,2003-12-23:new_iroster_version.html</guid></item><item><title>New Personal Category</title><link>http://toxicsoftware.com/new_personal_category.html</link><description>&lt;p&gt;As well as a new source code category I&amp;#8217;ve added a &amp;#8216;personal&amp;#8217; category for all my rants and raves (not that I have a heck of a lot to say but what the hell). By default items in the new categories won&amp;#8217;t make the front page so visit the &lt;a href="http://toxicsoftware.com"&gt;main blog page&lt;/a&gt;. There is also an &lt;a href="http://toxicsoftware.com/feed.html"&gt;&lt;span class="caps"&gt;XML&lt;/span&gt; link&lt;/a&gt; for your favourite &lt;a href="http://ranchero.com/netnewswire/"&gt;newsreader&lt;/a&gt;&amp;nbsp;application.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 27 Nov 2003 19:43:15 -0800</pubDate><guid>tag:toxicsoftware.com,2003-11-27:new_personal_category.html</guid></item><item><title>Cocoa: Fetching all attachments from an NSAttributedString</title><link>http://toxicsoftware.com/cocoa_fetching_all_attachments_from_an_nsattributedstring.html</link><description>&lt;p&gt;This code snippet is a category of NSAttributedString that shows how to fetch all attachments from the&amp;nbsp;string.&lt;/p&gt;
&lt;p&gt;Header:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;NSAttributedString&lt;/span&gt; &lt;span class="nl"&gt;(NSAttributedString_MoreExtensions)&lt;/span&gt;

&lt;span class="cm"&gt;/** &lt;/span&gt;
&lt;span class="cm"&gt; * @method allAttachments &lt;/span&gt;
&lt;span class="cm"&gt; * @abstract Fetchs all attachments from an NSAttributedString. &lt;/span&gt;
&lt;span class="cm"&gt; * @discussion This method searchs for NSAttachmentAttributeName attributes within the string instead of searching for NSAttachmentCharacter characters. &lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;allAttachments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Source:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;@implementation&lt;/span&gt; &lt;span class="nc"&gt;NSAttributedString&lt;/span&gt; &lt;span class="nl"&gt;(NSAttributedString_MoreExtensions)&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NSArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;allAttachments&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;NSMutableArray&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theAttachments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSMutableArray&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;NSRange&lt;/span&gt; &lt;span class="n"&gt;theStringRange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSMakeRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theStringRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;NSRange&lt;/span&gt; &lt;span class="n"&gt;theEffectiveRange&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;NSDictionary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theAttributes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt; &lt;span class="nl"&gt;attributesAtIndex:&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="nl"&gt;longestEffectiveRange:&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;theEffectiveRange&lt;/span&gt; &lt;span class="nl"&gt;inRange:&lt;/span&gt;&lt;span class="n"&gt;theStringRange&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;NSTextAttachment&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;theAttachment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theAttributes&lt;/span&gt; &lt;span class="nl"&gt;objectForKey:&lt;/span&gt;&lt;span class="n"&gt;NSAttachmentAttributeName&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theAttachment&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;&lt;span class="caps"&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;theAttachments&lt;/span&gt; &lt;span class="nl"&gt;addObject:&lt;/span&gt;&lt;span class="n"&gt;theAttachment&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theEffectiveRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;theEffectiveRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;theStringRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;theAttachments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 27 Nov 2003 18:57:41 -0800</pubDate><guid>tag:toxicsoftware.com,2003-11-27:cocoa_fetching_all_attachments_from_an_nsattributedstring.html</guid></item><item><title>New Source Code Section</title><link>http://toxicsoftware.com/new_source_code_section.html</link><description>&lt;p&gt;The toxicsoftware.com blog has a new section for source code snippets! I&amp;#8217;ll be adding any interesting Cocoa and/or Python code snippets that I come across or write. Enjoy! Visit the &lt;a href="http://toxicsoftware.com"&gt;main blog&amp;nbsp;page.&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 27 Nov 2003 18:56:34 -0800</pubDate><guid>tag:toxicsoftware.com,2003-11-27:new_source_code_section.html</guid></item><item><title>Website Updates</title><link>http://toxicsoftware.com/website_updates.html</link><description>&lt;p&gt;A few changes to the look and feel of the&amp;nbsp;website.&lt;/p&gt;
&lt;p&gt;Yes it&amp;#8217;s still not a work of art - but it&amp;#8217;s not an eyesore&amp;nbsp;now.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 17 Oct 2003 22:14:08 -0700</pubDate><guid>tag:toxicsoftware.com,2003-10-17:website_updates.html</guid></item><item><title>KeychainCache development</title><link>http://toxicsoftware.com/keychaincache_development.html</link><description>&lt;p&gt;The good news is that KeychainCache should &amp;#8220;just work&amp;#8221; on Panther. The bad news is that KeychainCache is unable to cache Safari&amp;#8217;s&amp;nbsp;Keychain.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve spent a couple of hours trying to get KeychainCache to work with Safari. Safari is kind of annoying in the way it uses the Keychain. It&amp;#8217;s almost impossible to keep the Keychain locked if you run Safari. So I did a little bit of exploring in gdb and I found out that it was using the &amp;#8216;SecKeychainFindGenericPassword&amp;#8217; &lt;span class="caps"&gt;API&lt;/span&gt; to access items on the Keychain (for at least some of the&amp;nbsp;items)&lt;/p&gt;
&lt;p&gt;But unfortunately Safari uses the &amp;#8216;extended&amp;#8217; modes of the Keychain &lt;span class="caps"&gt;API&lt;/span&gt; to access keychain items (for you programmers out there it uses the &amp;#8220;SecKeychainItemRef&amp;#8221; parameter of the &amp;#8220;SecKeychainFindGenericPassword&amp;#8221; function). I have no intention of supporting that mode of that &lt;span class="caps"&gt;API&lt;/span&gt;. It would require me to patch several functions just to get it all working - effectively I&amp;#8217;ll be mirroring a lot of the Keychain&amp;#8217;s functionality inside my &lt;span class="caps"&gt;APE&lt;/span&gt; module. That really is a lot of complexity I can do&amp;nbsp;without.&lt;/p&gt;
&lt;p&gt;So for now - KeychainCache cannot work with&amp;nbsp;Safari.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s like&amp;#8230; A&amp;nbsp;bummer.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 09 Oct 2003 20:25:50 -0700</pubDate><guid>tag:toxicsoftware.com,2003-10-09:keychaincache_development.html</guid></item><item><title>iRoster expiration?</title><link>http://toxicsoftware.com/iroster_expiration.html</link><description>&lt;p&gt;Yes. The expiration has yet again hit iRoster. iRoster 1.0b8 expired on Sept. 30th and no new version has been uploaded. The reason why is that I&amp;#8217;m testing a new version on Panther. Sorry for the&amp;nbsp;inconvenience.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 09 Oct 2003 20:13:13 -0700</pubDate><guid>tag:toxicsoftware.com,2003-10-09:iroster_expiration.html</guid></item><item><title>New iRoster this weekend</title><link>http://toxicsoftware.com/new_iroster_this_weekend.html</link><description>&lt;p&gt;New iRoster version adds a couple of user requested features and fixes a couple of bugs. Should be available this&amp;nbsp;weekend.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Fri, 27 Jun 2003 16:34:13 -0700</pubDate><guid>tag:toxicsoftware.com,2003-06-27:new_iroster_this_weekend.html</guid></item><item><title>New release coming today.</title><link>http://toxicsoftware.com/new_release_coming_today.html</link><description>&lt;p&gt;Development has been dead slow recently (blame the &lt;span class="caps"&gt;PC&lt;/span&gt; Wolfenstein&amp;nbsp;demo).&lt;/p&gt;
&lt;p&gt;There will be a new release later today that should fix a couple of the bigger issues. Will try to speed up development until 1.0 final is&amp;nbsp;released.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 21 May 2003 21:34:15 -0700</pubDate><guid>tag:toxicsoftware.com,2003-05-21:new_release_coming_today.html</guid></item><item><title>iRoster 1.0b6 is here!</title><link>http://toxicsoftware.com/iroster_10b6_is_here.html</link><description>&lt;p&gt;Hot on the heels of Apple&amp;#8217;s release of &lt;a href="http://www.apple.com/itunes/"&gt;iTunes 4&lt;/a&gt; comes iRoster 1.0b6. This version adds support for iTunes 4. Browse for and connect from your dock to other machines running iTunes&amp;nbsp;4!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 29 Apr 2003 00:20:17 -0700</pubDate><guid>tag:toxicsoftware.com,2003-04-29:iroster_10b6_is_here.html</guid></item><item><title>iRoster 1.0b5</title><link>http://toxicsoftware.com/iroster_10b5.html</link><description>&lt;p&gt;iRoster 1.0b5 was sneakily released yesterday. I didn&amp;#8217;t want to advertise this version mainly because it only fixed a small handful of bugs and there were no new real features. The main reason for releasing it was to advance the expiration&amp;nbsp;date.&lt;/p&gt;
&lt;p&gt;Interestingly both &lt;a href="http://macupdate.com"&gt;macupdate.com&lt;/a&gt; and &lt;a href="http://versiontracker.com"&gt;versiontracker.com&lt;/a&gt; both updated their databases with no prompting from&amp;nbsp;me.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 28 Apr 2003 19:02:22 -0700</pubDate><guid>tag:toxicsoftware.com,2003-04-28:iroster_10b5.html</guid></item><item><title>iRoster Expired?</title><link>http://toxicsoftware.com/iroster_expired.html</link><description>&lt;p&gt;The expiration date of iRoster 1.0b4 (April 22nd 2003) has been and gone and no new version has been released. Moving apartments has taken longer than I expected and I haven&amp;#8217;t had time to update iRoster. A new version (with a handful of bug fixes/new features) will be released by this&amp;nbsp;weekend.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Thu, 24 Apr 2003 18:25:23 -0700</pubDate><guid>tag:toxicsoftware.com,2003-04-24:iroster_expired.html</guid></item><item><title>Geode Development</title><link>http://toxicsoftware.com/geode_development.html</link><description>&lt;p&gt;Geode Development has&amp;nbsp;resumed.&lt;/p&gt;
&lt;p&gt;The current goal is to get Geode ready for a 0.1 alpha release. I&amp;#8217;ll be disabling some of the incomplete features and tidying up the &lt;span class="caps"&gt;UI&lt;/span&gt;. I&amp;#8217;ll also be doing a lot of testing to find the obvious&amp;nbsp;bugs.&lt;/p&gt;
&lt;p&gt;I know this software has been vapourware for a long time. And I apologise for that. Last night I solved one of the major roadblocks that has been blocking me for quite some time and now plan on continuing development in&amp;nbsp;earnest.&lt;/p&gt;
&lt;p&gt;I plan on developing iRoster and Geode together and interleaving releases. The first Geode release will be after the next iRoster release. iRoster and Geode share a lot of the same source code (the &amp;#8220;Toxic&amp;#8221; frameworks) so there is some benefit to working on both&amp;nbsp;concurrently.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 08 Apr 2003 21:47:01 -0700</pubDate><guid>tag:toxicsoftware.com,2003-04-08:geode_development.html</guid></item><item><title>Current Development</title><link>http://toxicsoftware.com/current_development.html</link><description>&lt;p&gt;Things are slowing down right now. Moving Apartments and switching ISPs. There wont be any &amp;#8220;big&amp;#8221; iRoster releases until the last half of&amp;nbsp;April.&lt;/p&gt;
&lt;p&gt;In other news attended the Austin Macintosh Programmers &lt;span class="caps"&gt;SIG&lt;/span&gt; meeting today. Lots of nice guys and a lot of interest in the Rendezvous&amp;nbsp;technology.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sun, 06 Apr 2003 04:49:16 -0700</pubDate><guid>tag:toxicsoftware.com,2003-04-06:current_development.html</guid></item><item><title>iRoster Roadmap</title><link>http://toxicsoftware.com/iroster_roadmap.html</link><description>&lt;p&gt;This is a rough guess of what the next few iRoster releases will look&amp;nbsp;like.&lt;/p&gt;
&lt;p&gt;1.0b5 will be made available within the next week. Apart from the normal bug fixes the main reason for the release will be to improve the documentation and to add lots of example Apple Scripts and perhaps a few new service&amp;nbsp;templates.&lt;/p&gt;
&lt;p&gt;1.0b6 will be a &lt;span class="caps"&gt;UI&lt;/span&gt; tidy up. The two tables within the preferences dialog will be organised better and possibly broken up into multiple &lt;span class="caps"&gt;UI&lt;/span&gt;&amp;nbsp;elements.&lt;/p&gt;
&lt;p&gt;1.0b7 will add a few new options for displaying the Net Services&amp;nbsp;menu.&lt;/p&gt;
&lt;p&gt;1.0&amp;nbsp;final?&lt;/p&gt;
&lt;p&gt;1.1 The next non-beta version will include a two tools for finding services on your network without having to know the Rendezvous type&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;1.2 &amp;#8220;Trigger&amp;#8221; scripts: iRoster would be able to advertise Rendezvous services based on the results of AppleScripts. For example an AppleScript would detect that you&amp;#8217;re running QuickTime broadcaster and automatically advertise a service for the QuickTime stream. I&amp;#8217;ll also be adding in code to allow iRoster to be scripted (e.g. &amp;#8220;tell application &amp;#8216;iRoster&amp;#8217; to advertise service &amp;#8216;my&amp;nbsp;service&amp;#8217;&amp;#8221;).&lt;/p&gt;
&lt;p&gt;1.3 This release will see the advertising code from iRoster isolated and packaged as a background daemon. iRoster will look and feel the same but will be able to advertise services even if iRoster isn&amp;#8217;t running or even if the user isn&amp;#8217;t logged&amp;nbsp;in!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 01 Apr 2003 19:26:30 -0800</pubDate><guid>tag:toxicsoftware.com,2003-04-01:iroster_roadmap.html</guid></item><item><title>iRoster 1.0b4 is out!</title><link>http://toxicsoftware.com/iroster_10b4_is_out.html</link><description>&lt;p&gt;&lt;a href="http://toxicsoftware.com/iroster.html"&gt;Get it while it&amp;#8217;s&amp;nbsp;hot.&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 01 Apr 2003 17:57:31 -0800</pubDate><guid>tag:toxicsoftware.com,2003-04-01:iroster_10b4_is_out.html</guid></item><item><title>Competition!</title><link>http://toxicsoftware.com/competition.html</link><description>&lt;p&gt;Two new Rendezvous based browsers/publishers were released today! The competition is certainly heating up. I&amp;#8217;m going to speed up my release schedule and get iRoster 1.0b4 out as soon as I&amp;nbsp;can!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 31 Mar 2003 21:58:33 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-31:competition.html</guid></item><item><title>When will iRoster final be released?</title><link>http://toxicsoftware.com/when_will_iroster_final_be_released.html</link><description>&lt;p&gt;iRoster is currently in public beta. I see this phase as a chance to add features to iRoster that I never anticipated when it was designed.&lt;br/&gt;The next beta (1.0b4) will be ready by the end of the week. After that I have some changes I want to make to the preferences dialog (the table view doesn&amp;#8217;t work well for the amount data of I&amp;#8217;m showing) which will take another&amp;nbsp;week.&lt;/p&gt;
&lt;p&gt;After that I&amp;#8217;ll just be fixing bugs/making improvements as I deem necessary. April will be a busy month for me (moving) so I estimate early May will be the earliest date for iRoster 1.0&amp;nbsp;final.&lt;/p&gt;
&lt;p&gt;The shareware fee for iRoster will be $10.00 and I plan on giving the user a 30 day trial before registration is needed with minimal/no nagging during that&amp;nbsp;period.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 31 Mar 2003 17:52:35 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-31:when_will_iroster_final_be_released.html</guid></item><item><title>Development Continues</title><link>http://toxicsoftware.com/development_continues.html</link><description>&lt;p&gt;Lots of progress made with iRoster 1.0b4 this&amp;nbsp;weekend.&lt;/p&gt;
&lt;p&gt;The major new feature, the execution of AppleScripts for service events is basically done. I&amp;#8217;m going to spend a few days fixing a few bugs and preparing for a release before Friday 4th April (when previous versions of iRoster&amp;nbsp;expire).&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;UPDATE&lt;/span&gt;. Things are going well with the bug fixes and I now hope to get a release ready for April&amp;nbsp;1st!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 31 Mar 2003 17:42:43 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-31:development_continues.html</guid></item><item><title>iRoster coming attractions</title><link>http://toxicsoftware.com/iroster_coming_attractions.html</link><description>&lt;p&gt;Since finishing iRoster 1.0b3 yesterday I have started work on adding a very cool new feature for 1.0b4.\
This new feature will allow you to attach AppleScripts to Rendezvous services and have the scripts execute upon certain events such as when services go online or offline and when the user selects a service in the&amp;nbsp;menu.&lt;/p&gt;
&lt;p&gt;With previous versions of iRoster I had to write Objective C code for every service for which I wished to handle selection. With 1.0b4 I&amp;#8217;ll be giving the user the ability to decide how to handle selection throught the user of AppleScripts. I&amp;#8217;ve already created a script that takes the information from a service and generates a &lt;span class="caps"&gt;URL&lt;/span&gt; and then launchs&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;This will allow you to add lots of cool user defined behavior to iRoster. Perhaps you could use iRoster to browse for people playing games of &lt;a href="http://homepage.mac.com/azc/iConquer/index.html"&gt;iConquer&lt;/a&gt; on your &lt;span class="caps"&gt;LAN&lt;/span&gt;. You could write and attach an AppleScript to iRoster that, upon selection, would automatically launch iConquer and join the&amp;nbsp;game.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 25 Mar 2003 19:23:28 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-25:iroster_coming_attractions.html</guid></item><item><title>iRoster 1.0b3</title><link>http://toxicsoftware.com/iroster_10b3.html</link><description>&lt;p&gt;iRoster 1.0b3 was released today. Just a bug fix release - I&amp;#8217;ll be putting the change history on the iRoster&amp;#8217;s page soon. Go on into the Downloads page and grab a&amp;nbsp;copy.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Tue, 25 Mar 2003 19:10:14 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-25:iroster_10b3.html</guid></item><item><title>iRoster 1.0b2 Released!</title><link>http://toxicsoftware.com/iroster_10b2_released.html</link><description>&lt;p&gt;Beta 2 of iRoster has just been released. Thanks to everyone who suggested&amp;nbsp;features.&lt;/p&gt;
&lt;p&gt;Among other improvements there&amp;#8217;s now a badge in the dock icon showing how many services are being broadcast on your network. There are a couple of new preferences. Lots of little cosmetic blemishs fixed. See the downloaded documentation for more&amp;nbsp;information.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 22 Mar 2003 07:52:15 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-22:iroster_10b2_released.html</guid></item><item><title>iRoster 1.0b2 coming soon!</title><link>http://toxicsoftware.com/iroster_10b2_coming_soon.html</link><description>&lt;p&gt;I&amp;#8217;ve received a reasonable amount of feedback concerning &lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster 1.0b1&lt;/a&gt;. I&amp;#8217;ve already added a handful of new features and hope to get a new release ready tonight. Watch this&amp;nbsp;space.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 22 Mar 2003 02:23:17 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-22:iroster_10b2_coming_soon.html</guid></item><item><title>iRoster 1.0b1 release!</title><link>http://toxicsoftware.com/iroster_10b1_release.html</link><description>&lt;p&gt;Late last night the first public beta release of iRoster was made available. You can download it here: &lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster 1.0b1&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Sat, 22 Mar 2003 01:46:19 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-22:iroster_10b1_release.html</guid></item><item><title>iRoster</title><link>http://toxicsoftware.com/iroster-0.html</link><description>&lt;p&gt;The last remaining show-stopper bug with &lt;a href="http://toxicsoftware.com/iroster.html"&gt;iRoster&lt;/a&gt; has been quashed. The first release is&amp;nbsp;imminent.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Wed, 19 Mar 2003 04:19:21 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-19:iroster-0.html</guid></item><item><title>Welcome</title><link>http://toxicsoftware.com/welcome.html</link><description>&lt;p&gt;Welcome to the new toxic software website. The site is currently under construction but there will be a lot more added&amp;nbsp;soon!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">schwa</dc:creator><pubDate>Mon, 17 Mar 2003 05:39:24 -0800</pubDate><guid>tag:toxicsoftware.com,2003-03-17:welcome.html</guid></item></channel></rss>