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

<channel>
	<title>toxicsoftware.com</title>
	<atom:link href="http://toxicsoftware.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://toxicsoftware.com</link>
	<description>RANDOMIZE USR 0</description>
	<lastBuildDate>Sun, 01 Aug 2010 17:49:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>I name that UIColor in three!</title>
		<link>http://toxicsoftware.com/uicolor-instrument/</link>
		<comments>http://toxicsoftware.com/uicolor-instrument/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 20:41:32 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Instruments]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iphone development]]></category>
		<category><![CDATA[iPhoneOS]]></category>
		<category><![CDATA[UIColor]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=483</guid>
		<description><![CDATA[You&#8217;re working on a custom iPhoneOS view and you want it to use colours from the standard iPhone OS colour palette. Your first impulse is to check the defined colours in UIInterface.h &#8211; but there are only a grand total &#8230; <a href="http://toxicsoftware.com/uicolor-instrument/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>You&#8217;re working on a custom iPhoneOS view and you want it to use colours from the standard iPhone OS colour palette. Your first impulse is to check the defined colours in UIInterface.h &#8211; 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 RGB value from the screen itself.</p>

<p>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&#8217;t easily be sure that a colour you sample directly off the screen uses the same colour profile as the original.</p>

<p>I decided instead to use Intruments to probe the application and find out exactly what RGBA 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&#8217;s section footer label) and then ran the application through Intruments.</p>

<p>After a little trial and error (and some help from <a href="http://twitter.com/eridius">Kevin Ballard</a> to work out exactly how to output the RGBA values) I had an Instrument that would display all parameters passed to [UIColor initWithRed:green:blue:alpha] (<a href="/uploads/Screen-shot-2010-07-28-at-16.29.21.png">Screenshot</a>)</p>

<p>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&#8217;re looking for (<a href="/uploads/Screen-shot-2010-07-28-at-16.29.01.png">screenshot</a>).</p>

<p>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 CG functions. It&#8217;s also pretty easy to use gdb to break on the relevant symbol and print out the parameters &#8211; however once you have this instrument in place it&#8217;s really quick and easy to run through an application and capture all colours. You can even export the colours into CSV file for easy manipulation.</p>

<p>You can download the Instrument <a href="/uploads/3433F2D0_2397_4AAD_AAE8_9362671FD43A.instrument">here</a>, copy it to <pre>~/Library/Application Support/Instruments/PlugIns/Instruments</pre> and then drag the instrument from Instruments Library into your workflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/uicolor-instrument/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I wouldn&#8217;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/</link>
		<comments>http://toxicsoftware.com/i-wouldnt-hire-an-iphone-developer-who-charges-less-than-999-95hour/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 03:50:53 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=464</guid>
		<description><![CDATA[If you followed the link from Mike Lee&#8217;s &#8220;motherfucker&#8221; blog to here, welcome! You&#8217;re probably looking for the iPhoneSWPro link. There you&#8217;ll be able to find out how to hire competent, professional, ego-free (for certain values of free) iPhone (and &#8230; <a href="http://toxicsoftware.com/i-wouldnt-hire-an-iphone-developer-who-charges-less-than-999-95hour/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you followed the link from Mike Lee&#8217;s &#8220;<a href="http://www.atomicwang.org/motherfucker/Index/Entries/2010/6/24_What_money_can_buy.html">motherfucker</a>&#8221; blog to here, welcome! You&#8217;re probably looking for the <a href="/iPhoneSWPro">iPhoneSWPro link</a>. There you&#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 $1000/hour).</p>

<p>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&#8217;t believe me? Just ask Mike.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/i-wouldnt-hire-an-iphone-developer-who-charges-less-than-999-95hour/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Add to Pinboard</title>
		<link>http://toxicsoftware.com/add-to-pinboard/</link>
		<comments>http://toxicsoftware.com/add-to-pinboard/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 15:12:37 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[pinboard]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=450</guid>
		<description><![CDATA[In my previous post I suggested adapting my Python script for use in a Snow Leopard service. I decided to quickly whip this up myself. So here is a (Snow Leopard only!) service that can add URLs to pinboard.in. Unzip &#8230; <a href="http://toxicsoftware.com/add-to-pinboard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://toxicsoftware.com/wordpress/uploads/Add%20to%20pinboard.zip">previous post</a> I suggested adapting my Python script for use in a Snow Leopard service. I decided to quickly whip this up myself. So <a href="http://toxicsoftware.com/wordpress/uploads/Add%20to%20pinboard.zip">here is</a> a (Snow Leopard only!) service that can add URLs to <a href="http://pinboard.in">pinboard.in</a>. Unzip the file and copy it to ~/Library/Services then run this little shell script to set up a keychain item for your pinboard account:</p>

<pre><code>#!/bin/sh

HOST=api.pinboard.in
read -p "Username: " USERNAME
read -p "Password: " -s PASSWORD
security add-internet-password -U -r http -s "$HOST" -a "$USERNAME" -w "$PASSWORD"
</code></pre>

<p>And the script also uses the <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup 3rd party</a> python module to extract the title of the webpage you&#8217;re linking to. You&#8217;ll need to install beautiful soup:</p>

<pre><code>sudo easy_install beautifulsoup
</code></pre>

<p>If you&#8217;ve correctly installed the service you can enable/disable it and assign it a keyboard shortcut from the Keyboard preference pane:</p>

<div style="text-align:center;"><a href="http://www.flickr.com/photos/61285556@N00/4192220957" title="View 'Screen shot 2009-12-17 at 10.09.36' on Flickr.com"><img border="0" width="100" alt="Screen shot 2009-12-17 at 10.09.36" src="http://farm5.static.flickr.com/4044/4192220957_32687ff498_t.jpg" height="91"/></a></div>

<p>When enabled you should be able to see an entry in the application&#8217;s service menu:</p>

<div style="text-align:center;"><a href="http://www.flickr.com/photos/61285556@N00/4192209095" title="View 'Screen shot 2009-12-17 at 10.03.06' on Flickr.com"><img border="0" width="100" alt="Screen shot 2009-12-17 at 10.03.06" src="http://farm3.static.flickr.com/2783/4192209095_7bf4b12223_t.jpg" height="51"/></a></div>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/add-to-pinboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webloc to Pinboard</title>
		<link>http://toxicsoftware.com/webloc-to-pinboard/</link>
		<comments>http://toxicsoftware.com/webloc-to-pinboard/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 14:34:40 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[hazel]]></category>
		<category><![CDATA[pinboard]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[webloc]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=445</guid>
		<description><![CDATA[If I want to keep a URL around for later I generally drag the URL from Safari&#8217;s URL bar onto the desktop. This creates an &#8220;internet clipping file&#8221; (with a .webloc file extension). These files are like little self contained &#8230; <a href="http://toxicsoftware.com/webloc-to-pinboard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If I want to keep a URL around for later I generally drag the URL from Safari&#8217;s URL bar onto the desktop. This creates an &#8220;internet clipping file&#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&#8217;re just ordinary files, you can manage them like any other file, store them in folders, copy them around, delete them, etc.</p>

<p>Eventually these clippings will get deleted or filed in a folder and forgotten. In the past I&#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&#8217;ve found online services such as <a href="http://delicious.com">delicious</a>, <a href="http://instapaper.com">instapaper</a> and now <a href="http://pinboard.in">pinboard.in</a> to be far superior to any desktop application.</p>

<p>But getting from an internet clipping on my desktop to an entry in an online bookmark manager usually involves a lot of manual labour.</p>

<p>I&#8217;ve found a great solution using <a href="http://www.noodlesoft.com/hazel.php">Hazel</a> and a custom Python script. I have a Hazel rule that finds files with a &#8220;.webloc&#8221; file extension on my desktop. The rule then runs a single python script to add the URL 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 seconds.</p>

<div style="text-align:center;"><a href="http://www.flickr.com/photos/61285556@N00/4192151805" title="View 'Screen shot 2009-12-17 at 09.12.35' on Flickr.com"><img border="0" width="100" alt="Screen shot 2009-12-17 at 09.12.35" src="http://farm3.static.flickr.com/2495/4192151805_d5b0ce0737_t.jpg" height="77"/></a></div>

<p>The python script is where all the magic happens:</p>

<pre><code>#!/usr/bin/python

import sys
import urllib
import urllib2
import re
import subprocess
import Foundation
from Carbon import File, Files, Res

def infoForWebloc(inPath):
    theDisplayName = Foundation.NSFileManager.defaultManager().displayNameAtPath_(inPath)
    resNum = Res.FSOpenResourceFile(inPath, File.FSGetResourceForkName(), Files.fsRdPerm)
    Res.UseResFile(resNum)
    theResource = Res.Get1Resource('url ', 256)
    theURLFromResource = theResource.data
    Res.CloseResFile(resNum)
    theData = Foundation.NSData.dataWithContentsOfFile_(inPath)
    thePropertyList = Foundation.NSPropertyListSerialization.propertyListWithData_options_format_error_(theData, 0, None, None)
    theURLFromData = thePropertyList['URL'] 
    return theDisplayName, theURLFromResource

def getAccount(inServer):
    theArguments = ['security', 'find-internet-password', '-s', inServer, '-g']
    thePipe = subprocess.Popen(theArguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    theOutput = thePipe.stdout.read()
    theMatch = re.search(r'"acct"&lt;blob&gt;="(.+)"', theOutput)
    theUsername = theMatch.groups()[0]
    theOutput = thePipe.stderr.read()
    theMatch = re.match(r'^password: "(.+)"$', theOutput)
    thePassword = theMatch.groups()[0]
    return theUsername, thePassword

def upload(inURL, inDescription):
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    top_level_url = "https://api.pinboard.in/v1"
    theUsername, thePassword = getAccount('api.pinboard.in')
    password_mgr.add_password(None, top_level_url, theUsername, thePassword)
    handler = urllib2.HTTPBasicAuthHandler(password_mgr)
    opener = urllib2.build_opener(handler)
    inURL = urllib.quote(inURL)
    inDescription = urllib.quote(inDescription)
    theURL = 'https://api.pinboard.in/v1/posts/add?url=%s&amp;shared=no&amp;replace=yes&amp;description=%s' % (inURL, inDescription)
    theResult = opener.open(theURL)

def main(args):
    for thePath in args:
        theDescription, theURL = infoForWebloc(thePath)
        upload(theURL, theDescription)

if __name__ == '__main__':
    main(sys.argv[1:])
</code></pre>

<p>This script reads the .webloc file to extract the URL (.webloc files store the URL in both the Carbon resource fork and in the data fork in a property list format, this script extracts the URL from both locations but only uses the URL from the resource fork.</p>

<p>Then script uploads the URL to pinboard.in via pinboard.in&#8217;s delicious style API. The script gets your pinboard.in username and password from your keychain. To add the username and password to your keychain you&#8217;ll want to run this little shell script.</p>

<pre><code>#!/bin/sh

HOST=api.pinboard.in
read -p "Username: " USERNAME
read -p "Password: " -s PASSWORD
security add-internet-password -U -r http -s "$HOST" -a "$USERNAME" -w "$PASSWORD"
</code></pre>

<p>You can download the Hazel rule <a href="http://toxicsoftware.com/wordpress/uploads/Desktop.hazelrules.zip">here</a>, but do remember to set up your pinboard.in keychain item before installing it.</p>

<p>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 service.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/webloc-to-pinboard/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Key-Value Observing Done Right (again)</title>
		<link>http://toxicsoftware.com/kvoblocks/</link>
		<comments>http://toxicsoftware.com/kvoblocks/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 15:36:49 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[blocks]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[KVO]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=417</guid>
		<description><![CDATA[Mike Ash posted a great article about problems with Cocoa&#8217;s Key Value Observing and provided a better set of classes to work with KVO: MAKVONotificationCenter. I&#8217;ve been using Mike&#8217;s code in various projects over the last few months and am &#8230; <a href="http://toxicsoftware.com/kvoblocks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mikeash.com/">Mike Ash</a> posted a <a href="http://www.mikeash.com/?page=pyblog/key-value-observing-done-right.html">great article</a> about problems with Cocoa&#8217;s Key Value Observing and provided a better set of classes to work with KVO: <a href="http://www.mikeash.com/svn/MAKVONotificationCenter/">MAKVONotificationCenter</a>. I&#8217;ve been using Mike&#8217;s code in various projects over the last few months and am a big fan.</p>

<p>When I <a href="http://twitter.com/moodevdiary/">started development</a> on <a href="http://bitbucket.org/schwa/moo/">MOO</a> I knew I wanted the project to use Mike&#8217;s code but I also wanted to take advantage of Cocoa&#8217;s Garbage Collection and Snow Leopard&#8217;s blocks. I originally tried to retrofit MAKVONotificationCenter to work with GC and with blocks but it rapidly become a very difficult task. So I wrote my own KVO Notification class that was fully GC compatible and worked purely with blocks (no delegate methods at all).</p>

<p>Jumping as quickly into the code as I can, here is an example showing a KVO block that modifies a CoreAnimation layer&#8217;s position in responses to changes in the application&#8217;s model (example code adapted from MOO&#8217;s <a href="http://bitbucket.org/schwa/moo/src/9779be0cd8f8/Source/CGameView/CGameMapView.m">CGameMapView.m</a>):</p>

<pre><code>void *theBlock = ^(NSString *keyPath, CALayer *self, NSDictionary *change, id identifier)
    {
    self.position = CGPointMake(self.viewPoint.scale * self.modelObject.position.x, self.viewPoint.scale * self.modelObject.position.y);
    };

CALayer *theLayer = ...;
[theLayer addKVOBlock:theBlock forKeyPath:@"modelObject.position" options:0 identifier:@"KVO_IDENTIFIER_1"];
[theLayer addKVOBlock:theBlock forKeyPath:@"viewPoint.scale" options:0 identifier:@"KVO_IDENTIFIER_2"];
</code></pre>

<p>I find this, blocks based, style of KVO 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 KVO Notification Center.</p>

<p>Clean-up (unregistration) is also straight-forward, although with Garbage Collection enabled applications this isn&#8217;t usually even necessary.</p>

<p>If you&#8217;re sharp-eyed you might notice that I&#8217;ve called one of the block parameters &#8220;self&#8221;. By providing my own &#8216;self&#8217; parameter I am obscuring and prevent access to the parent method&#8217;s &#8216;self&#8217; parameter. The reason I am doing this is because I&#8217;ve found it is very common to register for notifications for &#8220;self&#8221; and unless you&#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&#8217;s self and make sure these kind of retains cycles don&#8217;t happen.</p>

<p>The code is released under the BSD License on bitbucket (mercurial): <a href="http://bitbucket.org/schwa/kvoblocknotificationcenter/">http://bitbucket.org/schwa/kvoblocknotificationcenter/</a>. You&#8217;ll obviously need use this on Snow Leopard or possibly with Landon Fuller&#8217;s <a href="http://code.google.com/p/plblocks/">plblocks toolchain</a> (although I haven&#8217;t tried that myself).</p>

<p>(Update: I&#8217;ve posted <a href="http://www.flickr.com/photos/jwight/3826876252/?likes_hd=1">a movie on flickr</a> of KVO Block Observing in action)
(update 2: Joachim Bengtsson has posted a great <a href="http://thirdcog.eu/pwcblocks/">HOWTO guide</a> for blocks. It also goes into some detail about the &#8220;self&#8221; problem I mentioned and a better solution (__block variables)</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/kvoblocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>24 Hours with the Android Dev Phone 1&#8482;</title>
		<link>http://toxicsoftware.com/24g1/</link>
		<comments>http://toxicsoftware.com/24g1/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 14:42:15 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[G1]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=400</guid>
		<description><![CDATA[Unboxing so not porn worthy. Developer unit came in a plain white cardboard box. Initially thought it was smaller than my iPhone 3G. Then I realised I have a 3rd-party case on my 3G. I&#8217;d forgotten how slim the iPhone &#8230; <a href="http://toxicsoftware.com/24g1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<ul>
<li>Unboxing so not porn worthy. Developer unit came in a plain white cardboard box.</li>
<li>Initially thought it was smaller than my iPhone 3G. Then I realised I have a 3rd-party case on my 3G. I&#8217;d forgotten how slim the iPhone really was. G1 feels like a brick in comparison.</li>
<li>Slightly rubberised feel to it is good.</li>
<li>OMG NEW PHONE SMELL! (After about 18 hours the smell has all but gone)</li>
<li>Getting the rear case on to insert the battery and SIM card is a major pain.</li>
<li>The Mini USB and MicroSD covers are almost impossible to open if you have no fingernails.</li>
<li>Mini USB for charging and syncing is a huge win. I hate the iPhone/iPod USB cable with a passion.</li>
<li>No mini headphone jack &#8211; headphone has a mini USB plug on the end. WTF people?</li>
<li>I was led to believe the phone would feel cheap and poorly made. While it isn&#8217;t iPhone quality it feels pretty sturdy considering it has a flip screen.</li>
<li>AC Adaptor is just a generic brick. Apple spoils us with their industrial design.</li>
<li>Activation didn&#8217;t work out of the box. I failed to find a cardboard insert with the phone describing how to configure the phone&#8217;s APN for activation (did google it myself though).</li>
<li>Once activated it somehow managed to fetch all my contacts. Which surprised me because I didn&#8217;t think I stored any contact information on Google. Need to investigate.</li>
<li>The camera is so much better than the iPhone&#8217;s camera it is not even funny.</li>
<li>Built-in digital compass is really nice.</li>
<li>Hate hate hate hate the keyboard. At least it is backlit. I like the &#8220;fire and forget&#8221; autocompletion on the iPhone. I love having a keyboard while the screen is in portrait mode.</li>
<li>I hate flipping out that damned keyboard every 2 minutes.</li>
<li>90% of the time when I flip out the keyboard I accidentally mash the volume control by mistake.</li>
<li>Volume controls are too soft and will be too prone to being accidentally mashed anyway.</li>
<li>Not found any use of multitouch yet &#8211; but doesn&#8217;t mean it isn&#8217;t there.</li>
<li>Only found a single app using the accelerometer (3rd party Texas Hold&#8217;em game). Every other app bases screen orientation on whether or not the keyboard is flipped out.</li>
<li>Turning off the G1 is silly &#8211; 4 or 5 steps</li>
<li>Dedicated camera button is silly again &#8211; and not re-mappable AFAICT.</li>
<li>Too many icons in the status bar. I don&#8217;t know what 1/2 of them mean.</li>
<li>There are just 3 installed widgets &#8211; not found a category in the store to find new widgets.</li>
<li>I like their &#8220;finder&#8221; more than the iphones. But both seem underdeveloped.</li>
<li>The browser is shit. You really get used to the double tap and multitouch features of Mobile Safari. I don&#8217;t use Mobile Safari too much (preferring dedicated apps) but it towers over the Android browser.</li>
<li>The E-mail app is functional &#8211; but plain. Cannot swipe to delete mail. To delete mail you seem to have to read it first. Ick.</li>
<li>In E-mail &#8220;message mode&#8221; so much screen real estate is taken up with buttons. This is the best Google can do?</li>
<li>Composing e-mail is plain. Again hating the keyboard.</li>
<li>Built-in calculator is so incredibly shit. This is definitely a huge 3rd party opportunity (whether it is intentional or not is another matter).</li>
<li>So far the flipout keyboard (and lack of onscreen keyboard) is the single biggest problem.</li>
<li>Vibrator is really cheap feel. dont know how to explain it.</li>
<li>Camera seems to have some kind of autofocus, while pointing it it clicks and refocuses, could be software I guess.</li>
<li>installing an app warns you about what features it uses: e.g. camera, your location, network, your contact info etc. Which is REALLY nice.</li>
<li>Dumb! Doesn&#8217;t have GPS turned on by default. Have to dig down silly menu system to find it. You would think the Maps app would prompt for it.</li>
<li>Barcode scanning works well with G1 (3rd party app). Would be impossible with iPhone.</li>
</ul>

<p>That&#8217;s all I have for now. More coming.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/24g1/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>TouchCode Donations</title>
		<link>http://toxicsoftware.com/touchcodedonate/</link>
		<comments>http://toxicsoftware.com/touchcodedonate/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 15:17:19 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iphone development]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[touchcode]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=393</guid>
		<description><![CDATA[TouchCode 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 &#8230; <a href="http://toxicsoftware.com/touchcodedonate/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/touchcode/">TouchCode</a> 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 benefits.</p>

<p>I would like to continue improving and adding to TouchCode, but my time is finite and I&#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&#8217;ve decided to ask TouchCode users for donations via PayPal.</p>

<ul>
<li>You do NOT need to donate to use TouchCode (the code is still Open Source under very permissive licenses).</li>
<li>TouchCode will always remain Open Source. Donations will not change that.</li>
<li>Donations will be set aside and will allow me to spend more time working on TouchCode &#8211; especially the less sexy fun of TouchCode. I will not be using the funds to buy a new MacBook Pro (however tempting that may be).</li>
<li>Donations will be made with no strings attached. I will not be adding feature X to component Y just because you&#8217;ve donated to the project. However if you have an urgent need for something in TouchCode (output support in NSXMLDocument perhaps?) <a href="http://toxicsoftware.com/contact/">contact me</a> and we can talk.</li>
<li>No donation too small, no donation too big. Every donation appreciated.</li>
</ul>

<p>And here&#8217;s the PayPal donate button:</p>

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="644832">
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="">
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/touchcodedonate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Obama &#8217;08 talk @ CocoaHeads Portland on Wednesday 8th October</title>
		<link>http://toxicsoftware.com/obama_cocoaheads_portland/</link>
		<comments>http://toxicsoftware.com/obama_cocoaheads_portland/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 12:45:14 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[cocoaheads]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[obama08]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=387</guid>
		<description><![CDATA[Raven Zachary and myself are going to be at the Wednesday Oct. 8 meeting of Portland Cocoaheads discussing the Obama &#8217;08 application and its development.]]></description>
			<content:encoded><![CDATA[<p><a href="http://raven.me/2008/10/02/obama-08-for-iphone/">Raven Zachary</a> and myself are going to be at the <a href="http://upcoming.yahoo.com/event/1165327">Wednesday Oct. 8</a> meeting of <a href="http://cocoaheads.org/us/PortlandOregon/index.html">Portland Cocoaheads</a> discussing the <a href="http://www.barackobama.com/iphone/">Obama &#8217;08 application</a> and its <a href="http://toxicsoftware.com/obama08/">development</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/obama_cocoaheads_portland/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TouchMap</title>
		<link>http://toxicsoftware.com/touchmap/</link>
		<comments>http://toxicsoftware.com/touchmap/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 00:31:21 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iphone development]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[TouchMap]]></category>
		<category><![CDATA[virtual earth]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=385</guid>
		<description><![CDATA[I was going to make a more in-depth posting about TouchMap, but then something kind of big happened. The code is however in the TouchCode google code repository. So have at it. (You&#8217;ll probably want to check out all of &#8230; <a href="http://toxicsoftware.com/touchmap/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I was going to make a more in-depth posting about <a href="http://toxicsoftware.com/touchmap-teaser/">TouchMap</a>, but then something <a href="http://toxicsoftware.com/obama08/">kind of big</a> happened. <a href="http://touchcode.googlecode.com/svn/trunk/Experimental/TouchMap/">The code</a> is however in the TouchCode google code repository. So have at it. (You&#8217;ll probably want to check out all of TouchCode, TouchMap currently depends on other code within the repository).</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/touchmap/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Looking for iPhone Software Professionals?</title>
		<link>http://toxicsoftware.com/iphoneswpro/</link>
		<comments>http://toxicsoftware.com/iphoneswpro/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 21:33:10 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[consultancy]]></category>
		<category><![CDATA[contracting]]></category>
		<category><![CDATA[freelancers]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iphone development]]></category>
		<category><![CDATA[iphone freelancers]]></category>
		<category><![CDATA[iphoneswpro]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/?p=381</guid>
		<description><![CDATA[The problem: I make my living by writing iPhone and Mac OS X for hire. I&#8217;ve been doing this for a while with some level of success. But ever since the iPhone SDK was announced earlier this year I&#8217;ve been &#8230; <a href="http://toxicsoftware.com/iphoneswpro/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>The problem:</h3>

<p>I make my living by writing iPhone and Mac OS X for hire. I&#8217;ve been doing this for a while with some level of success. But ever since the iPhone SDK was announced earlier this year I&#8217;ve been getting many, many more work enquiries than I could possibly handle. I&#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&#8217;t scale very well.</p>

<h3>The Solution:</h3>

<p>To try and make this informal referral approach work I&#8217;ve set up a <em>private</em> invite only Google Group called &#8220;iPhone Software Professionals&#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&#8217;d say all are equally capable on Mac OS 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 client.</p>

<p>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 on.</p>

<p>The group will probably remain quite small, with new members invited and referred only by current members. There is no commission or finder&#8217;s fee involved, the group is just an informal group of professionals forwarding work that would otherwise be rejected.</p>

<h3>Looking for an iPhone Software Professional?</h3>

<p>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&#8217;ll forward your request to the group. Either way contact me directly at <a href="mailto:iphoneswpro@toxicsoftware.com">iphoneswpro@toxicsoftware.com</a> and I&#8217;ll try make sure your software gets written.</p>

<hr />

<h3>Update</h3>

<p>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 me.</p>

<p>If you&#8217;re not invited into the group please do not take it personally. I&#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 group.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/iphoneswpro/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
