<?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>Jumping Through Hoops &#187; Tech</title>
	<atom:link href="http://blog.jameshiggs.com/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jameshiggs.com</link>
	<description>James Higgs&#039;s Blog</description>
	<lastBuildDate>Sun, 04 Sep 2011 12:46:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>GrowlMail on Snow Leopard: A Temporary Fix</title>
		<link>http://blog.jameshiggs.com/2009/08/28/growlmail-on-snow-leopard-a-temporary-fix/</link>
		<comments>http://blog.jameshiggs.com/2009/08/28/growlmail-on-snow-leopard-a-temporary-fix/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 10:42:06 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=283</guid>
		<description><![CDATA[[Update: Hunter Ford has taken the time to extend my very basic script so that it includes the details of the sender and an extract of the text of the mail in the Growl notification. Head over there and grab the new script: it's way better than mine.] If you use GrowlMail, you&#8217;ll be disappointed [...]]]></description>
			<content:encoded><![CDATA[<p>[<strong>Update:</strong> <a href="http://www.cupcakewithsprinkles.com/growl-notifications-for-apple-mail-on-mac-os-x-snow-leopard-10-6/">Hunter Ford has taken the time to extend my very basic script</a> so that it includes the details of the sender and an extract of the text of the mail in the Growl notification. Head over there and grab the new script: it's way better than mine.]</p>
<p>If you use <a href="http://growl.info/documentation/growlmail.php">GrowlMail</a>, you&#8217;ll be disappointed to learn that it doesn&#8217;t work on <a href="http://www.apple.com/macosx/">Snow Leopard</a> yet. Since I keep my dock hidden, without GrowlMail I don&#8217;t know that I&#8217;ve received mail unless I roll over the dock, which is frustrating and adds a little bit of background anxiety to my day.</p>
<p>While the awesome <a href="http://growl.info/">Growl</a> team are working on a fix, here&#8217;s a small AppleScript that I wrote to give me a notification whenever a mail arrives. It&#8217;s less functional than the full thing because it doesn&#8217;t tell you anything about the mail other than it has arrived.</p>
<p>There&#8217;s no title, summary or who it&#8217;s from like there is with GrowlMail, but that&#8217;s good enough for me as a stop gap. If you figure out a way to include those details, I&#8217;d love to hear about it though.</p>
<p>Anyway, the script. </p>
<pre>tell application "GrowlHelperApp"
   set the allNotificationsList to {"New Email Arrived"}

   set the enabledNotificationsList to {"New Email Arrived"}

   default notifications enabledNotificationsList icon of application "Mail"

   notify with name "New Email Arrived" title "New mail" description "New mail arrived." application name "Mail Notifier"
end tell</pre>
<p>Copy that into AppleScript Editor (as it is now called in Snow Leopard), or you can <a href="http://blog.jameshiggs.com/wp-content/uploads/2009/08/Growl-Notify.scpt.zip">download it from here</a>. Save it somewhere sensible (I used <code>/Library/Scripts/Mail Scripts</code>)</p>
<p>Then, add a rule to Mail for every mail that arrives and have it run the AppleScript. Here&#8217;s a screenshot:</p>
<p><img src="http://blog.jameshiggs.com/wp-content/uploads/2009/08/Mail1.png" alt="Screenshot of the Mail Rules editor" border="0" width="414" height="220" /></p>
<p>And that&#8217;s all there is to it. Hope you find it helpful.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2009/08/28/growlmail-on-snow-leopard-a-temporary-fix/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Sexism and Other Prejudices in the Technology World</title>
		<link>http://blog.jameshiggs.com/2009/04/23/252/</link>
		<comments>http://blog.jameshiggs.com/2009/04/23/252/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 13:05:22 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[sexism]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=252</guid>
		<description><![CDATA[I thought long and hard about whether to respond to Milo Yiannopoulos&#8217;s post about women in the technology industry. Mainly because I find his argument repulsive and I don&#8217;t want to draw attention to it. On the other hand, I get no traffic anyway, and there is a very clear argument to make in reply. [...]]]></description>
			<content:encoded><![CDATA[<p>I thought long and hard about whether to respond to <a href="http://blogs.telegraph.co.uk/milo_yiannopoulos/blog/2009/04/22/men_perform_better_in_many_technology_jobs_must_we_apologise_for_that">Milo Yiannopoulos&#8217;s post about women in the technology industry</a>. Mainly because I find his argument repulsive and I don&#8217;t want to draw attention to it. On the other hand, I get no traffic anyway, and there is a very clear argument to make in reply.</p>
<p>Here&#8217;s a snippet from a <a href="http://uk.techcrunch.com/2009/04/21/geeknrolla-just-a-girl-how-do-we-get-more-women-into-the-tech-sector/">transcript of a panel discussion that he seems to have invited himself into</a>:</p>
<blockquote><p>Milo: Finds this discussion patronising to women. There are reasons which have nothing to do with prejudice why women are not more involved in the tech scene. Do we need to change the game? [...] No! We shouldn&#8217;t be apologising for having fewer women in a sector in which men naturally perform better</p></blockquote>
<p>His argument boils down to &#8220;men and women are different, men are better at tech, deal with it&#8221;. This is bullshit. Here&#8217;s why.</p>
<p>Milo seems to think that technology is a pure meritocracy, and that we can therefore say that because there are fewer women in tech we can draw the conclusion that women are not as good at it as men. But this argument doesn&#8217;t fly.</p>
<p>While women are under-represented, there are also comparatively few people from ethnic minorities in programming jobs in the UK. However there are quite a lot of people from ethnic minorities working in more lowly (i.e. less well paid) technology jobs like first line support and so on.</p>
<p>Are we therefore to draw the conclusion that white people are genetically best suited to be programmers? Of course not. Descrimination is there at every level of tech, just as it is with so many other walks of life. Programmers in the UK are overwhelmingly white, male and under forty.</p>
<p>Over the course of my career, I&#8217;ve had discussions with colleagues about whether a candidate is &#8220;too old&#8221;, has &#8220;good enough English&#8221; (which is code for &#8220;white&#8221;) and more. I&#8217;ve had people ask me &#8220;did she have big tits?&#8221; after interviewing a woman for a development or project management job. I&#8217;ve been told that a candidate is &#8220;interesting&#8221;, with a coy little wink, which is code for &#8220;gay&#8221;. I&#8217;ve seen pats on the bum, &#8220;morning, beautiful&#8221; and other clearly sexist acts. These things have come from senior people as often as not. They are normally laughed off as being nothing harmful, just a bit of fun. If women can&#8217;t take them then &#8220;they don&#8217;t fit in&#8221;. These prejudices are there and they need to be attacked.</p>
<p>We also need to constantly remind ourselves that technology is, on the whole, quite shit. Large-scale software development is still incredibly hard and huge numbers, perhaps even the majority, of projects fail. We have no laurels to rest on. The technology industry needs to change, and increased diversity can only be a good thing.</p>
<p>Of course this is only my experience &#8211; nearly 20 years of it now &#8211; but I&#8217;ve worked with brilliant female developers as well as crap ones, just as I&#8217;ve worked with both brilliant and crap male developers. Brilliant developers are *very* rare, and the difference is not in the <a href="http://en.wikipedia.org/wiki/Chromosomes">chromosomes</a>.</p>
<p>It&#8217;s not that long since we debated whether &#8220;allowing&#8221; women into the Vienna Philharmonic would change the orchestra&#8217;s distinctive sound (it didn&#8217;t), or whether women were capable of running a marathon (they are). These barriers have been torn down and exposed for the simple sexism they were. The same needs to happen in the tech industry, and the sooner it happens, the better.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2009/04/23/252/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Shrinker: Simple URL shortening for Mac OS X</title>
		<link>http://blog.jameshiggs.com/2009/04/03/shrinker-simple-url-shortening-for-mac-os-x/</link>
		<comments>http://blog.jameshiggs.com/2009/04/03/shrinker-simple-url-shortening-for-mac-os-x/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 11:18:11 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[shrinker]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=241</guid>
		<description><![CDATA[After several years, mainly of inactivity, I recently released a beta of Shrinker, my Mac OS X app that makes using services like is.gd, bit.ly, TinyURL and tr.im a whole lot easier. If you want to try out the beta, head on over to the product page at Puffing Bear and download it today. I [...]]]></description>
			<content:encoded><![CDATA[<p>After several years, mainly of inactivity, I recently released a beta of <a href="http://puffingbear.com/Shrinker">Shrinker</a>, my Mac OS X app that makes using services like <a href="http://is.gd">is.gd</a>, <a href="bit.ly">bit.ly</a>, <a href="http://tinyurl.com">TinyURL</a> and <a href="tr.im">tr.im</a> a whole lot easier.</p>
<p><a href="http://puffingbear.com/Shrinker"><img src="http://www.puffingbear.com/wp-content/uploads/2009/03/shrinker_icon-150x150.png" height="150" width="150" border="0" style="border: none;" /></a></p>
<p>If you want to try out the beta, head on over to the <a href="http://puffingbear.com/Shrinker">product page at Puffing Bear</a> and download it today.</p>
<p>I will hopefully be ready to release a version 1.0 of Shrinker fairly shortly. It&#8217;ll be free in the sense of &#8220;free beer&#8221;. Its primary purpose was as a learning project for me, so I&#8217;m not interested in opening the source at the moment. That doesn&#8217;t mean I won&#8217;t be at some point in the future, though.</p>
<p>I&#8217;m making it free for a few reasons. First, I don&#8217;t think I&#8217;d make any meaningful amount of money out of it. Second, it was conceived as a learning project for me, and to scratch my own itch &#8211; a lack of a similar tool for the Mac. And, finally, I&#8217;ve received so much wonderful help from the Mac developer community, both directly and through searching blogs and mailing list archives, that I felt I should try to contribute something back. I haven&#8217;t got around to it yet, but there I&#8217;ll put a full list of acknowledgements in the About panel and on the website before I release version 1.0</p>
<p>I hope you like Shrinker, and please let me know if you find any bugs or have any suggestions.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2009/04/03/shrinker-simple-url-shortening-for-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone: how to create a transparent table header</title>
		<link>http://blog.jameshiggs.com/2009/03/01/transparent-table-header-uitableview/</link>
		<comments>http://blog.jameshiggs.com/2009/03/01/transparent-table-header-uitableview/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 13:54:30 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=176</guid>
		<description><![CDATA[A couple of weeks ago I was wondering how you created a transparent header for a table view on the iPhone like the one that&#8217;s in the built in contacts app detail view. Here&#8217;s a video of the contacts app so that you can see what I&#8217;m trying to achieve: Initially, I thought that the [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago <a href="http://twitter.com/higgis/status/1224333646">I was wondering</a> how you created a transparent header for a table view on the iPhone like the one that&#8217;s in the built in contacts app detail view. Here&#8217;s a video of the contacts app so that you can see what I&#8217;m trying to achieve:</p>
<p><object width="193" height="371"><param name="movie" value="http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/jingswfplayer.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/FirstFrame.jpg&#038;width=386&#038;height=742&#038;content=http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/00000004.swf"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/"></param>  <embed src="http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/jingswfplayer.swf" quality="high" bgcolor="#FFFFFF" width="193" height="371" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/FirstFrame.jpg&#038;width=386&#038;height=742&#038;content=http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/00000004.swf" allowFullScreen="true" base="http://content.screencast.com/users/higgis/folders/Jing/media/490cd6ed-86ba-4244-a744-ae912e085f72/" scale="showall"></embed></object></p>
<p>Initially, I thought that the way to do this was to add an additional section to the table and add a custom cell to it. That kind of works, but is quite hard work. I think I&#8217;ve found a better and simpler way &#8211; by using the <code>tableView:viewForHeaderInSection</code> method on <code>UITableViewDelegate</code>. </p>
<p>To start with, we need to create a basic view-based Cocoa Touch app in XCode. I&#8217;ve called mine ContactStylee. I&#8217;ve <a href="http://blog.jameshiggs.com/wp-content/media/ContactStylee.zip">zipped up the completed XCode project for you</a> so that you can follow along.</p>
<p><span id="more-176"></span></p>
<p>Once we&#8217;ve got the basic project template, we need to implement the <code>UITableViewDataSource</code> in our <code>ContactStyleeViewController</code>. As usual, this consists of implementing <code>tableView:numberOfRowsInSection</code> and <code>tableView:cellForRowAtIndexPath</code>. I also create a simple <code>NSArray</code> to hold some sample data in the <code>viewDidLoad</code> method. Here&#8217;s the interface file:</p>
<pre>
@interface ContactStyleeViewController : UIViewController
	&lt;UITableViewDataSource, UITableViewDelegate&gt; {

	NSArray *data;
	ContactStyleeAppDelegate *appDelegate;
}

@property (nonatomic, retain) NSArray *data;

@end
</pre>
<p>And the implementation: </p>
<pre>
@implementation ContactStyleeViewController

@synthesize data;

- (void)viewDidLoad {
   	[super viewDidLoad];
	self.data = [NSArray arrayWithObjects:
		@"First", @"Second", @"Third", @"Fourth", nil];
}

- (NSInteger)tableView:(UITableView *)tableView
	numberOfRowsInSection:(NSInteger)section {

	return [self.data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
	cellForRowAtIndexPath:(NSIndexPath *)indexPath {

	UITableViewCell *cell = [tableView
		dequeueReusableCellWithIdentifier:@"normalcell"];
	if(nil == cell) {
		cell = [[[UITableViewCell alloc]
			initWithFrame:CGRectZero
			reuseIdentifier:@"normalcell"] autorelease];
	}
	cell.text = [self.data objectAtIndex:indexPath.row];
	return cell;
}

- (void)dealloc {
	[data release];
	[super dealloc];
}
@end</pre>
<p>All pretty standard stuff. In the NIB, I&#8217;ve set the table to have the &#8220;Grouped&#8221; style. Here&#8217;s what that looks like when we run it in the simulator:</p>
<p><img src="http://blog.jameshiggs.com/wp-content/uploads/2009/02/conventional-grouped-table.png" alt="Conventional Grouped Table" border="0" width="212" height="394" /></p>
<p>So now we need to create the header view. I did this by adding a new View NIB to the project, calling it <code>TableHeader</code>. I then created a new view controller class, called <code>TableHeaderViewController</code>, and then set the class for the File&#8217;s Owner in the TableHeader.xib file to the new controller class. You need to remember to tell the File&#8217;s Owner about the view. I added an image and a couple of labels. For the purposes of this demo project, that&#8217;s all that&#8217;s needed in the header view: we won&#8217;t bother hooking it up to the data source for now.</p>
<p>To be able to reference the view from the <code>ContactStyleeViewController</code>, I added a new view controller to MainWindow.xib and made its class <code>TableHeaderViewController</code>, and we tell it to load the view from <code>TableHeader.xib</code>. I then added an <code>IBOutlet</code> of type <code>TableHeaderViewController</code> to <code>ContactStyleeAppDelegate</code>. This means that I can load that controller&#8217;s view from the app delegate.</p>
<p>Now that we&#8217;ve got the controller outlet and property in our app delegate, we need to hook that up in IB. So we make the new view controller that we just added to <code>MainWindow.xib</code> point to the new <code>IBOutlet</code> that we just added in the <span>ContactStyleeAppDelegate</code>. Here's how the app delegate interface file looks now:</p>
<pre>#import &lt;UIKit/UIKit.h&gt;

@class ContactStyleeViewController;
@class TableHeaderViewController;

@interface ContactStyleeAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {
	UIWindow *window;
	ContactStyleeViewController *viewController;
	TableHeaderViewController *headerViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ContactStyleeViewController *viewController;
@property (nonatomic, retain) IBOutlet TableHeaderViewController *headerViewController;

@end</pre>
<p>Now we need a way for the <code>ContactStyleeViewController</code> to access our <code>TableHeaderViewController</code>. To do this, we add an <code>IBOutlet</code> of type <span>ContactSyleeAppDelegate</span> to our <code>ContactStyleeViewController</code> and then connect that up to our app delegate in IB. Here's the revised <code>ContactStyleeViewController</code> interface file:</p>
<pre>#import &lt;UIKit/UIKit.h&gt;
@class ContactStyleeAppDelegate;

@interface ContactStyleeViewController : UIViewController
	&lt;UITableViewDataSource, UITableViewDelegate&gt; {

	NSArray *data;
	ContactStyleeAppDelegate *appDelegate;
}

@property (nonatomic, retain) NSArray *data;
@property (nonatomic, retain) IBOutlet ContactStyleeAppDelegate *appDelegate;

@end</pre>
<p>Note that we need to forward declare the <code>ContactStyleeAppDelegate</code> class rather than importing the header file in order to avoid a circular include. Once we've hooked up this outlet to the app delegate in IB, we're almost ready to go. We just need to tell the table view where to get the header view from.</p>
<p>To do this, we need to implement two new methods in <code>ContactStyleeViewController</code> that are optional methods on the <code>UITableViewDelegate</code> protocol, <code>tableView:viewForHeaderInSection</code> and <code>tableView:heightForHeaderInSection</code>. These are pretty simple methods now that we've hooked up the app controller outlet:</p>
<pre>- (UIView *)tableView:(UITableView *)tableView
	viewForHeaderInSection:(NSInteger)section {

	return [[appDelegate headerViewController] view];
}

- (CGFloat)tableView:(UITableView *)tableView
	heightForHeaderInSection:(NSInteger)section {

	return 85;
}</pre>
<p>At this point, I reckoned I was done, so I built and ran the app in the simulator. What I saw wasn't quite what I had expected:</p>
<p><img src="http://blog.jameshiggs.com/wp-content/uploads/2009/02/not-transparent1.png" alt="not_transparent.png" border="0" width="414" height="216" /></p>
<p>The header cell has an opaque white background, which is not what we wanted at all. We need to make a few simple adjustments in IB. Here's what the inspector looks like when the changes have been made (and you need to be careful that its the <em>view</em> that's selected in IB, not one of the controls):</p>
<p><img src="http://blog.jameshiggs.com/wp-content/uploads/2009/02/ib-settings.png" alt="ib_settings.png" border="0" width="301" height="404" /></p>
<p>You need to make sure that the "Opaque" checkbox is cleared, and that you set the background colour to have a 0% opacity. And that's it. Here's a screenshot:</p>
<p><img src="http://blog.jameshiggs.com/wp-content/uploads/2009/02/finished-app.png" alt="finished_app.png" border="0" width="413" height="243" /></p>
<p>And here's a video showing that it scrolls just like the built-in contacts app:</p>
<p><object width="193" height="371"><param name="movie" value="http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/jingswfplayer.swf"></param><param name="quality" value="high"></param><param name="bgcolor" value="#FFFFFF"></param><param name="flashVars" value="thumb=http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/FirstFrame.jpg&#038;width=386&#038;height=742&#038;content=http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/00000001.swf"></param><param name="allowFullScreen" value="true"></param><param name="scale" value="showall"></param><param name="allowScriptAccess" value="always"></param><param name="base" value="http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/"></param>  <embed src="http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/jingswfplayer.swf" quality="high" bgcolor="#FFFFFF" width="193" height="371" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/FirstFrame.jpg&#038;width=386&#038;height=742&#038;content=http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/00000001.swf" allowFullScreen="true" base="http://content.screencast.com/users/higgis/folders/Jing/media/2ac67cb6-830f-49d3-ab66-13d7a2770227/" scale="showall"></embed></object></p>
<p>It took me a while to figure out that this was the best way. Hopefully this post will help someone else to get there quicker. But, since I'm strictly an iPhone development beginner, I'd be really interested to hear from people if they think there's a better way to do it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2009/03/01/transparent-table-header-uitableview/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>There will be no &#8220;iPhone killer&#8221;</title>
		<link>http://blog.jameshiggs.com/2009/02/27/there-will-be-no-iphone-killer/</link>
		<comments>http://blog.jameshiggs.com/2009/02/27/there-will-be-no-iphone-killer/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 14:12:20 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=155</guid>
		<description><![CDATA[All you ever hear from the mobile phone manufacturers and pundits these days is speculation about what phone will &#8220;kill&#8221; the iPhone. I think this is evidence that they are thinking in a way that will be guarantee that they will be also-rans for as long as Apple make a mobile telephony device (and I [...]]]></description>
			<content:encoded><![CDATA[<p>All you ever hear from the mobile phone manufacturers and pundits these days is speculation about what phone will &#8220;kill&#8221; the <a href="http://www.apple.com/iphone">iPhone</a>. I think this is evidence that they are thinking in a way that will be guarantee that they will be also-rans for as long as Apple make a mobile telephony device (and I think they&#8217;ll be doing that for a *long* time).</p>
<p>It shows that they&#8217;re asking the wrong question. The flurry of new touchscreen devices &#8211; the <a href="http://www.blackberry.com/blackberrystorm/">BlackBerry Storm</a>, the <a href="http://www.lgmobilephones.com/phone.aspx?id=10398">LG Incite</a> (tagline: &#8220;Windows Mobile at its most intuitive&#8221;, which is kind of like saying &#8220;shit at its least smelly&#8221;) and so on &#8211; show that the boards of mobile phone companies have, in effect, told their R&amp;D teams to create an iPhone clone.</p>
<p>And there&#8217;s the problem. You can&#8217;t clone the iPhone, because Apple have done such an amazing job on the design, usability and functionality that, if you&#8217;re in the market for a touchscreen phone, you&#8217;re probably going to automatically choose an iPhone. And that&#8217;s before you&#8217;ve had a play with your friend&#8217;s iPhone. I&#8217;ve never owned any other device that has made my friends *laugh* when they see how awesome it is.</p>
<p>There are still a few things that might hold you back: years of hearing that Macs aren&#8217;t as good as PCs (just pop into your local Apple Store if you want to find out how wrong-headed that is), the price of the monthly contract, and maybe not wanting to be on O2 due to coverage issues in your area (or AT&amp;T or whoever the carrier is in your country). And you may just not want to be a sheep. But once the exclusive deals expire, surely the iPhone will be available on all networks and most of those concerns will go away.</p>
<p>But there are still a huge number of people who are not in the market for an iPhone at all. People who don&#8217;t want such a large phone, who don&#8217;t want email, or an iPod on their phone, or a mobile gaming device, who probably don&#8217;t even need a camera, and who will probably never download apps. Although the iPhone has been a massive success &#8211; when very few predicted it would be &#8211; it still only has a fraction of the market for handsets.</p>
<p>I boldly predict that the next big-selling phone will be designed by people who look at the iPhone and ask: &#8220;who isn&#8217;t going to want one of these?&#8221;, &#8220;why?&#8221;, and &#8220;how can we build them a phone they *do* want?&#8221; Until then, Apple will continue to eat the establish players&#8217; lunch.</p>
<p><strong>Update:</strong> fixed silly typo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2009/02/27/there-will-be-no-iphone-killer/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>NSConference</title>
		<link>http://blog.jameshiggs.com/2009/02/18/nsconference/</link>
		<comments>http://blog.jameshiggs.com/2009/02/18/nsconference/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 14:52:32 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=151</guid>
		<description><![CDATA[I&#8217;ve recently taken some actual concrete steps to learn the iPhone SDK and Objective-C. So far it&#8217;s been very enjoyable, with only a couple of WTF moments. The biggest change from using Visual Studio and .NET has been that the visual tools actually seem to work without screwing with your work. I&#8217;m not pushing it [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently taken some actual concrete steps to learn the iPhone SDK and Objective-C. So far it&#8217;s been very enjoyable, with only a couple of WTF moments.</p>
<p>The biggest change from using Visual Studio and .NET has been that the visual tools actually seem to work without screwing with your work. I&#8217;m not pushing it very hard yet, so that will probably change. I&#8217;m still nervous that I don&#8217;t understand the underlying serialization format.</p>
<p>I&#8217;ve been using <a href="http://bill.dudney.net/roller/objc/">Bill Dudney</a>&#8216;s <a href="http://www.pragprog.com/screencasts/v-bdiphone/writing-your-first-iphone-application">Screenscasts on starting iPhone development</a>, and his forthcoming <a href="http://www.pragprog.com/titles/amiphd/iphone-sdk-development">iPhone development book</a>, both from the Pragmatic Programmers, which have both been excellent. As a result I&#8217;ve got the basics of an iPhone app that I think could turn into something that people might actually want to install on their phones. There&#8217;s a lot of work to be done before I get to that stage, though.</p>
<p>In an attempt to give myself a hard deadline for learning, I also signed up for <a href="http://www.nsconference.com/helpus/files/blocks_image_1_1.png">NSConference</a>, a Mac developers conference to be held in April, organised by Scotty from the <a href="http://www.mac-developer-network.com/">Mac Developer Network</a>. If you&#8217;re at all interested in iPhone or Mac development it looks like the place to be. Hopefully I&#8217;ll see you there.</p>
<div class="mceTemp">
<dl class="wp-caption alignnone" style="width: 478px;">
<dt class="wp-caption-dt"><a href="http://www.nsconference.com/"><img title="NSConference" src="http://www.nsconference.com/helpus/files/blocks_image_1_1.png" alt="NSConference badge" width="468" height="60" /></a></dt>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2009/02/18/nsconference/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C#: How to accept an invalid SSL certificate programmatically</title>
		<link>http://blog.jameshiggs.com/2008/05/01/c-how-to-accept-an-invalid-ssl-certificate-programmatically/</link>
		<comments>http://blog.jameshiggs.com/2008/05/01/c-how-to-accept-an-invalid-ssl-certificate-programmatically/#comments</comments>
		<pubDate>Thu, 01 May 2008 17:30:12 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/?p=104</guid>
		<description><![CDATA[In the project I&#8217;m working on at the moment, we have a requirement to call some REST services using .NET#&#8217;s built-in System.Net.HttpWebRequest class. The calls will eventually be over SSL using a properly issued certificate when we go live, but for testing we&#8217;ve been using a self-signed certificate. When you navigate to an HTTP URL [...]]]></description>
			<content:encoded><![CDATA[<p>In the project I&#8217;m working on at the moment, we have a requirement to call some REST services using .NET#&#8217;s built-in <code>System.Net.HttpWebRequest</code> class. The calls will eventually be over SSL using a properly issued certificate when we go live, but for testing we&#8217;ve been using a self-signed certificate.</p>
<p>When you navigate to an HTTP URL with a dodgy certificate in a browser, you get a warning that gives you the option to ignore the problems. In code, this just results in an exception being thrown. The exception is a <code>System.Security.Authentication.AuthenticationException</code> (wrapped in a <code>System.Net.WebException</code>), with an error message of &#8220;The remote certificate is invalid according to the validation procedure.&#8221;</p>
<p>So, for testing, we needed to find a way to bypass the certificate validation. It turns out that you need to provide a <code>RemoteCertificateValidationCallback</code> delegate and attach it to <code>ServicePointManager.ServerCertificateValidationCallback</code>. What&#8217;s not clear is what happens if two threads are competing to set this property to different values, since it&#8217;s a static property. Reflector suggests that the property set method doesn&#8217;t do anything fancy, so you could easily get into a race condition.</p>
<p>Anyway, here&#8217;s s snippet that shows how to do this. Hopefully someone will find it useful, because it took me a while to find.</p>
<pre><code> // callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(
object sender,
	X509Certificate certificate,
	X509Chain chain,
	SslPolicyErrors policyErrors
)
{
	if (Convert.ToBoolean(ConfigurationManager.AppSettings["IgnoreSslErrors"]))
	{
		// allow any old dodgy certificate...
		return true;
	}
	else
	{
		return policyErrors == SslPolicyErrors.None;
	}
}

private static string MakeRequest(string uri, string method, WebProxy proxy)
{
	HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
	webRequest.AllowAutoRedirect = true;
	webRequest.Method = method;

	// allows for validation of SSL conversations
	ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
		ValidateRemoteCertificate
	);

	if (proxy != null)
	{
		webRequest.Proxy = proxy;
	}

	HttpWebResponse response = null;
	try
	{
		response = (HttpWebResponse)webRequest.GetResponse();

		using (Stream s = response.GetResponseStream())
		{
			using (StreamReader sr = new StreamReader(s))
			{
				return sr.ReadToEnd();
			}
		}
	}
	finally
	{
		if (response != null)
			response.Close();
	}
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2008/05/01/c-how-to-accept-an-invalid-ssl-certificate-programmatically/feed/</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>Spolsky on IE8 and Standards</title>
		<link>http://blog.jameshiggs.com/2008/03/17/spolsky-on-ie8-and-standards/</link>
		<comments>http://blog.jameshiggs.com/2008/03/17/spolsky-on-ie8-and-standards/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 17:37:29 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Compatibility]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Joel Spolsky]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/2008/03/17/spolsky-on-ie8-and-standards/</guid>
		<description><![CDATA[Joel Spolsky has a long article on the subject of the IE team&#8217;s decision to prioritise standards over compatibility in IE8. While he cheekily claims not to be taking any sides, it&#8217;s pretty clear he&#8217;s with the pragmatists. So am I.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.joelonsoftware.com/items/2008/03/17.html">Joel Spolsky has a long article</a> on the subject of the <a href="http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx">IE team&#8217;s decision to prioritise standards over compatibility</a> in IE8. While he cheekily <em>claims </em>not to be taking any sides, it&#8217;s pretty clear he&#8217;s with the pragmatists.</p>
<p><a href="http://blog.jameshiggs.com/2008/03/04/microsoft-screw-the-pooch-again/">So am I</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2008/03/17/spolsky-on-ie8-and-standards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s official</title>
		<link>http://blog.jameshiggs.com/2008/03/07/its-official/</link>
		<comments>http://blog.jameshiggs.com/2008/03/07/its-official/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 00:02:48 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/2008/03/07/its-official/</guid>
		<description><![CDATA[I am the greatest. The iPhone said so: (Click for larger version And I didn&#8217;t Photoshop it, either.]]></description>
			<content:encoded><![CDATA[<p>I am the greatest. The iPhone said so:</p>
<p><a href="http://blog.jameshiggs.com/wp-content/uploads/2008/03/teh-greatest-large.jpg"><img src="http://blog.jameshiggs.com/wp-content/uploads/2008/03/teh-greatest-small.jpg" border="0" alt="teh-greatest-small.jpg" width="182" height="350" /></a></p>
<p><a href="http://blog.jameshiggs.com/wp-content/uploads/2008/03/teh-greatest-large.jpg">(Click for larger version</a></p>
<p>And I didn&#8217;t Photoshop it, either.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2008/03/07/its-official/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone development</title>
		<link>http://blog.jameshiggs.com/2008/03/06/iphone-development/</link>
		<comments>http://blog.jameshiggs.com/2008/03/06/iphone-development/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 21:36:28 +0000</pubDate>
		<dc:creator>higgis</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.jameshiggs.com/2008/03/06/iphone-development/</guid>
		<description><![CDATA[Now this is very exciting. (Click for larger version) I predict that the iPhone SDK will be seen as a watershed in the history of computing, as important as the the first PC. For the first time, proper mobile computing will be a reality. I can&#8217;t wait to get started developing my first app.]]></description>
			<content:encoded><![CDATA[<p>Now this is very exciting.</p>
<p><a href="http://blog.jameshiggs.com/wp-content/uploads/2008/03/iphone-dev.jpg" target="_blank"><img src="http://blog.jameshiggs.com/wp-content/uploads/2008/03/iphone-dev-small.jpg" border="0" alt="" width="400" height="223" /></a></p>
<p><a href="http://blog.jameshiggs.com/wp-content/uploads/2008/03/iphone-dev.jpg" target="_blank">(Click for larger version)</a></p>
<p>I predict that the iPhone SDK will be seen as a watershed in the history of computing, as important as the the first PC. For the first time, proper mobile computing will be a reality.</p>
<p>I can&#8217;t wait to get started developing my first app.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jameshiggs.com/2008/03/06/iphone-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

