<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3760424589061564192</id><updated>2012-01-31T13:14:28.754-08:00</updated><category term='core data'/><category term='iphone'/><category term='xcode'/><category term='augmented reality'/><category term='ios'/><category term='git'/><category term='opensource'/><category term='gamedev'/><category term='janken battle'/><category term='sqlite'/><category term='search'/><category term='dropbox'/><category term='locayta'/><category term='ipad'/><category term='river level'/><category term='game'/><title type='text'>Chris Miles</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-9188279193473979705</id><published>2012-01-31T13:14:00.000-08:00</published><updated>2012-01-31T13:14:28.769-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='augmented reality'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><title type='text'>My Cocoaheads talk on Augmented Reality with iOS</title><content type='html'>&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;At the November Melbourne Cocoaheads meeting I gave a &lt;a href="http://www.melbournecocoaheads.com/augmented-reality-on-ios-chris-miles/"&gt;talk about Augmented Reality with iOS&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://vimeo.com/34311831" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-BLXYV2EsFpY/TyfPj8KTJmI/AAAAAAAAAN0/wOHdr8Lji_U/s320/6351207017_3cb8667957_b.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;A video of the talk is embedded below (or &lt;/span&gt;&lt;a href="http://vimeo.com/34311831" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;watch on Vimeo&lt;/a&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;) and the &lt;/span&gt;&lt;a href="http://public.iwork.com/document/?a=p276631979&amp;amp;d=Augment_My_iReality.key" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;slides&lt;/a&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; are available online.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In the talk I review the current set of available libraries for AR processing on iOS. I run through them relatively quickly, to keep the talk moving, but I do give live demos of each library. The libraries I cover are:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Commercial:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.poweredbystring.com/"&gt;String&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.metaio.com/software/mobile-sdk/"&gt;Metaio Unifeye&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="https://developer.qualcomm.com/develop/mobile-technologies/augmented-reality"&gt;Qualcomm&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Open Source:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="https://github.com/sonsongithub/CoreAR"&gt;CoreAR&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.hitl.washington.edu/artoolkit/"&gt;ARToolKit&lt;/a&gt; / &lt;a href="https://github.com/benlodotcom/VRToolKit"&gt;VRToolKit&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://opencv.willowgarage.com/wiki/"&gt;OpenCV&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;View the &lt;a href="http://public.iwork.com/document/?a=p276631979&amp;amp;d=Augment_My_iReality.key"&gt;slides&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="225" mozallowfullscreen="" src="http://player.vimeo.com/video/34311831?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-9188279193473979705?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/9188279193473979705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/9188279193473979705'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2012/01/my-cocoaheads-talk-on-augmented-reality.html' title='My Cocoaheads talk on Augmented Reality with iOS'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-BLXYV2EsFpY/TyfPj8KTJmI/AAAAAAAAAN0/wOHdr8Lji_U/s72-c/6351207017_3cb8667957_b.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-5178760162842738122</id><published>2012-01-22T23:35:00.000-08:00</published><updated>2012-01-22T23:35:02.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='augmented reality'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><title type='text'>Working With a Famous Blue Hedgehog</title><content type='html'>&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Late last year I had the honour of working with one of the most well known computer game characters of all time, the&lt;/span&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://sonicthehedgehog.com/" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;famous blue hedgehog&lt;/a&gt;,&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;incorporating him into an interactive augmented reality app for iPhone.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-H3l3SiaFKwU/TwpCvn83tzI/AAAAAAAAANQ/xpOsjMKIFMM/s1600/mzl.gyielvzd.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-H3l3SiaFKwU/TwpCvn83tzI/AAAAAAAAANQ/xpOsjMKIFMM/s320/mzl.gyielvzd.jpeg" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The app is a promotional mini game for Sonic's 20th Anniversary. It is an augmented reality game where users attempt to capture Sonic as he races around, usually too fast for human eyes to see.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-95RpFBeWJ0s/TwpCehQ81QI/AAAAAAAAANI/GchCrky_H18/s1600/IMG_1328.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-95RpFBeWJ0s/TwpCehQ81QI/AAAAAAAAANI/GchCrky_H18/s320/IMG_1328.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;We used the &lt;a href="http://poweredbystring.com/"&gt;String&lt;/a&gt; library for augmented reality image recognition handling, a library I highly recommend. String processes the camera input in real time and provides orientation matrices of any of the pre-defined images that are recognised. The app uses this information to render a 3D animated Sonic running through the scene, oriented relative to the marker with 3D perspective. Look at the marker straight on and Sonic runs past in front of you. Look at the marker from a sharp angle and it is possible to see Sonic running in from a distance (or running away into the distance, on the other side). &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-j9De33xD9Xg/Twqp2oY9pQI/AAAAAAAAANY/vwaWhfRO87c/s1600/IMG_1498.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-j9De33xD9Xg/Twqp2oY9pQI/AAAAAAAAANY/vwaWhfRO87c/s320/IMG_1498.PNG" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Update:&lt;/b&gt; Unfortunately the promotion has ended and the app is no longer available for download from the App Store. See an &lt;a href="http://www.appannie.com/sonic-vision-catch-the-blue/"&gt;archive of the app details&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-5178760162842738122?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/5178760162842738122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2012/01/working-with-famous-blue-hedgehog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/5178760162842738122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/5178760162842738122'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2012/01/working-with-famous-blue-hedgehog.html' title='Working With a Famous Blue Hedgehog'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-H3l3SiaFKwU/TwpCvn83tzI/AAAAAAAAANQ/xpOsjMKIFMM/s72-c/mzl.gyielvzd.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-8477536949283242212</id><published>2011-12-22T17:33:00.000-08:00</published><updated>2011-12-22T17:33:11.232-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>Cocoaheads Talk: Developing an iPad in-store interactive product browser</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Earlier in the year I was hired to build an interactive product browsing iPad app for a &lt;a href="http://www.jeanswest.com.au/"&gt;large clothing retailer&lt;/a&gt;. The app was deployed in brick &amp;amp;&amp;nbsp;mortar&amp;nbsp;stores, kiosk-style. It ended up being a technically interesting project, requiring simulation of bubble physics and careful optimisation to be able to quickly scrub full iPad screen resolution photographs of the modelled clothing, with panning and zooming up to 4x resolution. In total, 840 high resolution (4x) images were embedded.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pcdGLDqpUzQ/TvPV-CcUTkI/AAAAAAAAANA/86SwxoiRNlM/s1600/IMG_1185.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-pcdGLDqpUzQ/TvPV-CcUTkI/AAAAAAAAANA/86SwxoiRNlM/s320/IMG_1185.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In April 2011 I gave a talk at &lt;/span&gt;&lt;a href="http://www.melbournecocoaheads.com/in-store-interactive-product-browser/" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Melbourne Cocoaheads&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; about the project, detailing some of the technical challenges and how I solved them. You can &lt;/span&gt;&lt;a href="http://vimeo.com/groups/melbournecocoaheads/videos/22603382" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;watch this talk on Vimeo&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; (embedded below).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="224" mozallowfullscreen="" src="http://player.vimeo.com/video/22603382?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="398"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://vimeo.com/22603382"&gt;Cocoaheads April - Talk 3 - Chris Miles' iPad based in-store interactive product browser&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Proudly, the app won a&amp;nbsp;&lt;a href="http://www.thefwa.com/mobile/jeanswest-idenim-match-"&gt;FWA Mobile Of The Day (MOTD) Award&lt;/a&gt;&amp;nbsp;in October.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-8477536949283242212?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/8477536949283242212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/8477536949283242212'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/12/cocoaheads-talk-developing-ipad-in.html' title='Cocoaheads Talk: Developing an iPad in-store interactive product browser'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-pcdGLDqpUzQ/TvPV-CcUTkI/AAAAAAAAANA/86SwxoiRNlM/s72-c/IMG_1185.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-8934884660118972356</id><published>2011-07-11T15:06:00.000-07:00</published><updated>2011-07-11T15:06:45.570-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='core data'/><title type='text'>Core Data debugging with SQLite</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html"&gt;Core Data&lt;/a&gt; is designed to be a black box. Under the hood on iOS it (&lt;a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPersistentStores.html#//apple_ref/doc/uid/TP40002875-SW3"&gt;normally&lt;/a&gt;) uses a SQLite database for data persistance. The use of SQLite is an implementation detail and not one we are encouraged to worry about. However, in practice this detail can be very convenient and accessing the SQLite database directly can be a handy tool for debugging &amp;amp; testing. This post will describe how to do that.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Sample App&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;All the example code in this post can be found in a &lt;a href="https://github.com/chrismiles/OrganisingCoreData"&gt;demo app&lt;/a&gt;, introduced in the previous post,&amp;nbsp;&lt;a href="http://blog.chrismiles.info/2011/06/organising-core-data-for-ios.html"&gt;Organising Core Data for iOS&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Locating the Store&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In the app delegate class look for the method that creates the&amp;nbsp;NSPersistentStoreCoordinator. Apple's template has it in the&amp;nbsp;persistentStoreCoordinator method. &amp;nbsp;This is where the store path is passed to the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;NSPersistentStoreCoordinator (as a URL). Add an NSLog() statement to output the path to the console.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;For example, here is a snapshot of the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;persistentStoreCoordinator method as generated by Apple's template; I added the NSLog() line&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;- (NSPersistentStoreCoordinator *)persistentStoreCoordinator&lt;br /&gt;{&lt;br /&gt;    if (__persistentStoreCoordinator != nil)&lt;br /&gt;    {&lt;br /&gt;        return __persistentStoreCoordinator;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"OrganisingCoreData.sqlite"];&lt;br /&gt;    NSLog(@"Core Data store path = \"%@\"", [storeURL path]);&lt;br /&gt;&lt;br /&gt;    NSError *error = nil;&lt;br /&gt;    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];&lt;br /&gt;    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&amp;amp;error])&lt;br /&gt;    {&lt;br /&gt;    ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In the simulator you'll get output something like:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;2011-07-01 22:13:25.971 OrganisingCoreData[14217:207] Core Data store path = "/Users/chris/Library/Application Support/iPhone Simulator/4.3.2/Applications/22CD429E-ADD2-4AAA-9C9E-5E57828A6FF8/Documents/OrganisingCoreData.sqlite"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;SQLite&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Now you've got the Core Data store path, you can hand it to a SQLite client and poke around. Grab a GUI SQLite client if you like, but I recommend the &lt;a href="http://www.sqlite.org/sqlite.html"&gt;command-line client&lt;/a&gt; as it is built-in and easy to use. Open Terminal and run "sqlite3" pasting in the store path as argument.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;$ sqlite3 "/Users/chris/Library/Application Support/iPhone Simulator/4.3.2/Applications/22CD429E-ADD2-4AAA-9C9E-5E57828A6FF8/Documents/OrganisingCoreData.sqlite"&lt;br /&gt;-- Loading resources from /Users/chris/.sqliterc&lt;br /&gt;SQLite version 3.6.12&lt;br /&gt;Enter ".help" for instructions&lt;br /&gt;Enter SQL statements terminated with a ";"&lt;br /&gt;sqlite&amp;gt; .tables&lt;br /&gt;ZDVD          ZPERSON       Z_METADATA    Z_PRIMARYKEY&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;You can view all the database tables with the ".tables" command. You will see each Core Data entity represented by a table, named after the entity but prefixed with "Z" and all caps. My example app contains a Core Data model with two entities, DVD and Person (see model layout image below). In SQLite we see a table for each entity, "ZDVD" and "ZPERSON". You will also see two extra tables, "Z_METADATA" and "Z_PRIMARYKEY". These are used by Core Data for administration.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7Vdo3sLBfrw/TgRqeWxsRxI/AAAAAAAAAKU/hIGmA0mp2vY/s1600/entity-layout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-7Vdo3sLBfrw/TgRqeWxsRxI/AAAAAAAAAKU/hIGmA0mp2vY/s1600/entity-layout.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;You can examine the schema of each table with the ".schema" command. SQLite shows the "CREATE" command for each. This can be useful to see the types that Core Data picks for each field as well as how any indexes are configured.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;sqlite&amp;gt; .schema ZPERSON&lt;br /&gt;CREATE TABLE ZPERSON ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZUSERNAME VARCHAR, ZNAME VARCHAR );&lt;br /&gt;CREATE INDEX ZPERSON_ZUSERNAME_INDEX ON ZPERSON (ZUSERNAME);&lt;br /&gt;sqlite&amp;gt; .schema ZDVD&lt;br /&gt;CREATE TABLE ZDVD ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZOWNER INTEGER, ZPURCHASEDATE TIMESTAMP, ZTITLE VARCHAR );&lt;br /&gt;CREATE INDEX ZDVD_ZOWNER_INDEX ON ZDVD (ZOWNER);&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Tables contain a column for each entity attribute, names based on the attribute names, all caps and prefixed with "Z". Some extra administrative tables are also present, each prefixed with "Z_". You may also notice that&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;all tables automatically get a primary key as "Z_PK".&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Any one-to-one or one-to-many relationships are tracked in a column, like "ZOWNER" in the example. Many-to-many relationships are tracked in separate tables, automatically managed by Core Data.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;You can query the data using all the usual SQL commands.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sqlite&amp;gt; SELECT * FROM ZPERSON;&lt;br /&gt;Z_PK        Z_ENT       Z_OPT       ZUSERNAME   ZNAME      &lt;br /&gt;----------  ----------  ----------  ----------  -----------&lt;br /&gt;1           2           3           chris       Chris Miles&lt;/pre&gt;&lt;pre&gt;sqlite&amp;gt; SELECT ZUSERNAME,ZPURCHASEDATE,ZTITLE FROM ZDVD LEFT JOIN ZPERSON ON ZPERSON.Z_PK=ZDVD.ZOWNER WHERE ZUSERNAME='chris';&lt;br /&gt;ZUSERNAME   ZPURCHASEDATE  ZTITLE      &lt;br /&gt;----------  -------------  ------------&lt;br /&gt;chris       279979769      The Hangover&lt;br /&gt;chris       -61041031      Terminator 2&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;You can also modify the data, if care is taken not to invalidate any of the Core Data administrative fields, or create broken relationships or other broken states.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Recently I added a weekly progress graph to an iPhone project and part of the testing required data that was generated over the period of many weeks. Waiting a few weeks until real data was collected was out of the question, so I simulated accelerated use by repeatedly advancing the date field values by a few days at a time and restarting the app each time.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;For example, in my demo app I set a purchased date of 2009-11-15 for "The Hangover", which is stored as&amp;nbsp;279979769 (seconds since a reference date). &amp;nbsp;By accessing the Core Data store directly I can advance this date by one week with the SQL query:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;sqlite&amp;gt; UPDATE ZDVD SET ZPURCHASEDATE=ZPURCHASEDATE+(60*60*24*7) WHERE Z_PK=1;&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;After relaunching the app the purchased date is now shown as "2009-11-22".&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Core Data Faulting&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In my example above I mentioned relaunching the app after modifying the SQLite store directly. Modifying the store while the app is not running is the safest way to ensure changes will persist. However, it is not always necessary if you understand how and when Core Data reads and writes to the store.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Core Data tracks entity objects in memory but lazy loads the actual attribute values. The act of lazy loading is called faulting. If you modify an attribute value directly in the store and then a fault is fired for the corresponding managed object, the changed values will be loaded into memory. Managed objects will then persist in memory until no longer needed. Core Data assumes it has control of the store and will not attempt to load the managed object attribute values again until the object is invalidated and another fault is fired for it. So if you change a value after a managed object has already been populated for the record, the changes won't immediately appear. You will need to understand your managed object behaviour and lifetimes to work out when to expect the changes to be represented in memory.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Also be cautious not to make changes directly to the store while an app is running and then interact with the app in a way that commits changes to the database. If Core Data needs to update the record that you had modified, it will assume (rightly so under normal conditions) that it has exclusive control and will overwrite your sneaky changes with data from the in-memory managed objects.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Device Testing&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Accessing the Core Data SQLite store directly is easiest when developing in the Simulator, as demonstrated above. However, it is still possible to access the store file on the device. The simplest way is to enable iTunes file sharing for the app. Then you can copy the sqlite file out to the desktop to interact with directly. You can also modify it and copy it back to the device.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CLah2YEmDXw/ThMR94GFEuI/AAAAAAAAAKc/7n7SgXWSO2A/s1600/iTunes+file+sharing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-CLah2YEmDXw/ThMR94GFEuI/AAAAAAAAAKc/7n7SgXWSO2A/s1600/iTunes+file+sharing.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Enable iTunes file sharing for the app by editing the Info.plist for the app and adding "Application supports iTunes file sharing" (aka&amp;nbsp;UIFileSharingEnabled) with a boolean value of YES. Re-install the app and then connect to iTunes to get access to SQLite store file.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The use of SQLite as an underlying data store for Core Data is an implementation detail that can be used to our advantage when debugging and testing Core Data driven iOS apps.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Related&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Also see:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://blog.chrismiles.info/2011/06/organising-core-data-for-ios.html"&gt;Organising Core Data for iOS&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="https://github.com/chrismiles/OrganisingCoreData"&gt;OrganisingCoreData&lt;/a&gt; sample app on github&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-8934884660118972356?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/8934884660118972356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/07/core-data-debugging-with-sqlite.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/8934884660118972356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/8934884660118972356'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/07/core-data-debugging-with-sqlite.html' title='Core Data debugging with SQLite'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-7Vdo3sLBfrw/TgRqeWxsRxI/AAAAAAAAAKU/hIGmA0mp2vY/s72-c/entity-layout.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-6764421533633299722</id><published>2011-06-26T22:30:00.000-07:00</published><updated>2011-06-26T22:30:54.467-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='core data'/><title type='text'>Organising Core Data for iOS</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I rarely work on an iOS project that doesn't use &lt;a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html"&gt;Core Data&lt;/a&gt; for persistent data management. Over time I have settled on a strategy for organising Core Data and its Managed Object classes, which I will describe in this post. This information will hopefully be useful to those new to Core Data wondering how to organise things, as well as those more experienced interested in how other iOS devs work with Core Data.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I have created a little demo iPhone app that goes along with this post. &amp;nbsp;You can &lt;a href="https://github.com/chrismiles/OrganisingCoreData"&gt;get it from github&lt;/a&gt;. The app demonstrates how I organise and use Core Data in a real-world (although very simplified) app and demonstrates how to wire Core Data to table views, including automatically updating table content (with animation) when Core Data changes occur.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Model Layout&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Let's start by defining a very simple model. Assume we are building an app to track people's DVD collections (remember DVDs? If you are like me you ended up with a big pile of them gathering dust in a cupboard somewhere). We will define two entities, "Person" and "DVD", and link them together.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-7Vdo3sLBfrw/TgRqeWxsRxI/AAAAAAAAAKU/hIGmA0mp2vY/s1600/entity-layout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-7Vdo3sLBfrw/TgRqeWxsRxI/AAAAAAAAAKU/hIGmA0mp2vY/s1600/entity-layout.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Each person may own many DVDs so there is a one-to-many relationship between Person and DVD. The "username", "name" and "title" attributes are strings and "purchaseDate" is of type Date.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;NSManagedObject Subclasses&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;After laying out the model I then select each Entity and customise the Class name. This field sets the name of the Managed Object (&lt;a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html"&gt;NSManagedObject&lt;/a&gt;) subclass that will be tied to the Entity. &amp;nbsp;I have standardised on using the Entity name prefixed with "MO". So for Person I set a Class name of "MOPerson" and for "DVD" I set "MODVD".&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Pk4rzEWdqtk/TfhoJywhPJI/AAAAAAAAAJ0/uIr7vAv5qvE/s1600/Entity+Info.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Pk4rzEWdqtk/TfhoJywhPJI/AAAAAAAAAJ0/uIr7vAv5qvE/s1600/Entity+Info.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Actual code for the NSManagedObject subclasses are created by selecting the Entities and choosing the "Editor / Create NSManagedObject Subclass..." menu item.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-phyPIbqBKNY/TfiUsGRxlvI/AAAAAAAAAKA/Pg72XM3n54g/s1600/Create+NSManagedObject+Subclass.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-phyPIbqBKNY/TfiUsGRxlvI/AAAAAAAAAKA/Pg72XM3n54g/s1600/Create+NSManagedObject+Subclass.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Times; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I organise all my model code into a "Model" group and place the auto created&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;NSManagedObject subclasses in a "Managed Objects" sub group. Note that after creating the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;NSManagedObject subclass files I never touch them. I consider them to be "owned" by Core Data. The main advantage of this strategy is that I can change the model layout and re-generate the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;NSManagedObject subclasses at any time during development, without risk of losing customisations.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Model Interface&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;My general rule of thumb is to encapsulate all the Core Data queries in the model code. The rest of the project accesses the model via this interface and generally doesn't talk to Core Data directly (other than working with the Managed Object subclasses). This helps keep the "M" separate from the "V" &amp;amp; "C".&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;So, if I don't touch the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;NSManagedObject subclass files how do I customise the interface? &amp;nbsp;I use our good friend the Objective-C Category. I define a "Management" category for each Managed Object that provides the API for the rest of the project to work with, including inserting, fetching and deleting records from the database.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Furthermore, to keep the Management category methods as short and simple as possible (aiming for &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt;) I define a bunch of helper functions containing the common Core Data query logic. See &lt;a href="https://gist.github.com/1039699"&gt;ModelUtil.h/ModelUtil.m&lt;/a&gt; for these convenience functions. &amp;nbsp;You'll see that they centralise access to the "default" Managed Object Context, which is the NSManagedObjectContext on the main thread created by the application delegate if you use Apple's application templates. &amp;nbsp;They are mostly very simple functions, but are reusable across projects and reduce repetition.&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kEtzp9z6Em4/TgSah269paI/AAAAAAAAAKY/sM9GTeZwWv4/s1600/Model+Group.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-kEtzp9z6Em4/TgSah269paI/AAAAAAAAAKY/sM9GTeZwWv4/s1600/Model+Group.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;With all that in place the NSManagedObject category methods are written specifically for the application needs. For the demo project MOPerson (Management) contains class methods to insert and retrieve MOPerson instances. The implementation looks like:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;static NSString *entityName = @"Person";&lt;br /&gt;&lt;br /&gt;@implementation MOPerson ( Management )&lt;br /&gt;&lt;br /&gt;+ (MOPerson *)insertPersonWithUsername:(NSString *)username&lt;br /&gt;                                  name:(NSString *)name&lt;br /&gt;                  managedObjectContext:(NSManagedObjectContext *)moc&lt;br /&gt;{&lt;br /&gt;    MOPerson *person = (MOPerson *)[NSEntityDescription&lt;br /&gt;                                    insertNewObjectForEntityForName:entityName&lt;br /&gt;                                    inManagedObjectContext:moc];&lt;br /&gt;    person.username = username;&lt;br /&gt;    person.name = name;&lt;br /&gt;    &lt;br /&gt;    return person;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (MOPerson *)insertPersonWithUsername:(NSString *)username&lt;br /&gt;                                  name:(NSString *)name&lt;br /&gt;{&lt;br /&gt;    NSManagedObjectContext *moc = defaultManagedObjectContext();&lt;br /&gt;    return [MOPerson insertPersonWithUsername:username&lt;br /&gt;                                         name:name&lt;br /&gt;                         managedObjectContext:moc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (MOPerson *)personWithUsername:(NSString *)username&lt;br /&gt;{&lt;br /&gt;    NSPredicate *predicate = [NSPredicate&lt;br /&gt;                              predicateWithFormat:@"username == %@",&lt;br /&gt;                              username];&lt;br /&gt;    &lt;br /&gt;    NSArray *sortDescriptors = [NSArray arrayWithObject:&lt;br /&gt;                                [NSSortDescriptor sortDescriptorWithKey:@"username"&lt;br /&gt;                                                              ascending:YES]];&lt;br /&gt;    &lt;br /&gt;    MOPerson *person = (MOPerson *)fetchManagedObject(entityName,&lt;br /&gt;                                                      predicate,&lt;br /&gt;                                                      sortDescriptors,&lt;br /&gt;                                                      defaultManagedObjectContext());&lt;br /&gt;    &lt;br /&gt;    return person;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In our application code, fetching the MOPerson instance for a particular username is as simple as: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;MOPerson *person = [MOPerson personWithUsername:username];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;which will return nil if not found.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Inserting a new Person instance in the database is one line followed by a request to the Managed Object Context to commit all changes:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;MOPerson *person = [MOPerson insertPersonWithUsername:username name:name];&lt;br /&gt;&lt;br /&gt;if (!commitDefaultMOC()) {&lt;br /&gt;    // handle error&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In a more interesting project the Management categories may also contain instance methods to customise attribute access or validation, for example.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To see a working example of all this get the &lt;a href="https://github.com/chrismiles/OrganisingCoreData"&gt;demo app source code&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Summary&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;This is how I organise Core Data in my iOS projects.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;None of this is rocket science but standardising on a strategy for organising Core Data will help keep your projects tidy and maintainable. I am interested to see how other iOS devs organise Core Data in their projects so I can continue to improve my practice. In future posts I will share some more of my experiences with Core Data on iOS.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-6764421533633299722?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/6764421533633299722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/06/organising-core-data-for-ios.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/6764421533633299722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/6764421533633299722'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/06/organising-core-data-for-ios.html' title='Organising Core Data for iOS'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-7Vdo3sLBfrw/TgRqeWxsRxI/AAAAAAAAAKU/hIGmA0mp2vY/s72-c/entity-layout.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-641009070565291564</id><published>2011-06-21T00:07:00.000-07:00</published><updated>2011-06-21T00:07:08.285-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='locayta'/><title type='text'>Locayta Notes 2.1</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZCNrJaElsPc/TgAmfT2qNuI/AAAAAAAAAKE/7hr0p9N9aqs/s1600/mzl.qjjntdre.320x480-75.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-ZCNrJaElsPc/TgAmfT2qNuI/AAAAAAAAAKE/7hr0p9N9aqs/s320/mzl.qjjntdre.320x480-75.jpg" width="222" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Locayta Notes on iPhone&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;One of my projects for &lt;a href="http://www.locayta.com/"&gt;Locayta Limited&lt;/a&gt; has been the development of &lt;a href="http://itunes.apple.com/gb/app/locayta-notes-free-text-editor/id393819477?mt=8"&gt;Locayta Notes for iPhone &amp;amp; iPad&lt;/a&gt;. We just launched another big update to the free notes app that already includes full text search and Dropbox syncing. The new update, version 2.1, adds many enhancements across the board, including improvements to how notes are synced to Dropbox:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Better default note filenames ("Note 2011-06-21.txt");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Note filename renaming;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The Dropbox folder to sync notes with can be selected and changed at any time;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;These enhancements help improve Locayta Notes as a general text editor for files within Dropbox. Notes are synced to Dropbox as plain text files, meaning they can be easily viewed and edited on a desktop computer or other device. Plain text files added to the Dropbox folder from any device will automatically show up in Locayta Notes as an editable note.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;We also added:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Notes can be sorted by date, title or filename;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Background colour can be customised per note;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Matched search terms quick jump in iPhone UI (was already in iPad);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Improvements to syncing logic and&amp;nbsp;non UTF-8&amp;nbsp;character set handling.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Locayta Notes started out as a simple showcase app for &lt;a href="http://www.locayta.com/iOS-search-engine/locayta-search-mobile/locayta-search-mobile"&gt;Locayta Search Mobile&lt;/a&gt;, a port of Locayta's full text search library to the iOS platform (and one of my other projects). Since then it has grown to become a fully featured productivity app in its own right. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ujk28_OKNSE/TgAmgBTPlBI/AAAAAAAAAKI/uh1QT5IgrRQ/s1600/mzl.yipomrjh.480x480-75.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-ujk28_OKNSE/TgAmgBTPlBI/AAAAAAAAAKI/uh1QT5IgrRQ/s400/mzl.yipomrjh.480x480-75.jpg" width="305" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Locayta Notes on iPad&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Locayta Notes is &lt;a href="http://itunes.apple.com/gb/app/locayta-notes-free-text-editor/id393819477?mt=8"&gt;free in the App Store&lt;/a&gt; as a universal app for iPad/iPhone/iPod Touch.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes-free-text-editor/id393819477?mt=8"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-_AJxzjuHNKo/TgAm-nDK3ZI/AAAAAAAAAKM/EHO6Oc27sxI/s1600/Available+on+App+Store.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-641009070565291564?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/641009070565291564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/06/locayta-notes-21.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/641009070565291564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/641009070565291564'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/06/locayta-notes-21.html' title='Locayta Notes 2.1'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZCNrJaElsPc/TgAmfT2qNuI/AAAAAAAAAKE/7hr0p9N9aqs/s72-c/mzl.qjjntdre.320x480-75.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-4184429056481305841</id><published>2011-05-22T21:02:00.000-07:00</published><updated>2011-05-22T21:02:07.060-07:00</updated><title type='text'>CMPopTipView - new animation option</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0xubSfAtkgY/TdiVFMkx64I/AAAAAAAAAJo/KM7PfaTFDY8/s1600/screen-capture-1.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-0xubSfAtkgY/TdiVFMkx64I/AAAAAAAAAJo/KM7PfaTFDY8/s320/screen-capture-1.png" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In December I &lt;a href="http://chrismiles-tech.blogspot.com/2010/12/cmpoptipview-custom-popup-view-for-ios.html"&gt;introduced&lt;/a&gt;&amp;nbsp;a custom iOS UIView:&amp;nbsp;&lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;CMPopTipView&lt;/a&gt;, a view for presenting targeted tips or callout views.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;CMPopTipView got a small update recently, a new presentation animation style submitted by &lt;a href="https://github.com/myell0w"&gt;myell0w&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The default animation style I originally implemented was a simple slide into place while fading in effect. Subtle, nice. This is still the default.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The new animation style option is a pop out style animation, like iOS UIAlertViews. This style could be useful when you need to catch the user's attention.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To enable the pop out style animation set the animation property to&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;CMPopTipAnimationPop&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;. For example:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;CMPopTipView *popTipView = [[[CMPopTipView alloc] initWithMessage:@"My message"] autorelease];&lt;br /&gt;popTipView.animation = CMPopTipAnimationPop;&lt;br /&gt;popTipView.delegate = self;&lt;br /&gt;[popTipView presentPointingAtView:button inView:self.view animated:YES];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Get &lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;CMPopTipView from github&lt;/a&gt; or read more details about this update from the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="https://github.com/chrismiles/CMPopTipView/pull/1"&gt;pull request&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/nul9VA_QsGI" width="425"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-4184429056481305841?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/4184429056481305841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/05/cmpoptipview-new-animation-option.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/4184429056481305841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/4184429056481305841'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/05/cmpoptipview-new-animation-option.html' title='CMPopTipView - new animation option'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-0xubSfAtkgY/TdiVFMkx64I/AAAAAAAAAJo/KM7PfaTFDY8/s72-c/screen-capture-1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-3791503778725764479</id><published>2011-05-15T15:16:00.000-07:00</published><updated>2012-01-25T22:30:31.294-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='river level'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><title type='text'>River Level 1.1</title><content type='html'>&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://itunes.apple.com/au/app/river-level/id356158594?mt=8" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-3j7evjXboj4/Tc6KBA15KJI/AAAAAAAAAJY/WI_aNDVnfSk/s320/Screenshot+2011.05.14+23.50.29.jpg" width="226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I recently updated &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://itunes.apple.com/au/app/river-level/id356158594?mt=8"&gt;River Level for iPhone&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; to version 1.1. The main feature added to 1.1 is the ability to customise the units of measurement. Specifically:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;River depth: meters or feet;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Water temperature: celsius or&amp;nbsp;fahrenheit&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;River Level was created in Australia, initially for NSW waterways, so had only shown measurements in meters &amp;amp; celsius. After the addition of USA rivers boosted the app's popularity in America the option for feet/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;fahrenheit&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;was requested by a lot of American users (understandably) so I was happy to find some time to add the option.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Units of measurement can be customised by going to system Settings / River Level.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To make the user experience even smoother, the first river you add determines the default units of measurement. So if the first river you add is an American river, the units automatically default to feet/&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;fahrenheit. This should remove the need for most users to access Settings.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/river-level/id356158594?mt=8"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-pvqD251wLxM/Tc6KBjc83fI/AAAAAAAAAJc/ZgJ_9_TBUGw/s320/Screenshot+2011.05.14+23.50.46.jpg" width="222" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;River Level is free in the App Store.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/river-level/id356158594?mt=8"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-0E4fZ23JWUM/TdBQW9wW1LI/AAAAAAAAAJg/Hjhe9CMyZWQ/s1600/Available+on+App+Store.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-3791503778725764479?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/3791503778725764479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/05/river-level-11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/3791503778725764479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/3791503778725764479'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/05/river-level-11.html' title='River Level 1.1'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3j7evjXboj4/Tc6KBA15KJI/AAAAAAAAAJY/WI_aNDVnfSk/s72-c/Screenshot+2011.05.14+23.50.29.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-2805258047539326609</id><published>2011-04-06T23:39:00.000-07:00</published><updated>2011-09-22T05:03:13.314-07:00</updated><title type='text'>Swap It Don't Stop It iPhone app</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://swapit.gov.au/start-swapping/swap-it-iphone-app" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-uUdjQo3H5fs/TZxJvLOOaLI/AAAAAAAAAJA/zN7gjv38LbQ/s400/iphone_swapit.png" width="225" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;My recent handy work is out in the wild in the form of the &lt;a href="http://swapit.gov.au/start-swapping/swap-it-iphone-app"&gt;Swap It Don't Stop It iPhone app&lt;/a&gt; for a new Australian Government health campaign.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The &lt;a href="http://swapit.gov.au/"&gt;Swap It Don't Stop It&lt;/a&gt; campaign is all about educating and encouraging people to swap unhealthy food and unproductive activities for those that can improve your overall health &amp;amp; fitness.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The iPhone app provides a tool for tracking your "swaps", gaining achievements, receiving alerts to be reminded when to swap, tracking food swaps (with an integrated shopping list) and finding healthy activities near you.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Technically, the app required:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Custom views to match the attractive design;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Core animation for some custom transitions and UI elements;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Server side REST API integration;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;MapKit and Location Services along with SOAP API integration for finding activities by location;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Core Data for local data management;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Push notifications for alerts;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Retina display optimisation.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The app looks really great and is free on the Australian App Store. I was very happy with how it turned out.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I developed the app on behalf of the great guys at &lt;a href="http://millipede.com.au/"&gt;Millipede Creative Development&lt;/a&gt; and &lt;a href="http://www.jwt.com/#!/content/50499/jwt-melbourne"&gt;JWT Melbourne&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/swap-it-dont-stop-it/id425100181?mt=8"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-XnZWzAm5wpY/TZxG6XoWBgI/AAAAAAAAAI8/R5do4ofrWNw/s1600/Available+on+App+Store.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-2805258047539326609?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/2805258047539326609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/04/swap-it-dont-stop-it-iphone-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2805258047539326609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2805258047539326609'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/04/swap-it-dont-stop-it-iphone-app.html' title='Swap It Don&apos;t Stop It iPhone app'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-uUdjQo3H5fs/TZxJvLOOaLI/AAAAAAAAAJA/zN7gjv38LbQ/s72-c/iphone_swapit.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-4651513640474776654</id><published>2011-04-03T22:41:00.000-07:00</published><updated>2011-04-03T22:43:12.755-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><title type='text'>iOS Dev, Beta &amp; Production builds installed side-by-side</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;A development and testing pattern I adopted early on for my iOS projects was to configure projects such that development, ad hoc test and release builds could all be installed on my device at the same time. This allows for side-by-side testing and easy comparison of the builds, each being at different states of completion at any point in time.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;For example, this iPhone screen snapshot demonstrates dev, beta &amp;amp; release builds of my hobby project &lt;a href="http://itunes.apple.com/au/app/river-level/id356158594?mt=8"&gt;River Level&lt;/a&gt; installed side-by-side.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Mg5y-7rAPxg/TZMkrTndT6I/AAAAAAAAAIk/g33nPFLtYiE/s1600/riverlevelbuilds.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Mg5y-7rAPxg/TZMkrTndT6I/AAAAAAAAAIk/g33nPFLtYiE/s1600/riverlevelbuilds.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Dev, beta &amp;amp; release builds of River Level installed side-by-side&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;iOS differentiates apps by their &lt;b&gt;Bundle Identifiers&lt;/b&gt; (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CFBundleIdentifier&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;) which are defined in the Project-Info.plist. &amp;nbsp;A Bundle Identifier looks like a reverse DNS address, e.g. "com.apple.safari". What I like to do is to set the Bundle Identifier to different values for each build configuration, thus allowing each to be installed separately. I don't do this manually, though, as I'll explain below.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Note that some iOS features – like Push Notifications, Game Center and In-App Purchase – require the Bundle Identifier to match the value configured in iTunes Connect so you can test these features. In those cases this technique won't be effective, unless you set up multiple app instances in iTunes Connect for each build configuration.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The other parameter I customise per build configuration is the &lt;b&gt;Bundle Display Name&lt;/b&gt; (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CFBundleDisplayName&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;). This is the app name as displayed on the home screen. iOS doesn't require these names to be unique, so if you changed the Bundle Identifiers without changing the Display Names you would end up with multiple instances of your app all with the same name and icon, making it difficult to work out which build is which.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;My convention is to append "∆" to dev builds and "ß" to ad hoc builds.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To customise the Bundle Identifier and Bundle Display Name per build the process is:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Append &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;${BUNDLE_ID_SUFFIX}&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; to the "Bundle identifier" in Project-Info.plist.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Append&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;${BUNDLE_DISPLAY_NAME_SUFFIX}&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; to the "Bundle display name"&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;in Project-Info.plist.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CeHyjTW4BYk/TZUjBWumf-I/AAAAAAAAAIs/l8Vx6zdQmuY/s1600/screen-capture+highlight.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/-CeHyjTW4BYk/TZUjBWumf-I/AAAAAAAAAIs/l8Vx6zdQmuY/s640/screen-capture+highlight.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Custom variables appended to Bundle Display Name and Bundle Identifier values&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Note that with no other changes these variables will be expanded to empty strings and so will have no effect. This is how I handle Release builds, so they are submitted to the App Store with standard values.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The next step is to define the custom values for each build configuration. &amp;nbsp;My convention is: &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Development (Debug) builds:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;BUNDLE_DISPLAY_NAME_SUFFIX=∆&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;BUNDLE_ID_SUFFIX=.dev&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Ad Hoc builds:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;BUNDLE_DISPLAY_NAME_SUFFIX=ß&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;BUNDLE_ID_SUFFIX=.adhoc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Release builds:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;Neither of these settings is defined.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The place to put these settings is in each relevant&amp;nbsp;&lt;b&gt;Build Configuration&lt;/b&gt; of the Project. Note: some people edit the build configuration for their Target, but I recommend only doing this if you need a setting specifically for a build target. &amp;nbsp;If you only have one target, edit the build settings for the whole Project. &amp;nbsp;That way, if you add Targets later they will inherit the Project build settings.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To add custom settings to build configurations, in Xcode 3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Select menu "Project" / "Edit Project Settings"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Select "Build" tab&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Select a build configuration in the Configuration list (e.g. "Debug")&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Select "Add User-Defined Setting" from the command list (bottom left corner pulldown)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Add a user-defined setting for each of "&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;BUNDLE_DISPLAY_NAME_SUFFIX&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;" and "&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;BUNDLE_ID_SUFFIX&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;" with the values you choose.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Repeat this for each build configuration that you want to install separately to the others.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-nq2qN6elGGs/TZUovltUrKI/AAAAAAAAAIw/AVFxekAW9pM/s1600/screen-capture-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-nq2qN6elGGs/TZUovltUrKI/AAAAAAAAAIw/AVFxekAW9pM/s1600/screen-capture-1.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;User-defined settings for a Debug build configuration&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In Xcode 4, the process is similar, although the UI has changed. &amp;nbsp;Select your project; select the "Build Settings" tab, then select "Add Build Setting"/"Add User-Defined Setting". You can set the values for Debug and Ad Hoc at the same time with the new UI.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To see any user-defined settings, scroll the build settings table to the bottom; or use the "Show" list to filter only "User-Defined Settings" (Xcode 3).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To delete a user-defined setting, highlight the setting and hit the delete key.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;That's it. Now re-build and install and the app should appear separately to the other builds. Feel free to install as many different builds as you feel like.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-4651513640474776654?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/4651513640474776654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/04/ios-dev-beta-production-builds.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/4651513640474776654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/4651513640474776654'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/04/ios-dev-beta-production-builds.html' title='iOS Dev, Beta &amp; Production builds installed side-by-side'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Mg5y-7rAPxg/TZMkrTndT6I/AAAAAAAAAIk/g33nPFLtYiE/s72-c/riverlevelbuilds.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-7723743732104779893</id><published>2011-03-08T01:42:00.000-08:00</published><updated>2012-01-25T22:31:44.026-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iRaspberry 1.6</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Recently I had the pleasure of working with the &lt;a href="http://lycettebros.com/"&gt;Lycette Bros&lt;/a&gt;, hired to update their cool iRaspberry iPhone apps (App Store: &lt;a href="http://itunes.apple.com/au/app/iraspberry-lite/id338962453?mt=8"&gt;iRaspberry Lite&lt;/a&gt; [free], &lt;a href="http://itunes.apple.com/au/app/iraspberry-pro/id376304161?mt=8"&gt;iRaspberry Pro&lt;/a&gt; [AU$1.19]).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;iRaspberry is a simple but fun concept that has your iPhone stand-in for your mouth expressions! It comes with a load of video clips of various mouths performing raspberries, tongue pokes, kisses and other actions and you simply choose an action and hold it in front of your mouth to really show people how you feel about them.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/iraspberry-lite/id338962453?mt=8"&gt;&lt;img border="0" height="213" src="http://a6.mzstatic.com/us/r1000/041/Purple/e8/45/ac/mzl.ycvseoiz.320x480-75.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I helped the Lycette Bros produce the 1.6 release, which added a bunch of new video clips, updated the video handling &amp;amp; in-app purchase code for iOS SDK 4.x and added iAds to the free lite version.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;iRaspberry is also available on Android (Android Market: &lt;a href="https://market.android.com/details?id=com.lycettebros.android.iRaspberryLite"&gt;iRaspberry Lite&lt;/a&gt; [free],&amp;nbsp;&lt;a href="https://market.android.com/details?id=com.lycettebros.android.iRaspberryPro"&gt;iRaspberry Pro&lt;/a&gt; [AU$1.00]).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/iraspberry-lite/id338962453?mt=8"&gt;&lt;img border="0" src="https://lh5.googleusercontent.com/-WCi2Iy7YuaM/TXX44Z7Sw3I/AAAAAAAAAH4/eo9xFQEYWh8/s1600/Available+on+App+Store.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-7723743732104779893?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/7723743732104779893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/03/iraspberry-16.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/7723743732104779893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/7723743732104779893'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/03/iraspberry-16.html' title='iRaspberry 1.6'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-WCi2Iy7YuaM/TXX44Z7Sw3I/AAAAAAAAAH4/eo9xFQEYWh8/s72-c/Available+on+App+Store.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-5885786947794365579</id><published>2011-03-03T14:41:00.000-08:00</published><updated>2011-03-03T14:48:53.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>git sharing with dropbox</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I recently posted about using &lt;a href="https://www.dropbox.com/"&gt;Dropbox&lt;/a&gt; as a &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; server:&amp;nbsp;&lt;a href="http://chrismiles-tech.blogspot.com/2011/01/git-push-dropbox.html"&gt;git push dropbox&lt;/a&gt;. &amp;nbsp;I have since refined this process as I became more familiar with git and fine tuned my development workflow. So here's an update on how I now use Dropbox to both share and backup my git repositories.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;(note: in the examples below "$" is the bash prompt; all commands are entered in the OS X Terminal. I'm very much an old school UNIX command-line guy! However, on other platforms, all commands will be possible from your favourite git client.)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Initialise a git repository for Project, if one does not already exist:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ cd Project&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git init .&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git commit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Create a git server repository in Dropbox. &amp;nbsp;It is initialised as "bare" which means it won't hold a working copy of the repository. It is a shared repository only.&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ mkdir ~/Dropbox/git-server/Project.git&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git init --bare &amp;nbsp;~/Dropbox/git-server/Project.git&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;In the local repository, add the Dropbox repository as the remote origin then push the current branch up to it.&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git remote add origin ~/Dropbox/git-server/Project.git&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git push origin master&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;That's all there is to sharing and backing up your project repository. &amp;nbsp;Whenever you need to (I generally do it after every commit) you can "&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git push origin master&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;" again to update the Dropbox repository.&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;On another computer, to clone a copy of the project repository from Dropbox:&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git clone ~/Dropbox/git-server/Project.git&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ cd&amp;nbsp;Project&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git status&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;To update a clone from the Dropbox server:&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Times; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git pull origin master&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Too easy!&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Some other useful commands for examining the remote repositories:&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git remote&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;$ git remote show origin&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;And note that you can add other remote repositories. &amp;nbsp;So you could add a github repository so you can selectively push stable snapshots of your project to github for public consumption, while keeping work-in-progress commits stored locally and backed up in Dropbox.&lt;/div&gt;&lt;div style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-5885786947794365579?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/5885786947794365579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/03/git-sharing-with-dropbox.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/5885786947794365579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/5885786947794365579'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/03/git-sharing-with-dropbox.html' title='git sharing with dropbox'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-8921887355342386559</id><published>2011-02-24T00:03:00.000-08:00</published><updated>2012-01-25T22:32:30.113-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='locayta'/><title type='text'>Locayta Search Mobile for iOS beta5</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;At &lt;a href="http://www.locayta.com/"&gt;Locayta&lt;/a&gt; we recently released beta5 of the &lt;a href="http://www.locayta.com/iOS-search-engine/locayta-search-mobile/locayta-search-mobile"&gt;Locayta Search Mobile&lt;/a&gt; full text search library for iOS. &amp;nbsp;This may be the last beta as we prepare for the 1.0 release soon.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Beta5 included the usual bugfixes and improvements to memory usage. &amp;nbsp;It also included a new feature that assists with search results display. The feature allows you to fetch the character ranges of all terms in a text field that were matched by a search result.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;This feature isn't as simple as it sounds, due to the search engine's ability to infer relevant document terms by spell correcting, stemming or synonym expansion of query terms. &amp;nbsp;This means that terms matched in a document aren't necessarily the same as those in a query. The new character range fetching exposes this information so you can clearly highlight the term "test" in a document that matched the search term "testing", for example.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Here are some more examples. &amp;nbsp;Assume a note contains the line of text:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;These notes are just for testing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Each of these search queries would match this note by the highlighted terms:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;"test note" :&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;These &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;notes&lt;/b&gt;&lt;/span&gt; are just for &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;testing&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;"test notr" :&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;These&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;notes&lt;/b&gt;&lt;/span&gt;&amp;nbsp;are just for&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;testing&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: small;"&gt;"I am not testing" :&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;These&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;notes&lt;/b&gt;&lt;/span&gt;&amp;nbsp;are just for&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;testing&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;i.e. the same document terms were matched by each query, however in some cases stemming or spelling correction was required to get the match.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pkrFSAO6w4k/TWTj6ZJKGVI/AAAAAAAAAH0/1pqnYeuQeZU/s1600/screen-capture-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://3.bp.blogspot.com/-pkrFSAO6w4k/TWTj6ZJKGVI/AAAAAAAAAH0/1pqnYeuQeZU/s640/screen-capture-2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Another example: consider a note containing this line of text:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;My Christmas list&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;With an explicit synonym defined to expand "xmas" as "christmas", a search for "xmas" would match the document on the term "christmas":&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;"xmas" :&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;My &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;b&gt;Christmas&lt;/b&gt;&lt;/span&gt; list&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gohDv4OVh9g/TWTj53fkKLI/AAAAAAAAAHw/meDdU3EoZ7E/s1600/screen-capture-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://4.bp.blogspot.com/-gohDv4OVh9g/TWTj53fkKLI/AAAAAAAAAHw/meDdU3EoZ7E/s640/screen-capture-1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Using the character range fetching feature for matching search terms gives you the information needed to highlight or find search terms in your documents. &amp;nbsp;This is demonstrated in &lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477?mt=8"&gt;Locayta Notes 2.0&lt;/a&gt; (free in the App Store). &amp;nbsp;The screenshots above are from Locayta Notes, demonstrating the examples.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-8921887355342386559?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/8921887355342386559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/02/locayta-search-mobile-for-ios-beta5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/8921887355342386559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/8921887355342386559'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/02/locayta-search-mobile-for-ios-beta5.html' title='Locayta Search Mobile for iOS beta5'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-pkrFSAO6w4k/TWTj6ZJKGVI/AAAAAAAAAH0/1pqnYeuQeZU/s72-c/screen-capture-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-2354326325219662738</id><published>2011-02-09T15:41:00.000-08:00</published><updated>2012-01-25T22:33:19.586-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='locayta'/><title type='text'>Locayta Notes 2.0</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477?mt=8"&gt;&lt;img border="0" height="320" src="http://a7.phobos.apple.com/us/r1000/052/Purple/a5/29/13/mzl.dwigadmt.480x480-75.jpg" width="244" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477?mt=8"&gt;Locayta Notes on iPad&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;One of my primary projects for &lt;a href="http://www.locayta.com/"&gt;Locayta&lt;/a&gt; has been the development of the &lt;a href="http://www.locayta.com/iOS-search-engine/locayta-search-mobile/locayta-search-mobile"&gt;Locayta Search Mobile&lt;/a&gt; full text search library for iOS. &amp;nbsp;As part of that work I built a note taking / text editing app for iPad/iPhone that helped us show off embedded full text search on mobile devices. Recently I got the chance to add some significant functional enhancements to this app, which has now been released: &lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477?mt=8"&gt;Locayta Notes 2.0&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The biggest feature in Locayta Notes 2.0 is integration with &lt;a href="https://www.dropbox.com/"&gt;Dropbox&lt;/a&gt; which will automatically sync all your notes across all your iOS devices. &amp;nbsp;Notes will also be accessible as plain text files in Dropbox on your linked computers. This feature has been extremely handy for me personally, which made Locayta Notes become my primary note taking app on my iPad &amp;amp; iPhone.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;But that's not all, here's the full list of features in Locayta Notes 2.0:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Instantly search the contents of all notes using Locayta's embedded full text search engine, Locayta Search Mobile. Includes smart search features such as automatic spell correction, synonyms, stemming and context snippets.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Dropbox syncing to automatically sync notes between all your iPads, iPhones and computers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477?mt=8"&gt;&lt;img border="0" height="320" src="http://a5.phobos.apple.com/us/r1000/027/Purple/02/85/89/mzl.dizjalsu.320x480-75.jpg" width="222" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477?mt=8"&gt;Locayta Notes on iPhone&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Customise the text colour, size &amp;amp; font per note. Change the default text style.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Full support for printing notes with AirPrint (iOS 4.2+).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Full iOS 4.0 multitasking. Search index updates and Dropbox syncing tasks will complete in the background if the app is closed.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Share notes via email without leaving the app.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Universal app for both iPad and iPhone.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;• Free and ad-free!&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The last "feature" is important. Locayta Notes is and will remain free, as it helps Locayta promote the Locayta Search Mobile full text search library on iOS devices.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Get &lt;a href="http://www.locayta.com/iOS-search-engine/locayta-search-mobile/locayta-search-mobile"&gt;Locayta Search Mobile here&lt;/a&gt;. It is free to download and develop with.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;btw, Locayta Notes 1.0 was &lt;a href="https://github.com/locayta/LocNotes"&gt;open sourced on github&lt;/a&gt;, as a resource for Locayta Search Mobile developers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-2354326325219662738?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/2354326325219662738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/02/locayta-notes-20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2354326325219662738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2354326325219662738'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/02/locayta-notes-20.html' title='Locayta Notes 2.0'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-6437932049201632431</id><published>2011-02-02T18:27:00.000-08:00</published><updated>2012-01-25T22:33:41.751-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gamedev'/><category scheme='http://www.blogger.com/atom/ns#' term='janken battle'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Janken Battle</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/janken-battle/id392609190?mt=8"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_b8UTByWaKjs/TTyuWHPXZnI/AAAAAAAAAHc/DYf58rfBWVQ/s320/iPhone+Screenshot+3.jpeg" width="212" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/janken-battle/id392609190?mt=8"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Janken Battle: Paper beats Rock!&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I recently released a novelty iPhone game to the App Store: &lt;a href="http://itunes.apple.com/au/app/janken-battle/id392609190?mt=8"&gt;Janken Battle&lt;/a&gt;. &amp;nbsp;It is a networked Rock Paper Scissors simulator. You connect to an opponent, either nearby with Bluetooth, or anywhere in the world by Game Center matchup. To play, simply shake the device 3 times, like the kids do in real life. The game handles the rest! &amp;nbsp;On the 3rd shake, a result is chosen for you and matched against your opponent's result to determine the winner. &amp;nbsp;The game keeps track of scoring until the end of 3 to 9 rounds.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The result (rock, paper or scissors) is chosen randomly, with equal waiting for the 3 choices by default as you would expect. &amp;nbsp;However, an option for "advanced" users (if you could call them that) allows you to change the percentages, skewing the result towards your preferred choice. &amp;nbsp;Or, select a result outright by swinging the percentage to 100% for that choice, leaving the others at 0%.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/janken-battle/id392609190?mt=8"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_b8UTByWaKjs/TUlG6pI6t5I/AAAAAAAAAHk/mpAzyd2t6ek/s320/screenshot+strategy.png" width="213" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/au/app/janken-battle/id392609190?mt=8"&gt;Janken Battle: Strategy control &lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;This release of the game is really a prototype of an idea I had and a good excuse to play around with and learn the iOS &lt;a href="http://www.apple.com/game-center/"&gt;Game Center&lt;/a&gt; &amp;amp; &lt;a href="http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html"&gt;GameKit&lt;/a&gt; APIs.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;One of my goals is to see how many modern game&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;features and&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;technologies I can fit into a Rock Paper Scissors game! &amp;nbsp;It already has:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;• Bluetooth wireless play&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;• Remote Internet play&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;• Live in-game voice chat&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;• Online Leaderboards&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;• Achievements&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;The graphics &amp;amp; sound (and let's face it, gameplay) are still fairly basic, just what I could put together to get a release out the door. I have a bunch of interesting ideas in mind which should really enhance the game and novelty factor, assuming I get a chance to implement them. &amp;nbsp;I will probably push them out incrementally as time permits.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;For now, Janken Battle is free, so no excuses not to grab it for a quick play. I have embedded iAds while I consider options for how best to monetize enhanced versions down the line.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-6437932049201632431?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/6437932049201632431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/02/janken-battle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/6437932049201632431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/6437932049201632431'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/02/janken-battle.html' title='Janken Battle'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_b8UTByWaKjs/TTyuWHPXZnI/AAAAAAAAAHc/DYf58rfBWVQ/s72-c/iPhone+Screenshot+3.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-3489017811488305172</id><published>2011-01-18T22:25:00.000-08:00</published><updated>2012-01-25T22:34:24.863-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>git push dropbox</title><content type='html'>&lt;style type="text/css"&gt;p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Osaka}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Osaka; min-height: 11.0px}&lt;/style&gt;   &lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; is great and &lt;a href="https://www.dropbox.com/"&gt;Dropbox&lt;/a&gt; is awesome and recently I found a way to combine the two.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;I host my open source projects on &lt;a href="https://github.com/chrismiles"&gt;github&lt;/a&gt; (as well as &lt;a href="https://bitbucket.org/chrismiles"&gt;bitbucket&lt;/a&gt; – I'm a happy Mercurial user as well) but there are some private and/or client projects I don't want to store on those sites.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Git, of course, doesn't require a server repository. &amp;nbsp;So you can work locally while still having full version control. &amp;nbsp;However, I like the comfort of syncing to an offsite repository so I tend to push my changes to the remote server multiple times per day (also, old svn habits die hard).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;For git repositories that I don't want hosted on github, I push to a git repository sitting in Dropbox instead. The push is handled locally and Dropbox performs all the magic of syncing to the cloud (my offsite backup) and to my other computers/devices (switching dev computers isn't a problem). Simple, fast, nice.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Here's how I set up a bare git repository in Dropbox for a project:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ mkdir ~/Dropbox/src/git-server&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ git init ~/Dropbox/src/git-server/MyProject&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ cd&amp;nbsp;~/Dropbox/src/git-server/MyProject&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ git config --bool core.bare true&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ cd ~/src/project-git&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ git status&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# On branch master&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;nothing to commit (working directory clean)&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ git push --mirror ~/Dropbox/src/git-server/MyProject&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$&amp;nbsp;git remote add dropbox ~/Dropbox/src/git-server/MyProject&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$&amp;nbsp;git push --mirror dropbox&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Everything up-to-date&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The first batch of commands initialises a new git repository. &amp;nbsp;The repository is flagged as bare so that we can push all branches (including the working branch).&lt;br /&gt;&lt;br /&gt;The second batch simply pushes a development repository to the Dropbox one. &amp;nbsp;I use --mirror to push everything over.&lt;br /&gt;&lt;br /&gt;The third batch of commands set up a shortcut for the Dropbox repository. &amp;nbsp;I name it "dropbox" so from then on I only have to do "git push dropbox" to push to it (with or without --mirror as required, although I usually use it).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;: I have since refined my git/dropbox workflow:&amp;nbsp;&lt;a href="http://chrismiles-tech.blogspot.com/2011/03/git-sharing-with-dropbox.html"&gt;git sharing with dropbox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div class="p1" style="font-family: Times; font-size: medium;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-3489017811488305172?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/3489017811488305172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2011/01/git-push-dropbox.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/3489017811488305172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/3489017811488305172'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2011/01/git-push-dropbox.html' title='git push dropbox'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-592967771058185168</id><published>2010-12-21T19:20:00.000-08:00</published><updated>2011-05-21T21:35:21.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>CMPopTipView - a custom popup view for iOS</title><content type='html'>&lt;span class="Apple-style-span" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;&lt;img border="0" height="320" src="https://assets1.github.com/img/d953577314aafa7c65d1eb3b15f7fd73c9946d1e?repo=&amp;amp;url=http%3A%2F%2Ffarm5.static.flickr.com%2F4005%2F5191641030_2b93a4a559.jpg&amp;amp;path=" width="170" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;CMPopTipView&lt;/a&gt; is a custom &lt;a href="http://developer.apple.com/devcenter/ios/index.action"&gt;iOS&lt;/a&gt; &lt;a href="http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html"&gt;UIView&lt;/a&gt; that I have released on github. &amp;nbsp;It is relatively simple, but solved a need I had in an app where I wanted a kind of speech bubble shaped popup to give the user a hint about where to tap next. (You might argue that good UI shouldn't need an extra hint for the user but then I would punch you in the arm and go about my day.)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="https://assets1.github.com/img/d953577314aafa7c65d1eb3b15f7fd73c9946d1e?repo=&amp;amp;url=http%3A%2F%2Ffarm5.static.flickr.com%2F4005%2F5191641030_2b93a4a559.jpg&amp;amp;path=" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;CMPopTipView is simple to use. &amp;nbsp;Just initialise it with a target view, a container view and a message to display and it handles positioning itself with the container view to point at the target view, sizing itself to fit the text. &amp;nbsp;It is also smart about &lt;a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBarButtonItem_Class/Reference/Reference.html"&gt;UIBarButtonItems&lt;/a&gt; (in either navigation or tool bars) and can position itself properly to point at them. Some example code is shown below.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Some features of CMPopTipView:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Automatically positioned in container view;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Positions pointer to point at target view (either above or below);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Automatically sizes itself to fit the text message;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Background and text colours can be customised;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;User can tap CMPopTipView to dismiss it (with optional delegate callback);&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Can be dismissed programmatically;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Not a modal view.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;CMPopTipView draws itself using &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html"&gt;Core Graphics&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; and so scales up nicely to the high resolution &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.apple.com/iphone/features/retina-display.html"&gt;Retina display&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt; with no extra work. &amp;nbsp;It might be a useful reference for iOS developers looking for Core Graphics drawing examples. &amp;nbsp;The code demonstrates how to draw the path of a custom shape, how to draw a gradient fill within a clipped path, how to apply a shadow to the shape and how to draw text within the shape.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;A universal (iPhone/iPad) demo app is included with the source code. It is a button-fest of popup tips, as shown by the screenshots.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Example 1 - point at a UIBarButtonItem in a nav bar:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;// Present a CMPopTipView pointing at a UIBarButtonItem in the nav bar&lt;br /&gt;CMPopTipView *navBarLeftButtonPopTipView = [[[CMPopTipView alloc] initWithMessage:@"A Message"] autorelease];&lt;br /&gt;navBarLeftButtonPopTipView.delegate = self;&lt;br /&gt;[navBarLeftButtonPopTipView presentPointingAtBarButtonItem:self.navigationItem.leftBarButtonItem animated:YES];&lt;br /&gt;&lt;br /&gt;// Dismiss a CMPopTipView&lt;br /&gt;[navBarLeftButtonPopTipView dismissAnimated:YES];&lt;br /&gt;&lt;br /&gt;// CMPopTipViewDelegate method&lt;br /&gt;- (void)popTipViewWasDismissedByUser:(CMPopTipView *)popTipView {&lt;br /&gt;  // Any cleanup code, such as releasing a CMPopTipView instance variable, if necessary&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Example 2 - pointing at a UIButton, with custom color scheme:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="brush: objc"&gt;- (IBAction)buttonAction:(id)sender {&lt;br /&gt;  // Toggle popTipView when a standard UIButton is pressed&lt;br /&gt;  if (nil == self.roundRectButtonPopTipView) {&lt;br /&gt;    self.roundRectButtonPopTipView = [[[CMPopTipView alloc] initWithMessage:@"My message"] autorelease];&lt;br /&gt;    self.roundRectButtonPopTipView.delegate = self;&lt;br /&gt;    self.roundRectButtonPopTipView.backgroundColor = [UIColor lightGrayColor];&lt;br /&gt;    self.roundRectButtonPopTipView.textColor = [UIColor darkTextColor];&lt;br /&gt;&lt;br /&gt;    UIButton *button = (UIButton *)sender;&lt;br /&gt;    [self.roundRectButtonPopTipView presentPointingAtView:button inView:self.view animated:YES];&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;    // Dismiss&lt;br /&gt;    [self.roundRectButtonPopTipView dismissAnimated:YES];&lt;br /&gt;    self.roundRectButtonPopTipView = nil;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#pragma mark - CMPopTipViewDelegate methods&lt;br /&gt;- (void)popTipViewWasDismissedByUser:(CMPopTipView *)popTipView {&lt;br /&gt;  // User can tap CMPopTipView to dismiss it&lt;br /&gt;  self.roundRectButtonPopTipView = nil;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;&lt;img border="0" height="320" src="https://assets0.github.com/img/b83dc894a8f08e98494e1db2dca071d682b1ff51?repo=&amp;amp;url=http%3A%2F%2Ffarm5.static.flickr.com%2F4112%2F5191046667_109a98dfc7.jpg&amp;amp;path=" width="170" /&gt;&lt;/a&gt;&lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;&lt;img border="0" height="320" src="https://assets2.github.com/img/9f36d59e76ff4be91a97431f2ec863288dd4dd6d?repo=&amp;amp;url=http%3A%2F%2Ffarm6.static.flickr.com%2F5170%2F5266199718_4720c56384.jpg&amp;amp;path=" width="247" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="https://github.com/chrismiles/CMPopTipView"&gt;Get CMPopTipView from github&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-592967771058185168?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/592967771058185168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2010/12/cmpoptipview-custom-popup-view-for-ios.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/592967771058185168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/592967771058185168'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2010/12/cmpoptipview-custom-popup-view-for-ios.html' title='CMPopTipView - a custom popup view for iOS'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-844547234311869284</id><published>2010-10-22T01:17:00.000-07:00</published><updated>2011-02-24T00:07:23.960-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>iPad External Screen Mirroring</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://images.apple.com/ipad/accessories/images/accessories_vgakit_20100225.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="116" src="http://images.apple.com/ipad/accessories/images/accessories_vgakit_20100225.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;At last week's &lt;a href="http://www.melbournecocoaheads.com/"&gt;Melbourne CocoaHeads&lt;/a&gt; meeting I did a presentation and demo of &lt;a href="http://www.locayta.com/iOS-search-engine/locayta-search-mobile/locayta-search-mobile"&gt;Locayta Search Mobile&lt;/a&gt;. What was cool about it (besides the content of course!) was that I did the whole presentation – including live demos – from the iPad, using the &lt;a href="http://store.apple.com/go/product/ipad_vga_adp"&gt;external VGA adapter&lt;/a&gt;.  iPad's &lt;a href="http://www.apple.com/ipad/features/keynote.html"&gt;Keynote&lt;/a&gt; works well with the VGA adapter (besides a &lt;a href="http://www.intuitive.com/blog/experiences_with_the_ipad_vga_connector_not_so_good.html"&gt;few niggles&lt;/a&gt;) as you would expect.  However, there's no automatic mirroring of standard apps to the external display like there is on the Mac which makes live demoing a little more tricky.&lt;br /&gt;&lt;br /&gt;So how did I perform live iPad app demos on the projector?  Well, I didn't jailbreak to run &lt;a href="http://www.funkyspacemonkey.com/displayout-mirror-ipads-screen-external-display"&gt;background screen mirroring&lt;/a&gt;; and I didn't spend ages customising the demo apps to draw their UI on both the iPad and external displays (both of which are possible options).&lt;br /&gt;&lt;br /&gt;I fortunately found a little hack on Google Code called &lt;a href="http://code.google.com/p/iphoneos-screen-mirroring/"&gt;iphoneos-screen-mirroring&lt;/a&gt;. &amp;nbsp;It simply provides a UIApplication category that gives you a single method to call to enable mirroring of the iPad display to the external display. &amp;nbsp;The minimum amount of code you'd need to add to your app delegate is:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #ce2f24; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #77492d;"&gt;#import &lt;/span&gt;"UIApplication+ScreenMirroring.h"&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #b930a1;"&gt;BOOL&lt;/span&gt;)application:(&lt;span style="color: #7140a7;"&gt;UIApplication&lt;/span&gt; *)application&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;didFinishLaunchingWithOptions:(&lt;span style="color: #7140a7;"&gt;NSDictionary&lt;/span&gt; *)launchOptions {&lt;/div&gt;&lt;div style="color: #008311; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;/* ... your app set up ... */&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008311; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// Start screen mirroring to Video Out (if connected)&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; [[&lt;span style="color: #7140a7;"&gt;UIApplication&lt;/span&gt; &lt;span style="color: #3e217f;"&gt;sharedApplication&lt;/span&gt;]&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;setupScreenMirroringWithFramesPerSecond:&lt;span style="color: #3031d5;"&gt;5&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The screen mirroring hack has no effect until an external adapter is plugged in to the iPad. When an external display is connected it kicks off a loop that continuously snapshots the main iPad display and copies the contents to the external display. &amp;nbsp;The mirroring frame rate can be customised when setting it up (like in the above example) and the reason to lower the frame rate is because the snapshotting kills the iPad performance quite a bit. &amp;nbsp;Not enough to prevent demoing of apps that don't refresh the display too much, but animations and scrolling suffer quite a bit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For my case the hack worked well enough at 5 fps. &amp;nbsp;If you were trying to demo a 30 fps game I think you'd be a little disappointed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that the mirroring hack uses&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;span class="typ" style="color: #660066;"&gt;UIGetScreenImage&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: monospace; font-size: 12px; white-space: pre-wrap;"&gt;&lt;span class="pun" style="color: #666600;"&gt;()&lt;/span&gt;&lt;/span&gt;&amp;nbsp;to snapshot the main screen and so is not App Store "safe".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A similar project, robterrell's &lt;a href="http://github.com/robterrell/TVOutManager"&gt;TVOutManager&lt;/a&gt;, claims to provide an App Store friendly technique (with certain caveats). &amp;nbsp;However, I found the performance to be slightly worse with that one and I wasn't planning on submitting the mirroring code to the App Store so I stuck with&amp;nbsp;iphoneos-screen-mirroring.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-844547234311869284?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/844547234311869284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2010/10/ipad-external-screen-mirroring.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/844547234311869284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/844547234311869284'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2010/10/ipad-external-screen-mirroring.html' title='iPad External Screen Mirroring'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-360998217394394808</id><published>2010-10-12T01:39:00.000-07:00</published><updated>2012-01-25T22:35:08.906-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='locayta'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Locayta Notes shows off iOS full text search</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477"&gt;&lt;img border="0" height="320" src="http://a1.phobos.apple.com/us/r1000/048/Purple/fa/50/61/mzl.uigohvdz.480x480-75.jpg" width="244" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477"&gt;Locayta Notes&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This week at &lt;a href="http://www.locayta.com/"&gt;Locayta&lt;/a&gt; we released an iPad/iPhone (universal) app to demonstrate the &lt;a href="http://www.locayta.com/ios-search-engine/locayta-search-mobile/locayta-search-mobile"&gt;Locayta Search Mobile&lt;/a&gt; full text search library for iOS.  &lt;a href="http://itunes.apple.com/gb/app/locayta-notes/id393819477"&gt;Locayta Notes&lt;/a&gt; is a free iPad/iPhone note taking app which obviously offers full text search of the contents of all notes.  Search is updated in real time as notes are being written or modified.  It includes all the fancy search features such as word stemming, automatic spell correction, user defined synonyms and various sorting options.&lt;br /&gt;&lt;br /&gt;But that's not all!  Locayta has also released the full &lt;a href="http://github.com/locayta/LocNotes"&gt;source code for Locayta Notes&lt;/a&gt; under an open source license.  The source code should be a very useful resource for Locayta Search Mobile developers.  All that is needed to build the app is the &lt;a href="http://www.locayta.com/iOS-search-engine/locayta-search-mobile/register-for-download"&gt;Locayta Search Mobile SDK, a free download&lt;/a&gt; from Locayta (currently in beta).&lt;br /&gt;&lt;br /&gt;Finally, I will be doing a talk and demo of Locayta Search Mobile at this month's &lt;a href="http://www.melbournecocoaheads.com/october-meetup/"&gt;Melbourne CocoaHeads&lt;/a&gt; meeting on Thursday.  Hope to see you there if you can make it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-360998217394394808?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/360998217394394808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2010/10/locayta-notes-shows-off-ios-full-text.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/360998217394394808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/360998217394394808'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2010/10/locayta-notes-shows-off-ios-full-text.html' title='Locayta Notes shows off iOS full text search'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-2186127612565737951</id><published>2010-10-06T18:42:00.000-07:00</published><updated>2011-02-24T00:08:58.330-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='river level'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iOS 4 Background Task Completion for River Level</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_b8UTByWaKjs/TK0j03sFc4I/AAAAAAAAAGg/XT9-sjFaDQ8/s1600/screen-capture-1.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;br /&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_b8UTByWaKjs/TK0j03sFc4I/AAAAAAAAAGg/XT9-sjFaDQ8/s320/screen-capture-1.png" width="172" /&gt;&lt;/a&gt;&lt;/div&gt;In the latest&amp;nbsp;&lt;a href="http://itunes.apple.com/au/app/river-level/id356158594?mt=8"&gt;River Level&lt;/a&gt;&amp;nbsp;update (v1.0.2) I added background task completion. River Level syncs waterway statistics from the server and even though the syncing is performed in a background thread while the app is running – so the user can still navigate around the app while data is being updated – if the user closes the app any active syncing task will be aborted.&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;iOS 4 allows tasks to complete in the background even after the user closes the app (e.g. hits the Home button or switches to another app). This is called&amp;nbsp;&lt;a href="http://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW6"&gt;background task completion&lt;/a&gt;&amp;nbsp;and is part of the multitasking feature set. Adding background task completion was surprisingly simple. Now, River Level running on any device with iOS 4+ will complete any data syncing tasks in the background if the user closes the app while syncing is active, which is a better experience for the user.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The key to adding background task completion is to wrap any tasks in calls to the UIApplication methods: &lt;a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler:"&gt;beginBackgroundTaskWithExpirationHandler:&lt;/a&gt; and &lt;a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/endBackgroundTask:"&gt;endBackgroundTask:&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;beginBackgroundTaskWithExpirationHandler:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;signals iOS that your app would like the task to complete even if the app is moved into the background state, before the app becomes suspended. &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;endBackgroundTask:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;signals iOS that your app's task has completed, allowing it to move your app to the suspended state if it needs to. &amp;nbsp;If the app remains in the foreground the whole time then these calls have no effect, so it doesn't hurt to use them.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Note that background tasks don't get free reign and don't get an indefinite period of time to complete. The "expiration handler" part of&amp;nbsp;&lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;beginBackgroundTaskWithExpirationHandler:&lt;/span&gt;&amp;nbsp;is a&amp;nbsp;&lt;a href="http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html%23//apple_ref/doc/uid/TP40007502"&gt;block&lt;/a&gt;&amp;nbsp;specifying your cleanup code if the task out lives its lifetime. &amp;nbsp;Code executing as a background task must not make any UI updates or openGL calls (as the app is offscreen).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;In River Level I use code similar to the example below. &amp;nbsp;If background tasks are supported on the host device (see&amp;nbsp;&lt;a href="http://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW11"&gt;Determining Whether Multitasking Support is Available&lt;/a&gt;) then I call &lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;beginBackgroundTaskWithExpirationHandler:&lt;/span&gt; to request background task completion before starting the syncing operation.  When the syncing completes (and again, if background tasks are supported) and the task has not already been invalidated for some reason, I simply call &lt;span class="Apple-style-span" style="color: #666666; font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;endBackgroundTask:&lt;/span&gt; to tell iOS my task is done. &amp;nbsp;If the app was running in a background state at this time and no other background tasks were active, iOS would move the app to the suspended state.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: #518187; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #b930a1;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;([&lt;/span&gt;RiverLevelAppDelegate&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #33595d;"&gt;sharedAppDelegate&lt;/span&gt;&lt;span style="color: black;"&gt;].&lt;/span&gt;backgroundSupported&lt;span style="color: black;"&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008311; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;// Register to execute task in background if required&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;UIApplication *app = [&lt;span style="color: #7140a7;"&gt;UIApplication&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3e217f;"&gt;sharedApplication&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 13px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3e217f; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;bgTask = [app&amp;nbsp;&lt;/span&gt;beginBackgroundTaskWithExpirationHandler&lt;span style="color: black;"&gt;:^{&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3e217f; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;[app&amp;nbsp;&lt;/span&gt;endBackgroundTask&lt;span style="color: black;"&gt;:bgTask];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7140a7; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;bgTask =&amp;nbsp;&lt;/span&gt;UIBackgroundTaskInvalid&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}];&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;}&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008311; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;// kick off the asynchronous syncing task...&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008311; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;// ... when the syncing task completes:&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #518187; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #b930a1;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;([&lt;/span&gt;RiverLevelAppDelegate&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #33595d;"&gt;sharedAppDelegate&lt;/span&gt;&lt;span style="color: black;"&gt;].&lt;/span&gt;backgroundSupported&lt;span style="color: black;"&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008311; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;// Flag completion of background task&lt;/div&gt;&lt;div style="color: #7140a7; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #b930a1;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;(bgTask !=&amp;nbsp;&lt;/span&gt;UIBackgroundTaskInvalid&lt;span style="color: black;"&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3e217f; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;[[&lt;/span&gt;&lt;span style="color: #7140a7;"&gt;UIApplication&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;sharedApplication&lt;span style="color: black;"&gt;]&amp;nbsp;&lt;/span&gt;endBackgroundTask&lt;span style="color: black;"&gt;:bgTask];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7140a7; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;bgTask =&amp;nbsp;&lt;/span&gt;UIBackgroundTaskInvalid&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Also note that you are not limited to only one background task, you can register as many as you need although they all must complete before the expiry time. &amp;nbsp;River Level registers a background task for each waterway when batch updates are requested.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-2186127612565737951?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/2186127612565737951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2010/10/ios-4-background-task-completion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2186127612565737951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2186127612565737951'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2010/10/ios-4-background-task-completion.html' title='iOS 4 Background Task Completion for River Level'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_b8UTByWaKjs/TK0j03sFc4I/AAAAAAAAAGg/XT9-sjFaDQ8/s72-c/screen-capture-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3760424589061564192.post-2500751447143164303</id><published>2010-08-19T00:11:00.000-07:00</published><updated>2012-01-25T22:35:14.882-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='locayta'/><title type='text'>Looking for Beta testers for new iOS full text search engine library</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;At &lt;a href="http://www.locayta.com/"&gt;Locayta&lt;/a&gt; we have released a beta of our new full text search engine library for iPhone/iPad developers. I have been leading this project from the software engineering side and am looking for developers interested in beta testing this framework and offering some feedback.&lt;br /&gt;&lt;br /&gt;To download the beta version, go to&amp;nbsp;&lt;a href="http://www.locayta.com/pages/new/ios-search-engine"&gt;http://www.locayta.com/pages/new/ios-search-engine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a quick blurb about the search engine library:&lt;br /&gt;&lt;br /&gt;Locayta Seach for iOS is a port of Locayta's full text search engine library for the iOS platform. &amp;nbsp;The core library is pure C (with a bit of C++) and we have wrapped a higher level Objective-C API around it and produced a static library in a Framework bundle so that iPhone &amp;amp; iPad apps can provide fast local full text search. &amp;nbsp;The search engine provides "enterprise level" full text search using a probabilistic model of document terms, along with clever features to improve search success such as automatic spell correction (based on trigram analysis of terms) and word stemming.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3760424589061564192-2500751447143164303?l=blog.chrismiles.info' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.chrismiles.info/feeds/2500751447143164303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.chrismiles.info/2010/08/looking-for-beta-testers-for-new-ios.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2500751447143164303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3760424589061564192/posts/default/2500751447143164303'/><link rel='alternate' type='text/html' href='http://blog.chrismiles.info/2010/08/looking-for-beta-testers-for-new-ios.html' title='Looking for Beta testers for new iOS full text search engine library'/><author><name>Chris Miles</name><uri>https://profiles.google.com/108055221952493560833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-xKLVzFRwwiM/AAAAAAAAAAI/AAAAAAAAAMM/HfqSC6JVaxk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
