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

<channel>
	<title>MRo Blog &#187; iPhone</title>
	<atom:link href="http://blog.mro.name/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mro.name</link>
	<description>Marcus Rohrmoser mobile Software</description>
	<lastBuildDate>Wed, 23 Jun 2010 11:32:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Develop with iOS 4 SDK on an OS 3.0 Device</title>
		<link>http://blog.mro.name/2010/06/develop-with-ios-4-on-an-os-3-0-device/</link>
		<comments>http://blog.mro.name/2010/06/develop-with-ios-4-on-an-os-3-0-device/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 11:15:24 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Base SDK]]></category>
		<category><![CDATA[Deployment Target]]></category>
		<category><![CDATA[Device]]></category>
		<category><![CDATA[iOS 4]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone OS 3.0]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1919</guid>
		<description><![CDATA[After upgrading to iOS 4.0 SDK, iPhone OS 3.0 is no longer a valid &#8220;Base SDK&#8221;. Naively switching to iPhone 3.2 prevents deployment to a 3.0 device. But such &#8220;Project -&#62; Edit Project Settings&#8221; work out fine: &#8220;Deployment Target&#8221; hint found here.]]></description>
			<content:encoded><![CDATA[<p>After upgrading to iOS 4.0 SDK, iPhone OS 3.0 is no longer a valid &#8220;Base SDK&#8221;. Naively switching to iPhone 3.2 prevents deployment to a 3.0 device.</p>
<p>But such &#8220;Project -&gt; Edit Project Settings&#8221; work out fine:</p>
<div id="attachment_1921" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.mro.name/wp-content/uploads/2010/06/iPhoneOS3_0-device-with-iOS4_0-SDK.png"><img class="size-medium wp-image-1921" title="iPhoneOS 3.0 development device with iOS 4.0 SDK" src="http://blog.mro.name/wp-content/uploads/2010/06/iPhoneOS3_0-device-with-iOS4_0-SDK-300x111.png" alt="iPhoneOS 3.0 development device with iOS 4.0 SDK" width="300" height="111" /></a><p class="wp-caption-text">iPhoneOS 3.0 development device with iOS 4.0 SDK</p></div>
<p><a href="http://forum.unity3d.com/viewtopic.php?p=335612">&#8220;Deployment Target&#8221; hint found here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/06/develop-with-ios-4-on-an-os-3-0-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iOS 4 Simulator crash (when installed to custom folder)</title>
		<link>http://blog.mro.name/2010/06/ios-4-simulator-crash-when-installed-to-custom-folder/</link>
		<comments>http://blog.mro.name/2010/06/ios-4-simulator-crash-when-installed-to-custom-folder/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 10:42:11 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[iOS 4]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone Simulator]]></category>
		<category><![CDATA[Softlink]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1917</guid>
		<description><![CDATA[just downloaded and installed the iOS 4 SDK and as my root OS X partition is rather (too) small, I put it into a custom location /Users/Developer.Snowleopard/. This causes the iPhone Simulator to crash and compiling gives an error like: ibtool failed with exception: Interface Builder encountered an error communicating with the iPhone Simulator. If [...]]]></description>
			<content:encoded><![CDATA[<p>just downloaded and installed the iOS 4 SDK and as my root OS X partition is rather (too) small, I put it into a custom location /Users/Developer.Snowleopard/.</p>
<p>This causes the iPhone Simulator to crash and compiling gives an error like:</p>
<pre>ibtool failed with exception: Interface Builder encountered an error communicating with the iPhone Simulator. If you choose to file a crash report or radar for this issue, please check Console.app for crash reports for "Interface Builder Cocoa Touch Tool" and include their content in your crash report.
...
dyld: Library not loaded: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
  Referenced from: /Users/Developer.SnowLeopard/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib
  Reason: image not found</pre>
<p>The cure &#8211; a softlink:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>Developer.SnowLeopard<span style="color: #000000; font-weight: bold;">/</span>Platforms <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/06/ios-4-simulator-crash-when-installed-to-custom-folder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCode: missing &#8220;deprecated&#8221; warnings</title>
		<link>http://blog.mro.name/2010/06/xcode-missing-deprecated-warnings/</link>
		<comments>http://blog.mro.name/2010/06/xcode-missing-deprecated-warnings/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 10:55:56 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[alloc]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[deprecated]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[initWithFrame]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[UITableViewCell]]></category>
		<category><![CDATA[warning]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1889</guid>
		<description><![CDATA[when developing for long-term use, you want to use APIs that aren&#8217;t likely to be removed soon, a.k.a. &#8220;deprecated&#8221;. So, don&#8217;t use downward compatible calls below a point you really aim for. XCode helps with compiler warnings about &#8220;deprecated&#8221; calls &#8211; if &#8220;Project -&#62; Edit Project Settings -&#62; GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS&#8221; is set: But be careful, this [...]]]></description>
			<content:encoded><![CDATA[<p>when developing for long-term use, you want to use APIs that aren&#8217;t <a href="http://en.wikipedia.org/wiki/Deprecation">likely to be removed soon, a.k.a. &#8220;deprecated&#8221;</a>.</p>
<p>So, don&#8217;t use downward compatible calls below a point you really aim for.</p>
<p>XCode helps with compiler warnings about &#8220;deprecated&#8221; calls &#8211; if &#8220;Project -&gt; Edit Project Settings -&gt; GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS&#8221; is set:</p>
<div id="attachment_1890" class="wp-caption aligncenter" style="width: 395px"><a href="http://blog.mro.name/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-22-um-12.39.48.png"><img class="size-full wp-image-1890 " title="Compiler setting: Warn about deprecated calls" src="http://blog.mro.name/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-22-um-12.39.48.png" alt="Compiler setting: Warn about deprecated calls" width="385" height="150" /></a><p class="wp-caption-text">Compiler setting: Warn about deprecated calls</p></div>
<p>But be careful, this complains e.g. here only once while <code><a href="http://developer.apple.com/iphone/library/documentation/uikit/reference/UITableViewCell_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/doc/uid/TP40006938-CH3-SW32">initWithFrame:</a></code> is also deprecated (compiling for iPhone OS 3.0):</p>
<div id="attachment_1891" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.mro.name/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-22-um-12.41.57.png"><img class="size-medium wp-image-1891  " title="No &quot;deprecated&quot; warning on initXY" src="http://blog.mro.name/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-22-um-12.41.57-300x14.png" alt="" width="300" height="14" /></a><p class="wp-caption-text">No &quot;deprecated&quot; warning on initXY</p></div>
<p>As <a href="http://stackoverflow.com/questions/2135514/deprecated-not-triggering-compiler-warning-with-subclass/2136130#comment-2076316">Kevin Ballard pointed out at Stackoverflow</a>, this is because <code>[AnyClass alloc]</code> returns a type <code>id</code> &#8211; which doesn&#8217;t know about it&#8217;s interface.</p>
<p>To get this kind of compiler warnings, you have to type-cast the <code>[AnyClass alloc]</code> like this:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#40;</span>AnyClass<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>AnyClass alloc<span style="color: #002200;">&#93;</span> initXY<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Maybe time for a macro?</p>
<p>The macro could look like</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// http://blog.mro.name/2010/06/xcode-missing-deprecated-warnings/</span>
<span style="color: #6e371a;">#define alloc(c)	((c*)[c alloc])</span></pre></div></div>

<p>Migrate your codebase via XCode &#8220;Edit -&gt; Find in Project&#8221; with search pattern <code>\[\s*([^\[\]]+)\s+alloc\s*\]</code> and replacement pattern <code>alloc(\1)</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/06/xcode-missing-deprecated-warnings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone: libxml2 &amp; RELAX NG validation</title>
		<link>http://blog.mro.name/2010/05/iphone-libxml2-relax-ng-validation/</link>
		<comments>http://blog.mro.name/2010/05/iphone-libxml2-relax-ng-validation/#comments</comments>
		<pubDate>Fri, 28 May 2010 11:18:51 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[libxml2]]></category>
		<category><![CDATA[NSXMLParser]]></category>
		<category><![CDATA[RELAX NG]]></category>
		<category><![CDATA[SAX]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xmllint]]></category>
		<category><![CDATA[xmlTextReader]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1825</guid>
		<description><![CDATA[Having a validating parser in place can reduce the required code to parse XML a lot &#8211; you know very well what you actually get. As mentioned in my last post about RELAX NG &#38; trang, I prefer RELAX NG over W3C XML Schema &#8211; which doesn&#8217;t matter anyway because Apple&#8217;s suggested XML parser doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Having a <a href="http://www.w3.org/TR/REC-xml/#dt-valid">validating parser</a> in place can reduce the required code to parse <a href="http://en.wikipedia.org/wiki/XML">XML</a> a lot &#8211; you know very well what you actually get. As mentioned in my last post about <a href="http://blog.mro.name/2010/05/xml-toolbox-relax-ng-trang/">RELAX NG &amp; trang</a>, I prefer <a href="http://www.oasis-open.org/committees/relax-ng/">RELAX NG</a> over <a href="http://en.wikipedia.org/wiki/XML_Schema_(W3C)">W3C XML Schema</a> &#8211; which doesn&#8217;t matter anyway because <a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html">Apple&#8217;s suggested XML parser</a> doesn&#8217;t validate at all.</p>
<p>So we have to go one level deeper and have a look at <a href="http://www.xmlsoft.org/">libxml2</a>.</p>
<p><a href="http://developer.apple.com/iphone/library/samplecode/XMLPerformance/Listings/Classes_LibXMLParser_m.html#//apple_ref/doc/uid/DTS40008094-Classes_LibXMLParser_m-DontLinkElementID_10">Apple&#8217;s example &#8220;XmlPerformance&#8221;</a> helped to get started, but didn&#8217;t do the trick because libxml2 allows validation for <a href="http://www.xmlsoft.org/html/libxml-tree.html#xmlDocPtr"><code>xmlDocPtr</code></a> or <a href="http://www.xmlsoft.org/xmlreader.html"><code>xmlTextReader</code></a> but not for <a href="http://www.xmlsoft.org/html/libxml-tree.html#xmlSAXHandler">SAX parsers</a> as used in the example.</p>
<p>The <a href="http://www.xmlsoft.org/examples/">libxml2 examples</a> didn&#8217;t help me too much either, but luckily there&#8217;s <a href="http://git.gnome.org/browse/libxml2/tree/xmllint.c#n2252">xmllint available in source</a> (OSS just rocks) which does almost what we want. It first parses the XML into a <code>xmlDocPtr</code> and validates afterwards &#8211; and it does so for a reason:</p>
<p>You can have a validating <code>xmlTextReader</code> (via <code><a href="http://xmlsoft.org/html/libxml-xmlreader.html#xmlTextReaderRelaxNGSetSchema">xmlTextReaderRelaxNGSetSchema</a></code>), but it won&#8217;t detect <a href="http://www.w3.org/TR/xmlschema-2/#IDREF">IDREF</a>s missing their referred to <a href="http://www.w3.org/TR/xmlschema-2/#ID">ID</a> and the error messages lack the name of the failing item. BTW &#8211; when validating against a <a href="https://bugzilla.gnome.org/show_bug.cgi?id=170795">W3C schema this ID/IDREF check isn&#8217;t available yet</a>.</p>
<p>I finally discarded streaming XML parsing in favour of validation and <a href="http://www.xmlsoft.org/examples/index.html#parse4.c">&#8220;push&#8221; parsing</a> (nice for data coming in over the wire) and did:</p>
<ol>
<li><a href="http://git.gnome.org/browse/libxml2/tree/xmllint.c#n3513">load the RELAX NG regular form schema (watch out for the assignment of <code>relaxngschemas</code>)</a> &#8211; similar to xmllint schema loading,</li>
<li><a href="http://git.gnome.org/browse/libxml2/tree/xmllint.c#n2252">push the raw XML data into a <code>xmlDocPtr</code> (<code>xmlCreatePushParserCtxt</code>)</a> exactly like xmllint,</li>
<li><a href="http://git.gnome.org/browse/libxml2/tree/xmllint.c#n2829">validate the in-memory document (<code>xmlRelaxNGValidateDoc</code>)</a>,</li>
<li><a href="http://xmlsoft.org/html/libxml-xmlreader.html#xmlReaderWalker">turn it into a <code>xmlTextReader</code></a>,</li>
<li><a href="http://www.xmlsoft.org/xmlreader.html#Walking">process the reader</a>.</li>
</ol>
<p>Wrap up:</p>
<ul>
<li>if you want full RELAX NG validation with libxml2 v2.7.3, forget about streamed parsing,</li>
<li>wrap the document into a <code>xmlTextReader</code> if you want a SAXish programming model.</li>
</ul>
<p>I may prepare and publish a <code>MroLibxml2Parser</code> inheriting <code><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html">NSXMLParser</a></code> and firing it&#8217;s callbacks in order to easily switch validating and non-validating parser implementations, but this has to wait a bit. Stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/05/iphone-libxml2-relax-ng-validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tooltip: doxygen &amp; graphviz (OS X)</title>
		<link>http://blog.mro.name/2010/04/tooltip-doxygen-graphviz-os-x/</link>
		<comments>http://blog.mro.name/2010/04/tooltip-doxygen-graphviz-os-x/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 15:17:09 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[dot]]></category>
		<category><![CDATA[Doxygen]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1721</guid>
		<description><![CDATA[ever seen error messages like this when generating doxygen docs for an iPhone/Mac Objective C project: .../build/doxygen/html/a00136.png' produced by dot is not a valid PNG! You should either select a different format (DOT_IMAGE_FORMAT in the config file) or install a more recent version of graphviz (1.7+) ? Happened to me this morning when running doxygen [...]]]></description>
			<content:encoded><![CDATA[<p>ever seen error messages like this when generating doxygen docs for an iPhone/Mac Objective C project:</p>
<pre>.../build/doxygen/html/a00136.png' produced by dot is not a valid PNG!
You should either select a different format (DOT_IMAGE_FORMAT in the config file) or install a more recent version of graphviz (1.7+)</pre>
<p>?</p>
<p>Happened to me this morning when running <a href="http://www.doxygen.org">doxygen</a> on another box. The <a href="http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc">doxygen dmg</a> was installed in <code>/Applications</code>, I even added the <a href="http://graphviz.darwinports.com/">graphviz macport</a>, so WTF.</p>
<p>It turned out, that</p>
<ul>
<li>the doxygen dmg brings everything it needs, including graphviz,</li>
<li><em>but</em>: the full path to the dot executable has to be set <em>inside</em> the <a href="http://www.stack.nl/~dimitri/doxygen/config.html#cfg_dot_path">doxygen config</a>.</li>
</ul>
<p>So, when using the dot from the doxygen dmg, it has to be set to</p>
<pre>/Applications/Doxygen.app/Contents/Resources</pre>
<p>I fixed <a href="http://wiki.mro.name/orga/xcode_project_setup#makefile">my generic Makefile</a> and make a good guess now while keeping things configurable per user as the Makefile and doxygen config are committed sources and should not contain user specific settings.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/04/tooltip-doxygen-graphviz-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Unit Test Coverage</title>
		<link>http://blog.mro.name/2010/03/iphone-unit-test-coverage/</link>
		<comments>http://blog.mro.name/2010/03/iphone-unit-test-coverage/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 11:11:21 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Coverage]]></category>
		<category><![CDATA[CoverStory]]></category>
		<category><![CDATA[gcov]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[SenTestingKit]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1707</guid>
		<description><![CDATA[have a look at the CoverStory Howto, download CoverStory, open (with XCode) the XCode Project you want to measure, run the script EnableGCov.scpt linked to from the howto, run your tests and see a linker error, &#8211; dead end for the time being. http://groups.google.com/group/coverstory-discuss/browse_thread/thread/fbcbf5ed61d8d02b#]]></description>
			<content:encoded><![CDATA[<ol>
<li>have a look at the <a href="http://code.google.com/p/coverstory/wiki/UsingCoverstory">CoverStory Howto</a>,</li>
<li>download CoverStory,</li>
<li>open (with XCode) the XCode Project you want to measure,</li>
<li>run the script EnableGCov.scpt linked to from the howto,</li>
<li>run your tests and see a <a href="http://lists.apple.com/archives/xcode-users/2009/Aug/msg00436.html">linker error</a>, &#8211; dead end for the time being. <a href="http://groups.google.com/group/coverstory-discuss/browse_thread/thread/fbcbf5ed61d8d02b#">http://groups.google.com/group/coverstory-discuss/browse_thread/thread/fbcbf5ed61d8d02b#</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/03/iphone-unit-test-coverage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CocoaHeads Vortrag gestern: Unit Testing</title>
		<link>http://blog.mro.name/2010/03/cocoaheads-vortrag-gestern-unit-testing/</link>
		<comments>http://blog.mro.name/2010/03/cocoaheads-vortrag-gestern-unit-testing/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 21:01:57 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Artikel auf deutsch]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[CocoaHeads]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[OCUnit]]></category>
		<category><![CDATA[SenTestingKit]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1701</guid>
		<description><![CDATA[um ein wenig anzugeben und schlicht den Link hier zu platzieren: Cocoa Unit Testing Folien, Cocoa Unit Testing Wiki Seite]]></description>
			<content:encoded><![CDATA[<p>um ein wenig anzugeben und schlicht den Link hier zu platzieren:</p>
<ul>
<li><a href="http://wiki.mro.name/_export/s5/cocoaheads/testing">Cocoa Unit Testing Folien</a>,</li>
<li><a href="http://mro.name/go/cocoaheads_testing">Cocoa Unit Testing Wiki Seite</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/03/cocoaheads-vortrag-gestern-unit-testing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>iPhone: SQLite Fulltext Index</title>
		<link>http://blog.mro.name/2010/03/iphone-sqlite-fulltext-index/</link>
		<comments>http://blog.mro.name/2010/03/iphone-sqlite-fulltext-index/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 17:30:28 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Fulltext]]></category>
		<category><![CDATA[Index]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1692</guid>
		<description><![CDATA[Most blogposts I found on this topic don&#8217;t explain it from the beginning, so it took me quite a while to figure out how simple and powerful the sqlite fulltext search API (FTS3) actually is. get the sqlite3 amalgamation sources (v3.6.22) and just unpack it into your iPhone project &#8211; sqlite3 as shipped on the [...]]]></description>
			<content:encoded><![CDATA[<p>Most blogposts I found on this topic don&#8217;t explain it from the beginning, so it took me quite a while to figure out how simple and powerful the <a href="http://www.sqlite.org/fts3.html">sqlite fulltext search API (FTS3)</a> actually is.</p>
<ol>
<li>get the <a href="http://www.sqlite.org/amalgamation.html">sqlite3 amalgamation sources (v3.6.22)</a> and just unpack it into your iPhone project &#8211; sqlite3 as shipped on the iPhone doesn&#8217;t support FTS3,</li>
<li><a href="http://www.v2ex.com/2008/11/22/full-text-search/">activate FTS3 support</a>,</li>
<li><a href="http://www.sqlite.org/fts3.html#section_1_1">create the index table</a> programmatically inside your App as your Macs default sqlite3 doesn&#8217;t support FTS3 either,</li>
<li>use it like any other table except <a href="http://www.sqlite.org/fts3.html#section_3">using the MATCH operator for index queries</a>.</li>
</ol>
<p>That&#8217;s it, and it&#8217;s hell quick.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/03/iphone-sqlite-fulltext-index/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>T-Mobile / MMS / iPhone</title>
		<link>http://blog.mro.name/2010/01/t-mobile-mms-iphone/</link>
		<comments>http://blog.mro.name/2010/01/t-mobile-mms-iphone/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 08:25:50 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Artikel auf deutsch]]></category>
		<category><![CDATA[seenontheweb]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MMS]]></category>
		<category><![CDATA[T-Mobile]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1678</guid>
		<description><![CDATA[klick ich den Link, den T-Mobile mir per SMS geschickt hat, kriege ich:]]></description>
			<content:encoded><![CDATA[<p>klick ich den Link, den T-Mobile mir per SMS geschickt hat, kriege ich:</p>
<div id="attachment_1679" class="wp-caption alignnone" style="width: 330px"><img class="size-full wp-image-1679 " title="T-Mobile Scherz" src="http://blog.mro.name/wp-content/uploads/2010/01/IMG_1318.png" alt="T-Mobile Scherz" width="320" height="480" /><p class="wp-caption-text">T-Mobile Scherz</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/01/t-mobile-mms-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSCachedURLResponse / NSKeyedUnarchiver pain</title>
		<link>http://blog.mro.name/2010/01/nscachedurlresponse-nskeyedunarchiver-pain/</link>
		<comments>http://blog.mro.name/2010/01/nscachedurlresponse-nskeyedunarchiver-pain/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 18:42:00 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[NSCachedURLResponse]]></category>
		<category><![CDATA[NSKeyedArchiver]]></category>
		<category><![CDATA[NSKeyedUnarchiver]]></category>
		<category><![CDATA[NSURLCache]]></category>
		<category><![CDATA[Objective C]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1667</guid>
		<description><![CDATA[as the iPhone SDK comes with a rather dysfunctional NSURLCache — Apple suggests to implement it from scratch yourself in the code examples about caching — I went for just this. Until I came across the [NSKeyedUnarchiver unarchiveObjectWithData:...] not restoring userInfo, storagePolicy and data of NSCachedURLResponse. Couldn&#8217;t believe it and spent almost the whole day verifying [...]]]></description>
			<content:encoded><![CDATA[<p>as the iPhone SDK comes with a rather dysfunctional <a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html">NSURLCache</a> — Apple suggests to implement it from scratch yourself in the <a href="http://developer.apple.com/iphone/library/samplecode/URLCache/index.html#//apple_ref/doc/uid/DTS40008061">code examples about caching</a> — I went for just this.</p>
<p>Until I came across the <code>[<a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/Reference/Reference.html">NSKeyedUnarchiver</a> unarchiveObjectWithData:...]</code> not restoring <code>userInfo</code>, <code>storagePolicy</code> and <code>data</code> of <code><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSCachedURLResponse_Class/Reference/Reference.html">NSCachedURLResponse</a></code>.</p>
<p>Couldn&#8217;t believe it and spent almost the whole day verifying that the error is not within my code but really the unarchiver treats those fields transient.</p>
<p>See yourself:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>testiPhoneSDK312NSKeyedArchiver
<span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">//  prepare a NSCachedURLResponse</span>
    <span style="color: #400080;">NSCachedURLResponse</span> <span style="color: #002200;">*</span>src <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#123;</span>
        <span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>i_url <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://www.url.example/path/file.html&quot;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>i_mime <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;text/html&quot;</span>;
        NSInteger expectedContentLength <span style="color: #002200;">=</span> <span style="color: #2400d9;">112</span>;
        <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>i_encoding <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;iso-8859-2&quot;</span>;
&nbsp;
        <span style="color: #400080;">NSURLResponse</span> <span style="color: #002200;">*</span>i_response <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLResponse</span> alloc<span style="color: #002200;">&#93;</span> initWithURL<span style="color: #002200;">:</span>i_url
            MIMEType<span style="color: #002200;">:</span>i_mime
            expectedContentLength<span style="color: #002200;">:</span>expectedContentLength
            textEncodingName<span style="color: #002200;">:</span>i_encoding<span style="color: #002200;">&#93;</span>;
        <span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>i_data <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello, world!&quot;</span> dataUsingEncoding<span style="color: #002200;">:</span>NSISOLatin2StringEncoding<span style="color: #002200;">&#93;</span>;
        NSURLCacheStoragePolicy i_storage <span style="color: #002200;">=</span>  NSURLCacheStorageAllowed;
        <span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span>i_userInfo <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObject<span style="color: #002200;">:</span>
        <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> dateWithTimeIntervalSince1970<span style="color: #002200;">:</span><span style="color: #2400d9;">13</span><span style="color: #002200;">&#93;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;era&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
        <span style="color: #400080;">NSCachedURLResponse</span> <span style="color: #002200;">*</span>src <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSCachedURLResponse</span> alloc<span style="color: #002200;">&#93;</span> initWithResponse<span style="color: #002200;">:</span>i_response
            data<span style="color: #002200;">:</span>i_data
            userInfo<span style="color: #002200;">:</span>i_userInfo
            storagePolicy<span style="color: #002200;">:</span>i_storage<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//      ensure it's all in place:</span>
        STAssertEqualObjects<span style="color: #002200;">&#40;</span>i_url, src.response.URL, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
        STAssertEqualObjects<span style="color: #002200;">&#40;</span>i_mime, src.response.MIMEType, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
        STAssertEquals<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>expectedContentLength, <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>src.response.expectedContentLength, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
        STAssertEqualObjects<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;file.html&quot;</span>, src.response.suggestedFilename, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
        STAssertEqualObjects<span style="color: #002200;">&#40;</span>i_encoding, src.response.textEncodingName, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
        STAssertEqualObjects<span style="color: #002200;">&#40;</span>i_data, src.data, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
        STAssertEqualObjects<span style="color: #002200;">&#40;</span>i_userInfo, src.userInfo, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
        STAssertEquals<span style="color: #002200;">&#40;</span> 0u, src.storagePolicy, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//  archive + unarchive:</span>
    <span style="color: #400080;">NSCachedURLResponse</span> <span style="color: #002200;">*</span>dst <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSKeyedUnarchiver</span> unarchiveObjectWithData<span style="color: #002200;">:</span>
      <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSKeyedArchiver</span> archivedDataWithRootObject<span style="color: #002200;">:</span>src<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//  check whether src == dst</span>
    STAssertEqualObjects<span style="color: #002200;">&#40;</span>src.response.URL, dst.response.URL, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span>src.response.MIMEType, dst.response.MIMEType, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
    STAssertEquals<span style="color: #002200;">&#40;</span>src.response.expectedContentLength, dst.response.expectedContentLength, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span>src.response.suggestedFilename, dst.response.suggestedFilename, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span>src.response.textEncodingName, dst.response.textEncodingName, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//  !!!!!!!!!!</span>
<span style="color: #11740a; font-style: italic;">//  sad information loss after unarchiving:</span>
    STAssertNil<span style="color: #002200;">&#40;</span> dst.data, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span> <span style="color: #002200;">&#41;</span>;
    STAssertNil<span style="color: #002200;">&#40;</span> dst.userInfo, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span> <span style="color: #002200;">&#41;</span>;
    STAssertEquals<span style="color: #002200;">&#40;</span> 2u , dst.storagePolicy, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span> <span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>When my NSURLCache replacement is ready I think about publishing it a github — interested anyone?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/01/nscachedurlresponse-nskeyedunarchiver-pain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Binary Search NSArray</title>
		<link>http://blog.mro.name/2010/01/binary-search-nsarray/</link>
		<comments>http://blog.mro.name/2010/01/binary-search-nsarray/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 22:02:07 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Binary]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[gist]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[NSArray]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Search]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1652</guid>
		<description><![CDATA[Though CFArray comes with binary search capability, NSArray does not &#8211; at least not within the iPhone SDK. The indexOfObject:inSortedRange:options:usingComparator: can&#8217;t be found. Plus the CFArrayBSearchValues doesn&#8217;t tell you whether the key actually is part of the list or not. That&#8217;s what the Java JDK does, so let&#8217;s implement some category methods -&#40;NSInteger&#41;binarySearch:&#40;id&#41;key; -&#40;NSInteger&#41;binarySearch:&#40;id&#41;key usingSelector:&#40;SEL&#41;comparator; [...]]]></description>
			<content:encoded><![CDATA[<p>Though <a href="http://developer.apple.com/mac/library/DOCUMENTATION/CoreFoundation/Reference/CFArrayRef/index.html">CFArray</a> comes with <a href="http://en.wikipedia.org/wiki/Binary_search_algorithm#Iterative">binary search</a> capability, <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html">NSArray</a> does not &#8211; at least not within the iPhone SDK. The <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/indexOfObject:inSortedRange:options:usingComparator:">indexOfObject:inSortedRange:options:usingComparator:</a> can&#8217;t be found.</p>
<p>Plus the <a href="http://developer.apple.com/mac/library/DOCUMENTATION/CoreFoundation/Reference/CFArrayRef/Reference/reference.html#//apple_ref/doc/uid/20001192-CH201-F10956">CFArrayBSearchValues</a> doesn&#8217;t tell you whether the key actually is part of the list or not. That&#8217;s what the <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#binarySearch(T[],%20T,%20java.util.Comparator)">Java JDK</a> does, so let&#8217;s implement some <a href="http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Category.html">category</a> methods</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingSelector<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">SEL</span><span style="color: #002200;">&#41;</span>comparator;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingSelector<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">SEL</span><span style="color: #002200;">&#41;</span>comparator inRange<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span>range;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingFunction<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger <span style="color: #002200;">&#40;</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span>, <span style="color: #a61390;">id</span>, <span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>comparator context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingFunction<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger <span style="color: #002200;">&#40;</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span>, <span style="color: #a61390;">id</span>, <span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>comparator context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context inRange<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span>range;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingDescriptors<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>sortDescriptors;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingDescriptors<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>sortDescriptors inRange<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span>range;</pre></div></div>

<p>ourselves, like</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>binarySearch<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>key usingFunction<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger <span style="color: #002200;">&#40;</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span>, <span style="color: #a61390;">id</span>, <span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>comparator context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context inRange<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRange</span><span style="color: #002200;">&#41;</span>range
<span style="color: #002200;">&#123;</span>
    NSLogD<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;[NSArray(MroBinarySearch) binarySearch:%@ usingFunction:]&quot;</span>, key<span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>self.count <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span> || key <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> || comparator <span style="color: #002200;">==</span> <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>self binarySearch<span style="color: #002200;">:</span>key usingSelector<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> inRange<span style="color: #002200;">:</span>range<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//	check overflow?</span>
    NSInteger min <span style="color: #002200;">=</span> range.location;
    NSInteger max <span style="color: #002200;">=</span> range.location <span style="color: #002200;">+</span> range.length <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span>;
&nbsp;
    <span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span>min <span style="color: #002200;">&amp;</span>lt; <span style="color: #002200;">=</span> max<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html</span>
        <span style="color: #a61390;">const</span> NSInteger mid <span style="color: #002200;">=</span> min <span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span>max <span style="color: #002200;">-</span> min<span style="color: #002200;">&#41;</span> <span style="color: #002200;">/</span> <span style="color: #2400d9;">2</span>;
        <span style="color: #a61390;">switch</span> <span style="color: #002200;">&#40;</span>comparator<span style="color: #002200;">&#40;</span>key, <span style="color: #002200;">&#91;</span>self objectAtIndex<span style="color: #002200;">:</span>mid<span style="color: #002200;">&#93;</span>, context<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>
        <span style="color: #002200;">&#123;</span>
            <span style="color: #a61390;">case</span> NSOrderedSame<span style="color: #002200;">:</span>
                <span style="color: #a61390;">return</span> mid;
            <span style="color: #a61390;">case</span> NSOrderedDescending<span style="color: #002200;">:</span>
                min <span style="color: #002200;">=</span> mid <span style="color: #002200;">+</span> <span style="color: #2400d9;">1</span>;
                <span style="color: #a61390;">break</span>;
            <span style="color: #a61390;">case</span> NSOrderedAscending<span style="color: #002200;">:</span>
                max <span style="color: #002200;">=</span> mid <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span>;
                <span style="color: #a61390;">break</span>;
        <span style="color: #002200;">&#125;</span>
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>min <span style="color: #002200;">+</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>See the <a href="http://gist.github.com/275631/">full interface + implementation + testcase without html encoding dirt at github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2010/01/binary-search-nsarray/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>underretain in CoreAnimation / iPhone Simulator</title>
		<link>http://blog.mro.name/2009/12/underretain-in-coreanimation-iphone-simulator/</link>
		<comments>http://blog.mro.name/2009/12/underretain-in-coreanimation-iphone-simulator/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 21:32:07 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[3.0]]></category>
		<category><![CDATA[3.2.1]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[CoreAnimation]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Simulator]]></category>
		<category><![CDATA[Snow Leopard]]></category>
		<category><![CDATA[underretain]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1603</guid>
		<description><![CDATA[After upgrading to Snow Leopard and XCode 3.2.1 I&#8217;ve seen such console output CAUnderRetain(32139,0xa0391500) malloc: *** error for object 0x3838000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug when rotating the iPhone Simulator in a project with base SDK 3.0. This can be reproduced as follows: Create a fresh [...]]]></description>
			<content:encoded><![CDATA[<p>After <a href="http://blog.mro.name/2009/11/upgrade-to-snow-leopard/">upgrading to Snow Leopard and XCode 3.2.1</a> I&#8217;ve seen such console output</p>
<pre>CAUnderRetain(32139,0xa0391500) malloc: *** error for object 0x3838000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug</pre>
<p>when rotating the iPhone Simulator in a project with base SDK 3.0.</p>
<p>This can be reproduced as follows:</p>
<ol>
<li>Create a fresh iPhone project (I use a &#8220;navigation App&#8221; with CoreData)
<div id="attachment_1605" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.38.06.png"><img class="size-medium wp-image-1605" title="Fresh Navigation based App + CoreData" src="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.38.06-300x255.png" alt="Fresh Navigation based App + CoreData" width="300" height="255" /></a><p class="wp-caption-text">Fresh Navigation based App + CoreData</p></div></li>
<li>add

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Override to allow orientations other than the default portrait orientation.</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>shouldAutorotateToInterfaceOrientation<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIInterfaceOrientation<span style="color: #002200;">&#41;</span>interfaceOrientation <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">// Return YES for supported orientations.</span>
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>willRotateToInterfaceOrientation<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIInterfaceOrientation<span style="color: #002200;">&#41;</span>toInterfaceOrientation duration<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSTimeInterval<span style="color: #002200;">&#41;</span>duration <span style="color: #002200;">&#123;</span>
	NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;willRotateToInterfaceOrientation&quot;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>to the <code>RootViewConroller.m</code></li>
<li>set the base SDK to 3.0:
<p><div id="attachment_1606" class="wp-caption aligncenter" style="width: 300px"><a href="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.41.02.png"><img class="size-medium wp-image-1606" title="Base SDk 3.0" src="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.41.02-290x300.png" alt="Base SDk 3.0" width="290" height="300" /></a><p class="wp-caption-text">Base SDk 3.0</p></div></li>
<li>compile + run with Simulator 3.1.2, everthing fine when rotating the simulator:
<p><div id="attachment_1607" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.42.09.png"><img class="size-medium wp-image-1607" title="Simulator 3.1.2 rotates fine" src="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.42.09-300x158.png" alt="Simulator 3.1.2 rotates fine" width="300" height="158" /></a><p class="wp-caption-text">Simulator 3.1.2 rotates fine</p></div></li>
<li>Simulator 3.0 shows the underretain:
<p><div id="attachment_1608" class="wp-caption aligncenter" style="width: 275px"><a href="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.50.41.png"><img class="size-medium wp-image-1608" title="Simulator 3.0 underretain" src="http://blog.mro.name/wp-content/uploads/2009/12/Bildschirmfoto-2009-12-12-um-21.50.41-265x300.png" alt="Simulator 3.0 underretain" width="265" height="300" /></a><p class="wp-caption-text">Simulator 3.0 underretain</p></div>

<div class="wp_syntax"><div class="code"><pre class="gdb" style="font-family:monospace;">[Session started at 2009-12-12 21:49:31 +0100.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type &quot;show copying&quot; to see the conditions.
There is absolutely no warranty for GDB.  Type &quot;show warranty&quot; for details.
This GDB was configured as &quot;x86_64-apple-darwin&quot;.sharedlibrary apply-load-rules all
Attaching to process 32139.
2009-12-12 21:49:43.845 CAUnderRetain[32139:207] willRotateToInterfaceOrientation
CAUnderRetain(32139,0xa0391500) malloc: *** error for object 0x1853000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
CAUnderRetain(32139,0xa0391500) malloc: *** error for object 0x3824000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
warning: Unable to restore previously selected frame.
warning: Couldn't find minimal bounds for &quot;_sigtramp&quot; - backtraces may be unreliable
(gdb) break malloc_error_break
Breakpoint 1 at 0x92626072
(gdb) continue
2009-12-12 21:49:58.490 CAUnderRetain[32139:207] willRotateToInterfaceOrientation
CAUnderRetain(32139,0xa0391500) malloc: *** error for object 0x3838000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
&nbsp;
Unable to disassemble malloc_error_break.
(gdb) bt
#0  0x92626072 in malloc_error_break ()
#1  0x92535303 in free ()
#2  0x0015ce49 in dataReleaseInfo ()
#3  0x001481d9 in data_provider_finalize ()
#4  0x30204421 in _CFRelease ()
#5  0x00147fa2 in image_finalize ()
#6  0x30204421 in _CFRelease ()
#7  0x00c12ded in CALayerStateRelease ()
#8  0x00c18290 in -[CALayer dealloc] ()
#9  0x00c0a00e in CALayerRelease ()
#10 0x00c0b265 in CA::release_root_if_unused ()
#11 0x00c0b1ef in x_hash_table_remove_if ()
#12 0x00c0afd4 in CA::Transaction::commit ()
#13 0x00c132e0 in CA::Transaction::observer_callback ()
#14 0x30245c32 in __CFRunLoopDoObservers ()
#15 0x3024503f in CFRunLoopRunSpecific ()
#16 0x30244628 in CFRunLoopRunInMode ()
#17 0x32044c31 in GSEventRunModal ()
#18 0x32044cf6 in GSEventRun ()
#19 0x309021ee in UIApplicationMain ()
#20 0x00002018 in main (argc=1, argv=0xbfffea84) at /Users/.../CAUnderRetain/main.m:14
(gdb)</pre></div></div>

</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/12/underretain-in-coreanimation-iphone-simulator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CoreData generic findManyByKey</title>
		<link>http://blog.mro.name/2009/12/coredata-generic-findmanybykey/</link>
		<comments>http://blog.mro.name/2009/12/coredata-generic-findmanybykey/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 03:32:34 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[CoreData]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[NSEntityDescription]]></category>
		<category><![CDATA[NSManagedObject]]></category>
		<category><![CDATA[NSManagedObjectContext]]></category>
		<category><![CDATA[NSPredicate]]></category>
		<category><![CDATA[Objective C]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1583</guid>
		<description><![CDATA[The base for many of my SELECT-ish queries when querying by exact match is one generic method I created in some category methods on NSManagedObjectContext: -&#40;NSArray*&#41;entityName:&#40;NSString*&#41;entityName findManyByRelation:&#40;NSDictionary*&#41;dict &#123; // TODO handle dict nil and emptyness NSMutableArray *arr = &#91;&#91;NSMutableArray alloc&#93; initWithCapacity:dict.count&#93;; for&#40;NSString *key in dict&#41; &#123; NSExpression *left = &#91;NSExpression expressionForKeyPath:key&#93;; NSExpression *right = &#91;NSExpression [...]]]></description>
			<content:encoded><![CDATA[<p>The base for many of my <a href="http://en.wikipedia.org/wiki/Select_%28SQL%29">SELECT</a>-ish queries when querying by exact match is one generic method I created in some <a href="http://developer.apple.com/iphone/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1">category methods</a> on <a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html">NSManagedObjectContext</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>entityName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>entityName findManyByRelation<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>dict
<span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">//  TODO handle dict nil and emptyness</span>
    <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>arr <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span>dict.count<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>key <span style="color: #a61390;">in</span> dict<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #400080;">NSExpression</span> <span style="color: #002200;">*</span>left <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSExpression</span> expressionForKeyPath<span style="color: #002200;">:</span>key<span style="color: #002200;">&#93;</span>;
        <span style="color: #400080;">NSExpression</span> <span style="color: #002200;">*</span>right <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSExpression</span> expressionForConstantValue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>dict objectForKey<span style="color: #002200;">:</span>key<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #400080;">NSComparisonPredicate</span> <span style="color: #002200;">*</span>cp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSComparisonPredicate</span> alloc<span style="color: #002200;">&#93;</span> initWithLeftExpression<span style="color: #002200;">:</span>left
            rightExpression<span style="color: #002200;">:</span>right modifier<span style="color: #002200;">:</span>NSDirectPredicateModifier type<span style="color: #002200;">:</span>NSEqualToPredicateOperatorType options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>arr addObject<span style="color: #002200;">:</span>cp<span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>cp release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #400080;">NSPredicate</span> <span style="color: #002200;">*</span>pred <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>arr.count <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>
        pred <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>arr objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;    <span style="color: #11740a; font-style: italic;">// why do I have to retain here?</span>
    <span style="color: #a61390;">else</span>
        pred <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSCompoundPredicate</span> alloc<span style="color: #002200;">&#93;</span> initWithType<span style="color: #002200;">:</span>NSAndPredicateType subpredicates<span style="color: #002200;">:</span>arr<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #400080;">NSFetchRequest</span> <span style="color: #002200;">*</span>fr <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFetchRequest</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
    fr.entity <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSEntityDescription</span> entityForName<span style="color: #002200;">:</span>entityName inManagedObjectContext<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
    fr.predicate <span style="color: #002200;">=</span> pred;
    <span style="color: #002200;">&#91;</span>arr release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>pred release<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">//	NSLog(@&quot;predicate effective: %@&quot;, fr.predicate);</span>
&nbsp;
    <span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span>err <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>ps <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self executeFetchRequest<span style="color: #002200;">:</span>fr error<span style="color: #002200;">:&amp;</span>amp;err<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>err <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
        <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSException</span> <span style="color: #a61390;">raise</span><span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;DB Error&quot;</span> format<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Fetch problem %@&quot;</span>, fr.predicate.predicateFormat<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>fr release<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">return</span> ps;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>For example it serves under the hood of it&#8217;s sibling helpers</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObject</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>entityName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>entityName findByPrimaryKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>dict
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>ps <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self entityName<span style="color: #002200;">:</span>entityName findManyByRelation<span style="color: #002200;">:</span>dict<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>ps <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> || ps.count <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>ps.count <span style="color: #002200;">==</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>ps objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSException</span> <span style="color: #a61390;">raise</span><span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;DB Error&quot;</span> format<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Multiple hits for %@&quot;</span>, dict<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObject</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #2400d9;">1</span><span style="color: #002200;">/</span><span style="color: #2400d9;">0</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>and</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObject</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>entityName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>entityName selectOrInsertWithKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>dict
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSManagedObject</span> <span style="color: #002200;">*</span>o <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self entityName<span style="color: #002200;">:</span>entityName findByPrimaryKey<span style="color: #002200;">:</span>dict<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>o <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #400080;">NSEntityDescription</span> <span style="color: #002200;">*</span>ed <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSEntityDescription</span> entityForName<span style="color: #002200;">:</span>entityName inManagedObjectContext<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
        o <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSManagedObject</span> alloc<span style="color: #002200;">&#93;</span> initWithEntity<span style="color: #002200;">:</span>ed insertIntoManagedObjectContext<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
        <span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>key <span style="color: #a61390;">in</span> dict<span style="color: #002200;">&#41;</span>
            <span style="color: #002200;">&#91;</span>o setValue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>dict objectForKey<span style="color: #002200;">:</span>key<span style="color: #002200;">&#93;</span> forKey<span style="color: #002200;">:</span>key<span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>o autorelease<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> o;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Those methods again are called by custom convenience wrappers in the <a href="http://developer.apple.com/iPhone/library/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html">model classes</a> loosely following the <a href="http://martinfowler.com/eaaCatalog/activeRecord.html">ActiveRecord Pattern</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/12/coredata-generic-findmanybykey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSDateFormatter case sensitive trap</title>
		<link>http://blog.mro.name/2009/12/nsdateformatter-case-sensitive-trap/</link>
		<comments>http://blog.mro.name/2009/12/nsdateformatter-case-sensitive-trap/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 14:05:24 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[NSDateFormatter]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[SenTestingKit]]></category>
		<category><![CDATA[Unicode]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1427</guid>
		<description><![CDATA[Though NSDateFormatter behaves slightly different than documented, the following might even be correct, as strange as it might look (mind the last two lines): -&#40;void&#41;testNSDateFormatterTrap &#123; NSDateFormatter *lower = &#91;&#91;&#91;NSDateFormatter alloc&#93; init&#93; autorelease&#93;; lower.dateFormat = @&#34;yyyy-MM-dd HH:mm:SS ZZZ&#34;; &#160; NSDateFormatter *upper = &#91;&#91;&#91;NSDateFormatter alloc&#93; init&#93; autorelease&#93;; upper.dateFormat = @&#34;YYYY-MM-dd HH:mm:SS ZZZ&#34;; &#160; lower.timeZone = upper.timeZone [...]]]></description>
			<content:encoded><![CDATA[<p>Though <a href="http://blog.mro.name/2009/08/nsdateformatter-http-header/">NSDateFormatter behaves slightly different than documented</a>, the following might even be correct, as strange as it might look (mind the last two lines):</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>testNSDateFormatterTrap
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSDateFormatter</span> <span style="color: #002200;">*</span>lower <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDateFormatter</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
    lower.dateFormat <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;yyyy-MM-dd HH:mm:SS ZZZ&quot;</span>;
&nbsp;
    <span style="color: #400080;">NSDateFormatter</span> <span style="color: #002200;">*</span>upper <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDateFormatter</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
    upper.dateFormat <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;YYYY-MM-dd HH:mm:SS ZZZ&quot;</span>;
&nbsp;
    lower.timeZone <span style="color: #002200;">=</span> upper.timeZone <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTimeZone</span> timeZoneForSecondsFromGMT<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #400080;">NSDate</span> <span style="color: #002200;">*</span>d <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>lower dateFromString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;1970-01-01 00:00:00 +0000&quot;</span><span style="color: #002200;">&#93;</span>;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;1970-01-01 00:00:00 +0000&quot;</span>, <span style="color: #002200;">&#91;</span>lower stringFromDate<span style="color: #002200;">:</span>d<span style="color: #002200;">&#93;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;lower iso wrong&quot;</span><span style="color: #002200;">&#41;</span>;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;1970-01-01 00:00:00 +0000&quot;</span>, <span style="color: #002200;">&#91;</span>upper stringFromDate<span style="color: #002200;">:</span>d<span style="color: #002200;">&#93;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;upper iso wrong&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
    d <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>d addTimeInterval<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">60</span><span style="color: #002200;">*</span><span style="color: #2400d9;">60</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;1969-12-31 23:00:00 +0000&quot;</span>, <span style="color: #002200;">&#91;</span>lower stringFromDate<span style="color: #002200;">:</span>d<span style="color: #002200;">&#93;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;lower iso wrong&quot;</span><span style="color: #002200;">&#41;</span>;
    STAssertEqualObjects<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;1970-12-31 23:00:00 +0000&quot;</span>, <span style="color: #002200;">&#91;</span>upper stringFromDate<span style="color: #002200;">:</span>d<span style="color: #002200;">&#93;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;upper iso wrong&quot;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>The <a href="http://unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table">Unicode Format Pattern Documentation</a> explains the difference of the upper- and lowercase year format &#8211; but frankly I don&#8217;t get the &#8220;Year of week of year&#8221; idea.</p>
<p>But that subtracting one hour in fact <strong>adds almost a whole year</strong> &#8211; that&#8217;s odd to me.</p>
<p>So I rather stay away from the uppercase form &#8211; be it correct or buggy.</p>
<p>Seen with iPhone SDK 3.1.2 and XCode 3.2.1 on Snow Leopard.</p>
<p><strong>Update:</strong></p>
<p>I think I got it! Uppercase YYYY makes sense only in combination with a calendar week &#8211; and not months or quarters.</p>
<p>Look at January 1st 2010. It belongs to calendar week 53 of 2009. Week 1/2010 starts on Jan 4th.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/12/nsdateformatter-case-sensitive-trap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrade to Snow Leopard</title>
		<link>http://blog.mro.name/2009/11/upgrade-to-snow-leopard/</link>
		<comments>http://blog.mro.name/2009/11/upgrade-to-snow-leopard/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 21:58:42 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacPorts]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[SANE]]></category>
		<category><![CDATA[SenTestingKit]]></category>
		<category><![CDATA[Snow Leopard]]></category>
		<category><![CDATA[Twain]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1391</guid>
		<description><![CDATA[Mac OS X 10.6 Snow Leopard (partition 25G, HFS+ Journaled, Upper/Lower) Mac OS X 10.5 Leopard (partition 25G, HFS+ Journaled, Upper/Lower) partition userspace 100G, HFS+ Journaled, Upper/Lower $ cat /etc/fstab # mount partition &#34;userspace&#34; as /Users UUID=D016E3FD-E322-3006-A8F5-D2348C6A5B7B /Users hfs rw,auto create user &#8220;mig&#8221; TimeMachine restore Users + Settings delete user &#8220;mig&#8221; manually copy user &#8220;Shared&#8221; [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Mac OS X 10.6 Snow Leopard (partition 25G, HFS+ Journaled, Upper/Lower)</li>
<li>Mac OS X 10.5 Leopard (partition 25G, HFS+ Journaled, Upper/Lower)</li>
<li>partition userspace 100G, HFS+ Journaled, Upper/Lower

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fstab
<span style="color: #666666; font-style: italic;"># mount partition &quot;userspace&quot; as /Users</span>
<span style="color: #007800;">UUID</span>=D016E3FD-E322-<span style="color: #000000;">3006</span>-A8F5-D2348C6A5B7B	<span style="color: #000000; font-weight: bold;">/</span>Users	hfs	rw,auto</pre></div></div>

</li>
<li>create user &#8220;mig&#8221;</li>
<li>TimeMachine restore Users + Settings</li>
<li>delete user &#8220;mig&#8221;</li>
<li>manually copy user &#8220;Shared&#8221;</li>
<li>iPhone SDK 3.1.2 + XCode 3.2.1</li>
<li><a href="http://rentzsch.com/code/mogenerator_v1.5">modgenerator 1.5</a> plus <a href="http://aralbalkan.com/2152">trick</a>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>momc <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Xcode<span style="color: #000000; font-weight: bold;">/</span>Plug-ins<span style="color: #000000; font-weight: bold;">/</span>XDCoreDataModel.xdplugin<span style="color: #000000; font-weight: bold;">/</span>Contents<span style="color: #000000; font-weight: bold;">/</span>Resources<span style="color: #000000; font-weight: bold;">/</span>momc</pre></div></div>

</li>
<li><a href="http://code.google.com/p/git-osx-installer/">git 1.6.5.2</a>, manually add to <code>.bash_profile</code>:

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>bin</pre></div></div>

</li>
<li><a href="http://www.macports.org/install.php">Macports</a> / http://trac.macports.org/wiki/Migration

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> port selfupdate
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> port <span style="color: #c20cb9; font-weight: bold;">install</span> bcpp pwgen <span style="color: #c20cb9; font-weight: bold;">wget</span> lftp fortune optipng graphviz ragel imagemagick
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> port clean <span style="color: #660033;">--all</span> installed
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> port <span style="color: #660033;">-f</span> uninstall inactive</pre></div></div>

</li>
<li><a href="http://www.graphviz.org/Download_macos.php">graphviz-2.25.20091129.0545.pkg</a></li>
<li><a href="http://www.barebones.com/products/TextWrangler/">Textwrangler 3.0 (2538)</a></li>
<li><a href="http://gimp.lisanet.de/Website/Download.html">Gimp 2.6.7</a></li>
<li><a href="http://www.neooffice.org/neojava/de/mirrors.php?file=NeoOffice-3.0-Intel.dmg">NeoOffice 3.0.1</a></li>
<li><a href="http://www.evernote.com/about/intl/de/download/">Evernote 1.5.2 (62233)</a></li>
<li><a href="http://www.truecrypt.org/downloads">TrueCrypt 6.3a</a></li>
<li><a href="http://www.dropbox.com/">Dropbox v0.6.570</a></li>
<li><a href="http://skype.com/">Skype 2.8.0.722</a></li>
<li><a href="http://www.mozilla-europe.org/de/firefox/">Firefox 3.5,5</a></li>
<li><a href="http://www.getmiro.com/">Miro Video Player 2.5.3 (775f9134)</a></li>
<li><a href="http://sourceforge.net/projects/maxima/files/">wxMaxima-0.8.3 &amp; Maxima-5.19.2.dmg</a></li>
<li><a href="http://blog.mro.name/2008/12/scanner-mustek-1200-cu-unter-mac-os-x-105/">Twain SANE Scanner Support</a></li>
</ol>
<p>Remaining issues:</p>
<ol>
<li>SenTestingKit error highlighting not working.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/11/upgrade-to-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cute idea</title>
		<link>http://blog.mro.name/2009/11/cute-idea/</link>
		<comments>http://blog.mro.name/2009/11/cute-idea/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 10:43:43 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[screendesign]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[sync]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1384</guid>
		<description><![CDATA[to trigger a refresh &#8211; just pull down the list: Seen in NibiruTech Mobile RSS v1.2.]]></description>
			<content:encoded><![CDATA[<p>to trigger a refresh &#8211; just pull down the list:</p>
<p><a href="http://blog.mro.name/wp-content/uploads/2009/11/IMG_1223.PNG"><img class="aligncenter size-full wp-image-1385" title="IMG_1223" src="http://blog.mro.name/wp-content/uploads/2009/11/IMG_1223.PNG" alt="IMG_1223" width="320" height="480" /></a></p>
<p>Seen in <a href="http://www.nibirutech.com/product_MR.html">NibiruTech Mobile RSS v1.2</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/11/cute-idea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Filmfest iPhone App v1.0 online!</title>
		<link>http://blog.mro.name/2009/10/filmfest-iphone-app-v1-0-online/</link>
		<comments>http://blog.mro.name/2009/10/filmfest-iphone-app-v1-0-online/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 22:00:44 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Filmfest]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1345</guid>
		<description><![CDATA[After almost 6 weeks of eagerly waiting I found Filmfest 1.0 shows in the App Store. Didn&#8217;t get a confirmation / announcement mail but anyway, here it is:]]></description>
			<content:encoded><![CDATA[<p>After almost 6 weeks of eagerly waiting I found <a href="http://filmfestapp.com/">Filmfest 1.0</a> shows in the <a href="http://filmfestapp.com/go/appstore">App Store</a>. Didn&#8217;t get a confirmation / announcement mail but anyway, here it is:<br />
<a href="http://blog.mro.name/wp-content/uploads/2009/10/IMG_1119.PNG"><img class="size-full wp-image-1347  alignleft" title="IMG_1119" src="http://blog.mro.name/wp-content/uploads/2009/10/IMG_1119.PNG" alt="IMG_1119" width="320" height="480" /></a><a href="http://blog.mro.name/wp-content/uploads/2009/10/IMG_1118.PNG"><img class="size-full wp-image-1346  alignright" title="IMG_1118" src="http://blog.mro.name/wp-content/uploads/2009/10/IMG_1118.PNG" alt="IMG_1118" width="320" height="480" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/10/filmfest-iphone-app-v1-0-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CocoaTouch, CoreData and binary String Search</title>
		<link>http://blog.mro.name/2009/10/cocoatouch-coredata-and-binary-string-search/</link>
		<comments>http://blog.mro.name/2009/10/cocoatouch-coredata-and-binary-string-search/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 18:27:59 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Binary]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[CoreData]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[NSPredicate]]></category>
		<category><![CDATA[Objective C]]></category>
		<category><![CDATA[Search]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1321</guid>
		<description><![CDATA[The query optimiser for NSPredicate queries ontop CoreData/SQLite on the iPhone is a bit rudimentary (cough) and so I had to optimise myself to get binary-search enabled quick results: +&#40;NSPredicate*&#41;findBySearchTerm:&#40;NSString*&#41;rawTerm within:&#40;BOOL&#41;within context:&#40;NSManagedObjectContext*&#41;context &#123; NSSet *tokens = &#91;MovieM indexTokens:rawTerm&#93;; if&#40;tokens == nil &#124;&#124; tokens.count &#38;lt; = 0&#41; return &#91;NSPredicate predicateWithFormat:@&#34;FALSEPREDICATE&#34;&#93;; NSMutableArray *preds = &#91;NSMutableArray arrayWithCapacity:tokens.count&#93;; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://en.wikipedia.org/wiki/Query_optimizer">query optimiser</a> for <a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html">NSPredicate</a> queries ontop CoreData/SQLite on the iPhone is a bit rudimentary (cough) and so I had to optimise myself to get binary-search enabled quick results:</p>
<p><span id="more-1321"></span></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSPredicate</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>findBySearchTerm<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>rawTerm within<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>within context<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObjectContext</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>context
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span>tokens <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>MovieM indexTokens<span style="color: #002200;">:</span>rawTerm<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>tokens <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> || tokens.count <span style="color: #002200;">&amp;</span>lt; <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;FALSEPREDICATE&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>preds <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> arrayWithCapacity<span style="color: #002200;">:</span>tokens.count<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>within <span style="color: #002200;">==</span> <span style="color: #a61390;">NO</span> <span style="color: #002200;">&amp;</span>amp;<span style="color: #002200;">&amp;</span>amp; context <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">// As queries aren't optimised by default we do it ourselves:</span>
	<span style="color: #11740a; font-style: italic;">// 1st: find matching entries from the IndexKey table - leveraging it's index:</span>
        <span style="color: #400080;">NSFetchRequest</span> <span style="color: #002200;">*</span>fr <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFetchRequest</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
        fr.entity <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSEntityDescription</span> entityForName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;IndexKey&quot;</span> inManagedObjectContext<span style="color: #002200;">:</span>context<span style="color: #002200;">&#93;</span>;
        <span style="color: #400080;">NSMutableSet</span> <span style="color: #002200;">*</span>result <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
        <span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span>error <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
        <span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>token <span style="color: #a61390;">in</span> tokens<span style="color: #002200;">&#41;</span>
        <span style="color: #002200;">&#123;</span>
	    <span style="color: #11740a; font-style: italic;">// BETWEEN uses the table-index while BEGINSWITH does not:</span>
            fr.predicate <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;key BETWEEN {%@, %@}&quot;</span>, token, <span style="color: #002200;">&#91;</span>MovieM upperBoundSearchString<span style="color: #002200;">:</span>token<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
            <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>keys <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>context executeFetchRequest<span style="color: #002200;">:</span>fr error<span style="color: #002200;">:&amp;</span>amp;error<span style="color: #002200;">&#93;</span>;
            <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>error <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
                NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Oops: %@&quot;</span>, error<span style="color: #002200;">&#41;</span>;
	    <span style="color: #11740a; font-style: italic;">// turn IndexKey entries to movies (join up):</span>
            <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>movs <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>keys valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;movie&quot;</span><span style="color: #002200;">&#93;</span>;
	    <span style="color: #11740a; font-style: italic;">// aggregate the results for each token:</span>
            <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>result <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
                result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableSet</span> setWithArray<span style="color: #002200;">:</span>movs<span style="color: #002200;">&#93;</span>;
            <span style="color: #a61390;">else</span>
                <span style="color: #002200;">&#91;</span>result intersectSet<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSSet</span> setWithArray<span style="color: #002200;">:</span>movs<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#125;</span>
        <span style="color: #002200;">&#91;</span>fr release<span style="color: #002200;">&#93;</span>;
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;SELF IN %@&quot;</span>, result<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #400080;">NSPredicate</span> <span style="color: #002200;">*</span>template <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>within<span style="color: #002200;">&#41;</span>
        template <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ANY index.key CONTAiNS $searchTerm&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">else</span>
        template <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ANY index.key BEGINSWITH $searchTerm&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>token <span style="color: #a61390;">in</span> tokens<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span>params <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObject<span style="color: #002200;">:</span>token forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;searchTerm&quot;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>preds addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>template predicateWithSubstitutionVariables<span style="color: #002200;">:</span>params<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSCompoundPredicate</span> andPredicateWithSubpredicates<span style="color: #002200;">:</span>preds<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Helpers herein are</p>
<ul>
<li><code>[MovieM indexTokens:rawTerm]</code> folds diacritics and uppercase and cuts at whitespace or interpunction,</li>
<li><code>[MovieM upperBoundSearchString:token]</code> which was inspired by <a href="http://developer.apple.com/mac/library/samplecode/DerivedProperty/listing8.html">Apple Sample Code &#8220;DerivedProperty&#8221;</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/10/cocoatouch-coredata-and-binary-string-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>apns4j &#8211; look at the dark side of FOSS</title>
		<link>http://blog.mro.name/2009/10/apns4j-look-at-the-dark-side-of-foss/</link>
		<comments>http://blog.mro.name/2009/10/apns4j-look-at-the-dark-side-of-foss/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 22:53:36 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Articles in english]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[APNS]]></category>
		<category><![CDATA[apns4j]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Push]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1297</guid>
		<description><![CDATA[It&#8217;s either trivial or harder than it looks &#8211; (at least) four stalled projects named apns4j: http://sourceforge.net/projects/apns4j/ (zero files in svn) https://apns4j.dev.java.net/source/browse/apns4j/ (zero *.java in svn, same ownername as above) http://code.google.com/p/apns4j/ (zero files in svn, same ownername as above) http://github.com/netmask/apns4j (three commits) I didn&#8217;t look closer &#8211; maybe the last was gifted with a mature [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s either trivial or harder than it looks &#8211; (at least) four stalled projects named apns4j:</p>
<ul>
<li><a href="http://sourceforge.net/projects/apns4j/">http://sourceforge.net/projects/apns4j/</a> (zero files in svn)</li>
<li><a href="https://apns4j.dev.java.net/source/browse/apns4j/">https://apns4j.dev.java.net/source/browse/apns4j/</a> (zero *.java in svn, same ownername as above)</li>
<li><a href="http://code.google.com/p/apns4j/">http://code.google.com/p/apns4j/</a> (zero files in svn, same ownername as above)</li>
<li><a href="http://github.com/netmask/apns4j">http://github.com/netmask/apns4j</a> (three commits)</li>
</ul>
<p>I didn&#8217;t look closer &#8211; maybe the last was gifted with a mature birth. The first three look like the project got stuck in choosing it&#8217;s hoster.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/10/apns4j-look-at-the-dark-side-of-foss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Screenshots für den App Store</title>
		<link>http://blog.mro.name/2009/09/screenshots-fur-den-app-store/</link>
		<comments>http://blog.mro.name/2009/09/screenshots-fur-den-app-store/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 08:24:05 +0000</pubDate>
		<dc:creator>mro</dc:creator>
				<category><![CDATA[Artikel auf deutsch]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[ImageMagick]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.mro.name/?p=1287</guid>
		<description><![CDATA[Der App Store möchte gerne Screenshots ohne Statuszeile und im TIFF Format. Da das immer gleich sein soll bietet sich ImageMagick an: convert MyScreenshot.png -compress None -crop '320x460-0+20' MyScreenshot.tiff]]></description>
			<content:encoded><![CDATA[<p>Der App Store möchte gerne Screenshots ohne Statuszeile und im TIFF Format. Da das immer gleich sein soll bietet sich <a href="http://www.imagemagick.org/">ImageMagick</a> an:</p>
<pre>
convert MyScreenshot.png -compress None -crop '320x460-0+20' MyScreenshot.tiff
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.mro.name/2009/09/screenshots-fur-den-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
