<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Neil Inglis</title>
	
	<link>http://www.neilinglis.com</link>
	<description>iPhone, iPad, Mac and Java Development Tales With a Sprinkling of Life Lessons</description>
	<lastBuildDate>Tue, 20 Jul 2010 21:55:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/NeilInglis-IphoneIpodMacAndJavaTales" /><feedburner:info uri="neilinglis-iphoneipodmacandjavatales" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Using AdWhirl To Achieve High Fill Rates</title>
		<link>http://feedproxy.google.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~3/miFyuwxRRYI/</link>
		<comments>http://www.neilinglis.com/2010/07/20/using-adwhirl-to-achieve-high-fill-rates/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 21:49:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.neilinglis.com/?p=13</guid>
		<description><![CDATA[I&#8217;ve been running ads in Sleeps to Christmas since it launched in August 2008. During that time I&#8217;ve moved between a few suppliers of ads. Each time I did this it involved code changes but I&#8217;ve now settled on a solution called AdWhirl which allows you to manage this better. In this post I&#8217;ll be [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been running ads in<a href="http://itunes.apple.com/us/app/sleeps-to-christmas-lite-christmas/id293747050?mt=8"> Sleeps to Christmas</a> since it launched in August 2008.  During that time I&#8217;ve moved between a few suppliers of ads. Each time I did this it involved code changes but I&#8217;ve now settled on a solution called <a href="http://www.adwhirl.com/">AdWhirl</a> which allows you to manage this better. In this post I&#8217;ll be writing about why I&#8217;m using AdWhirl and how to integrate it in your application.</p>
<p>First, let&#8217;s define some of the terms I&#8217;ll be using:</p>
<ul>
<li>Fill Rate is (number of ads received / number of ad requests sent ) * 100.  So if you request 100 ads but only receive 90 then you have a 90% fill rate.
</li>
<li>eCPM is &#8220;Effective Cost Per Mille (1000) Impressions&#8221;  That&#8217;s (total earnings / impressions) * 1000 and is useful for comparing ad provider against ad provider. Earnings can either be an a CPM (cost per 1000 impressions) or CPC (cost per click) or a combination of both (as in iAds).</li>
</ul>
<p>All else being equal you want to go with whichever network is providing the highest eCPM rate.  </p>
<p>I mentioned earlier that I&#8217;ve moved between ad networks a few times. This was due to issues with low fill rates and low eCPM and also the quality of adverts from some suppliers (no BIKINI BABES plz k thx).  (I previously put together a post explaining the numbers in excruciating details but I was alerted to the fact that most providers don&#8217;t let you provide details of earnings so that&#8217;s been mothballed for now). </p>
<p>Earlier this year I moved to Google AdSense for 100% of my requests as it provided a near 100% fill rate and high eCPM so I thought I&#8217;d solved this problem but iAds entering the fray has complicated things.  iAds was (and really still is, until it rolls out worldwide and more than two adverts become available) a bit of an unknown in terms of options so I wanted the option to be able to dynamically reallocate the proportion of my requests going to iAds at will.  If it was earning well, I&#8217;d send all my requests their way, if not then I&#8217;d send them to AdSense, if I requested an advert from iAd and it wasn&#8217;t available then I&#8217;d have something to fall back on.  I started to roll my own solution for this but I was then alerted to AdWhirl.</p>
<p>AdWhirl is an open source Mediation layer for adverts. It&#8217;s owned by AdMob (thus Google) but both the server and client components are open source under the Apache 2.0 License so I&#8217;m fairly confident that they&#8217;re safe. I&#8217;ve encountered one other mediation layer in the past, Mobclix, but they function by collecting and distributing the ad requests on the server side and feeding them to you. This means that they collect all the money from the networks on your behalf, take their cut and then pay you (3+ months later usually).  </p>
<p>AdWhirl makes the requests from your application, their server component is really just there for configuration purposes and they don&#8217;t take any cut of the revenue nor do they store any of your account details with the ad networks.  It&#8217;s sole purpose is to provide a mechanism for dynamically deciding in which order requests for adverts should be made.  You do this by setting up a priority list in their web interface and allocated a percentage of requests. You can then set up a &#8216;backfill&#8217; list which is used if the other suppliers are not available. This ensures that you should also have 100% fill rate.  I cannot emphasise how important this is.  Every time you fail to display an ad you&#8217;re leaving money on the table.</p>
<p>For the moment, I&#8217;ve configured AdWhirl to set iAds to 100% of requests and then fall back to AdSense if no iAds are available. iAds provide the highest eCPM in the industry at the moment, despite only having two adverts, so it makes sense to give them the most requests.   They are having serious inventory problems at the moment though, providing only around a 10% fill rate and with only two adverts on the go click through rates are dropping as most people have seen the adverts already.</p>
<p>Integrating AdWhirl was a cinch, it took less than an afternoon, and allowed me to clean up a lot of my code. You simply add their framework, select which ad networks you wish to use by adding them to your build target, add the delegate methods for your supplier (all well documented in the headers) and then it&#8217;s just a couple of lines to request an advert and add it to your view</p>
<p><code>AdWhirlView *awView = [AdWhirlView requestAdWhirlViewWithDelegate:self];<br />
 [self.view addSubview:awView];</code></p>
<p>(Setting up the frame if you want to place it elsewhere on your screen, natch).</p>
<p>AdWhirl manages showing and hiding adverts so you don&#8217;t need to worry about Apple&#8217;s restrictions on not showing empty frames for iAds and so on.</p>
<p>AdWhirl currently supports AdMob, AdSense, iAds, JumpTap, MdotM, Millenial, Quattro and VideoEgg. You&#8217;re under no obligation to integrate them all but I&#8217;d recommend doing at least two or three.  Advertisers like Millenial often do short term promotional campaigns for big companies that can be very lucrative if you&#8217;re willing to switch over all your requests for a short period of time.</p>
<p>You can find more information on AdWhirl at <a href="http://www.adwhirl.com/">http://www.adwhirl.com/</a>   The integration instructions in their SDK are great.</p>
<img src="http://feeds.feedburner.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~4/miFyuwxRRYI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.neilinglis.com/2010/07/20/using-adwhirl-to-achieve-high-fill-rates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.neilinglis.com/2010/07/20/using-adwhirl-to-achieve-high-fill-rates/</feedburner:origLink></item>
		<item>
		<title>Saving NSUserDefaults under iOS 4</title>
		<link>http://feedproxy.google.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~3/Q5f4tjvr7JQ/</link>
		<comments>http://www.neilinglis.com/2010/07/17/saving-nsuserdefaults-under-ios-4/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 14:31:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[ios4]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[multitasking]]></category>
		<category><![CDATA[nsuserdefaults]]></category>

		<guid isPermaLink="false">http://www.neilinglis.com/?p=11</guid>
		<description><![CDATA[iOS4 introduced &#8216;multitasking&#8217; wherein rather than being terminated your application is put into a suspended state where it&#8217;ll wait either until the user opens it again, the OS terminates it as it needs the resources or the user taps the &#8216;stop&#8217; button in the task tray. (Oliver Drobnik has an excellent in-depth explanation of this.) [...]]]></description>
			<content:encoded><![CDATA[<p>iOS4 introduced &#8216;multitasking&#8217; wherein rather than being terminated your application is put into a suspended state where it&#8217;ll wait either until the user opens it again, the OS terminates it as it needs the resources or the user taps the &#8216;stop&#8217; button in the task tray. (Oliver Drobnik has a<a href="http://www.drobnik.com/touch/2010/07/understanding-ios-4-backgrounding-and-delegate-messaging/">n excellent in-depth explanation of this.</a>)</p>
<p>I encountered a problem today where my application didn&#8217;t seem to be saving the parameters I set in NSUserDefaults when the application finishes (I save some state based on the time the user exits.  Usually I&#8217;d recommend updating the NSUserDefaults object as soon as the user finalises the action rather than at the end of the current application run).  </p>
<p>I know some other people have been having this problem too so I thought I&#8217;d share the solution, as it&#8217;s exceedingly simple.</p>
<p>You need to call the synchronize method on your NSUserDefaults object.<br />
<code>	[[NSUserDefaults standardUserDefaults] synchronize];</code></p>
<p>The OS periodically synchronizes the NSUserDefaults object while your application is running, apparently around every 15 seconds.  It seems that when your application backgrounds sometimes it won&#8217;t be synchronized in time, if the user kills it from the tray or the OS reclaims the memory immediately.  Manually calling synchronize will enforce a save and ensure your data is there next time.</p>
<img src="http://feeds.feedburner.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~4/Q5f4tjvr7JQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.neilinglis.com/2010/07/17/saving-nsuserdefaults-under-ios-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.neilinglis.com/2010/07/17/saving-nsuserdefaults-under-ios-4/</feedburner:origLink></item>
		<item>
		<title>Using a PAYG standard SIM in an iPad 3G</title>
		<link>http://feedproxy.google.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~3/E-Q8T9U4ovk/</link>
		<comments>http://www.neilinglis.com/2010/05/05/using-a-payg-standard-sim-in-an-ipad-3g/#comments</comments>
		<pubDate>Wed, 05 May 2010 18:04:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.neilinglis.com/?p=8</guid>
		<description><![CDATA[I took delivery of my iPad 3G today, shipped over from the US via Bundlebox *. I love it to bits so far but as there are no UK operators offering 3G services for the iPad in the UK the experience is a little incomplete. I was mulling this over a few days ago, while [...]]]></description>
			<content:encoded><![CDATA[<p>I took delivery of my iPad 3G today, shipped over from the US via <a href="https://www.bundlebox.com/invite/GB0310NIA1/">Bundlebox</a> *.  I love it to bits so far but as there are no UK operators offering 3G services for the iPad in the UK the experience is a little incomplete.</p>
<p>I was mulling this over a few days ago, while frantically refreshing my shipping status, when I came across a thread stating that there was no real difference between a Micro SIM and a standard SIM card. Much as the old style SIM cards were the same size as credit cards the SIM itself stays around the SIM size but there&#8217;s just less plastic!  They advised that it should be possible to trim an existing SIM card and put it into an iPad.</p>
<p>I was keen to try this out but didn&#8217;t want to risk cutting up my iPhone SIM or having to sign up for an expensive PAYG service that includes a wireless broadband card.  It was then that I chanced upon <a href="http://shop.ebay.co.uk/i.html?_nkw=vodafone+payg+1gb&#038;_sacat=0&#038;_trksid=p3286.m270.l1313&#038;_odkw=vodafone+payg&#038;_osacat=0&#038;bkBtn=">these Vodafone SIM cards on eBay</a> </p>
<p>They&#8217;re Vodafone PAYG SIMs for Broadband Modems which contain £15 of preloaded credit. That translates to 1 gigabyte of data allowance and best of all, the data doesn&#8217;t expire!  The current trend of PAYG plans is to expire credit after a month, see the AT&#038;T iPad 250meg plan, so this is particularly useful.  I&#8217;m sure the UK plans will follow suit.  Also note that the AT&#038;T plan in the US is $14.99 for 250meg/month. If the UK plans match this then that works out 4x as expensive as the eBay SIMs.</p>
<p>The SIM was through my letterbox when I got home today so I simply popped the AT&#038;T SIM out of the iPad, placed it over the contacts in the Vodafone SIM, used a pair of scissors to trim around it and then placed it back in the SIM tray.  It took a gentle push to get it in as the cut was slightly off but when I pushed it into the iPad it slid in smoothly.</p>
<p><a href="http://www.neilinglis.com/wp-content/uploads/2010/05/cutout.jpg"><img src="http://www.neilinglis.com/wp-content/uploads/2010/05/cutout-300x214.jpg" alt="" title="cutout" width="300" height="214" class="alignnone size-medium wp-image-9" /></a></p>
<p>After that, the iPad showed a connection to Vodafone on the 3G network but alas it couldn&#8217;t download anything.  I needed to set up the APN.  As always, Google provides and this is the information you&#8217;ll need if using one of the Vodafone SIMs:</p>
<p>APN: pp.internet<br />
Username: web<br />
Password: web</p>
<p><a href="http://www.neilinglis.com/wp-content/uploads/2010/05/settings.png"><img src="http://www.neilinglis.com/wp-content/uploads/2010/05/settings-300x225.png" alt="" title="settings" width="300" height="225" class="alignnone size-medium wp-image-10" /></a></p>
<p>Once those were entered the data connection sprung into life and I was able to access the web as usual.  No need to register with Vodafone!</p>
<p>So what now? The eBay supplier didn&#8217;t tell me the details of the account the SIM is tied to or the IMSI and  I doubt he even has those details so once the 1gig of credit is used up I think the SIM is useless.  No matter! I&#8217;ve ordered another few to last me over the coming months until I can work out the best course of action.  </p>
<p>Will Vodafone close this loophole?  Possibly. They can work out from the IMEI that it&#8217;s an iPad, not a Broadband modem.  Will they?  Noone knows.  It&#8217;s a fair bit of administration and this may not be a particularly widespread hack so it might not be worth their time. (Trust me, I work in Telecoms, I know how long it takes telcos to get things like this sorted.  I once waited 8 weeks for a customer to open Port 80 in their firewall).</p>
<p>So it&#8217;s maybe not a long term solution but until we see what plans the operators are offering it&#8217;s certainly the best one I can find.  In the long term it may be better to go with non iPad plans and just reuse the SIM.</p>
<p>* (Note, Bundlebox are having problems with Apple cancelling their iPad shipments. By all means give them a try but beware your iPad order may be cancelled. For other items, they&#8217;re great as well)</p>
<img src="http://feeds.feedburner.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~4/E-Q8T9U4ovk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.neilinglis.com/2010/05/05/using-a-payg-standard-sim-in-an-ipad-3g/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.neilinglis.com/2010/05/05/using-a-payg-standard-sim-in-an-ipad-3g/</feedburner:origLink></item>
		<item>
		<title>MAAttachedWindow As A Non Activating Panel</title>
		<link>http://feedproxy.google.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~3/uv6ME9krdCM/</link>
		<comments>http://www.neilinglis.com/2010/02/07/maattachedwindownon-activating-panel/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 12:50:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.neilinglis.com/?p=6</guid>
		<description><![CDATA[I&#8217;m currently working on an application that runs in a dual headless/GUI model. The main interaction point is a MAAttachedWindow (hattip to Matt Gemmell) attached to a NSStatusItem that lives in the Menu Bar. The user can invoke this manually or it becomes active when they use the Mac OS X Services contextual menu on [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently working on an application that runs in a dual headless/GUI model.</p>
<p>The main interaction point is a <a href="http://mattgemmell.com/2007/10/03/maattachedwindow-nswindow-subclass">MAAttachedWindow</a> (hattip to Matt Gemmell) attached to a NSStatusItem that lives in the Menu Bar.  The user can invoke this manually or it becomes active when they use the Mac OS X Services contextual menu on some text.</p>
<p>They can however open the application itself for extra functionality, using the dock icon/application switcher.  (I do offer the ability to disable this and use it purely through the NSStatusItem, but that&#8217;s not relevant to this post).  This makes running purely headless, using LSUIElement not an option.</p>
<p>So, my MAAttachedWindow contains a couple of NSTextFields and NSDatePickers, used to present values to the user for copying/editing. The problem I was having was that when the application is invokved the first text field would focus but as the application itself wasn&#8217;t in the foreground it wouldn&#8217;t accept user input.  The user would have to click on the item to focus and this caused the application come to the foreground.</p>
<p>I find this confusing, in this mode of operation I want the fact that I&#8217;m running as an application rather than a built in OSX utility to be transparent, the application title shouldn&#8217;t change, the menus shouldn&#8217;t change, everything should remain as is apart from this dropdown.</p>
<p>The behaviour I want is that the MAAttachedWindow becomes frontmost, accepts keyboard input, but doesn&#8217;t switch application context unless the user specifically opens it from the doc, application switcher or the menu option in the status bar.  </p>
<p>A screenshot would be useful at this point, right?  <strong>The application is totally not finished, the UI is a mess</strong> but here&#8217;s one anyway.  </p>
<p><a href="http://www.neilinglis.com/wp-content/uploads/2010/02/EpochHelper.png"><img src="http://www.neilinglis.com/wp-content/uploads/2010/02/EpochHelper-300x66.png" alt="Epoch Helper Screenshot" title="EpochHelper" width="300" height="66" class="alignnone size-medium wp-image-7" /></a></p>
<p>Yes, it&#8217;s a small utility that allows you to easily convert unix timestamps to human readable times and vice versa.  It integrates with the Services menu so that if you have a timestamp selected you can invoke it with a keypress and see the results.  The whole thing should be very focused around identifying a timestamp in a document you&#8217;re working on, selecting it, seeing the translation and dismissing it.  Alternatively you can use the date pickers to select a new time and get the timestamp for that.  This should all be possible with key presses without leaving the current application, thus allowing you to easily paste the results back in.</p>
<p>So, the solution is to make MAAttachedWindow an NSPanel and tell it to act as a Non Activating Panel.  Non activating panels can become key without activating the application that owns them.</p>
<p>Matt&#8217;s code already takes care of the utility of the two style masks I usually use when creating floating panels, (NSUtilityWindowMask<br />
to create as a floating window and NSHUDWindowMask to creat as a transparent panel, sometimes called a “heads-up display”).</p>
<p>So the trick is simply to use the style mask of</p>
<p><code>NSNonactivatingPanelMask<br />
No effect on appearance, but owning application is not necessarily active when this window is the key window.</code></p>
<p>We also need to ensure it always displays on top of other applications, we do this by setting its display level sufficiently high.</p>
<p>To make the changes;</p>
<p>1) In MAAttachedWindow.h change the parent type from NSWindow to NSPanel.</p>
<p>2) In MAAttachedWindow.m </p>
<p>Go to<br />
<code>- (MAAttachedWindow *)initWithView:(NSView *)view<br />
                   attachedToPoint:(NSPoint)point<br />
                          inWindow:(NSWindow *)window<br />
                            onSide:(MAWindowPosition)side<br />
                        atDistance:(float)distance</code></p>
<p> and in the<br />
<code> if ((self = [super initWithContentRect:contentRect<br />
                                styleMask: NSBorderlessWindowMask<br />
								   backing:NSBackingStoreBuffered<br />
                                    defer:NO])) {<br />
                                    </code><br />
 call set NSBorderlessWindowMask to be NSNonactivatingPanelMask</p>
<p>3) Beneath that set <code>[self setLevel:NSMainMenuWindowLevel+1];</code></p>
<p>4) ???</p>
<p>5) Profit</p>
<p>That&#8217;s it.  You now have a NSPanel that floats above all Windows and when invoked gives focus to the first responder but doesn&#8217;t bring the applicatoin itself to the foreground.  Perfect for helper services that live in the menubar.</p>
<p>I&#8217;ll be releasing the app itself as open source in the next couple of weeks so watch this space.</p>
<img src="http://feeds.feedburner.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~4/uv6ME9krdCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.neilinglis.com/2010/02/07/maattachedwindownon-activating-panel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.neilinglis.com/2010/02/07/maattachedwindownon-activating-panel/</feedburner:origLink></item>
		<item>
		<title>Giving Something Back</title>
		<link>http://feedproxy.google.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~3/NWmQdGTi7bw/</link>
		<comments>http://www.neilinglis.com/2010/01/31/giving-something-back/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 12:02:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://www.neilinglis.com/?p=5</guid>
		<description><![CDATA[I&#8217;m currently on the train down to Reading to attend NSConference, a small, community oriented conference aimed at independent developers for the Mac, iPhone and (presumably now) the iPad. In many ways it&#8217;s fitting that I&#8217;m writing this, my first post on this blog, on the way to the conference as the main driver for [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently on the train down to Reading to attend <a href="http://www.nsconference.com/">NSConference</a>, a small, community oriented conference aimed at independent developers for the Mac, iPhone and (presumably now) the iPad.</p>
<div id="_mcePaste">In many ways it&#8217;s fitting that I&#8217;m writing this, my first post on this blog, on the way to the conference as the main driver for starting this blog is the same reason I&#8217;m attending NSConference:</div>
<div><strong><br />
</strong></div>
<div id="_mcePaste"><strong>I want to be less of a bystander in the Mac/iPhone developer community and contribute more to that which has given so much to me.</strong></div>
<div><span id="more-5"></span></div>
<div><strong><span style="font-weight: normal;"><br />
</span></strong></div>
<div>In the four short years since I left University I&#8217;ve spent three of them at a blue chip company and one (and counting) at a small start-up. Both of these have involved writing screeds of Java and Perl code for, mostly, faceless customers. For the last 18 months I have also been running a part-time iPhone development business and this has really opened my eyes to what it means to be an independent developer and to be part of a community of developers.  In short, I like it. I like the people I&#8217;ve met, I&#8217;ve liked the knowledge I&#8217;ve gained and I like how inclusive it feels.  There&#8217;s no ego (well, Matt Gemmell aside), it feels like we&#8217;re all in this together.  Our goal is to make great software, whether by ourself or by enabling our peers to do so.</div>
<div></div>
<div></div>
<p><br/></p>
<div>The Mac/iPhone developer community is stronger than any online group I&#8217;ve experienced before.  Largely driven by Twitter, receiving answers to questions or even just getting to know your fellow devs is simply a case of broadcasting it to the &#8216;hive mind&#8217;.  Most devs are even happy to answer questions by email or on Stackoverflow.  People like <a href="http://mattgemmell.com">Matt Gemmell</a>, <a href="http://ditchnet.org/wp/">Todd Ditchendorf</a>,  <a href="http://boredzo.org/">Peter Hosey </a>and MANY MANY others supply thousands of lines of high quality open source code with liberal licenses. I&#8217;m looking forward to NSConference as, from everything I&#8217;ve heard about last years and from my experiences at the iPhone World Tour Tech Talks, this kindness and willingness to share bleeds into real life gatherings too. I&#8217;ve never come across anything like this in the Java or Perl world.  Maybe I&#8217;ve just not looked hard enough or maybe we do have something quite special.</div>
<p><br/></p>
<div>Thus far I&#8217;d say I&#8217;ve mostly been a taker from the community.  I attribute this mostly to shyness about the quality of my Cocoa code, I may have a couple of &#8216;successful&#8217; iPhone apps out but they were written when I was largely a beginner and I think this shows in the quality of the code.  More recently I&#8217;ve been working on pet projects for the Mac and I think I&#8217;ve turned a corner in terms of quality and, more importantly, usefulness and reusability of the code and I&#8217;m ready to share my insights.</div>
<p><br/></p>
<div>So expect to see some Tutorials and Sample Code coming your way in the near future.  And if you read this in a month or so and I haven&#8217;t followed up on my promise please drop a comment or send me a @mention me Twitter (I&#8217;m <a href="http://twitter.com/neilinglis">@neilinglis)</a> and slap me back on track!</div>
<p><br/></p>
<div id="_mcePaste">(PS: I&#8217;m not disatisfied with my current day job, on the contrary, I love it but I do feel there&#8217;s room for me to grow my part-time business too and bring the experience from that into my day job)</div>
<img src="http://feeds.feedburner.com/~r/NeilInglis-IphoneIpodMacAndJavaTales/~4/NWmQdGTi7bw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.neilinglis.com/2010/01/31/giving-something-back/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.neilinglis.com/2010/01/31/giving-something-back/</feedburner:origLink></item>
	</channel>
</rss>
